From 7192932022510d830d1fc2373a9edb80fee24f48 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Tue, 8 Sep 2015 09:46:57 +1200 Subject: [PATCH 1/5] [ss-2015-015]: Fix insecure returnURL in DatabaseAdmin --- model/DatabaseAdmin.php | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/model/DatabaseAdmin.php b/model/DatabaseAdmin.php index 94b0c37a9..541ddc807 100644 --- a/model/DatabaseAdmin.php +++ b/model/DatabaseAdmin.php @@ -90,17 +90,37 @@ class DatabaseAdmin extends Controller { // Get all our classes SS_ClassLoader::instance()->getManifest()->regenerate(); - if(isset($_GET['returnURL'])) { + $url = $this->getReturnURL(); + if($url) { echo "

Setting up the database; you will be returned to your site shortly....

"; $this->doBuild(true); echo "

Done!

"; - $this->redirect($_GET['returnURL']); + $this->redirect($url); } else { - $this->doBuild(isset($_REQUEST['quiet']) || isset($_REQUEST['from_installer']), - !isset($_REQUEST['dont_populate'])); + $quiet = $this->request->requestVar('quiet') !== null; + $fromInstaller = $this->request->requestVar('from_installer') !== null; + $populate = $this->request->requestVar('dont_populate') === null; + $this->doBuild($quiet || $fromInstaller, $populate); } } + /** + * Gets the url to return to after build + * + * @return string|null + */ + protected function getReturnURL() { + $url = $this->request->getVar('returnURL'); + + // Check that this url is a site url + if(empty($url) || !Director::is_site_url($url)) { + return null; + } + + // Convert to absolute URL + return Director::absoluteURL($url, true); + } + /** * Check if database needs to be built, and build it if it does. */ From d8fd64c3e25dbf500615ecbbe9580e234e1730d4 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Tue, 8 Sep 2015 10:04:21 +1200 Subject: [PATCH 2/5] [ss-2015-016]: Fix XSS in install.php --- dev/install/config-form.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/install/config-form.html b/dev/install/config-form.html index dd36e1543..0b12f14e2 100644 --- a/dev/install/config-form.html +++ b/dev/install/config-form.html @@ -202,14 +202,14 @@
- > + >
- > + >
From 45b22c788eeb5d7501844ceb19395cc4e15e61b6 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Mon, 7 Sep 2015 17:38:29 +1200 Subject: [PATCH 3/5] BUG Fix missing framework/admin/tests --- .travis.yml | 1 + admin/tests/LeftAndMainTest.php | 46 ++++++++++++++++++++++++++------- model/Hierarchy.php | 2 +- 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index cffd4265c..5974b62be 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,6 +40,7 @@ before_script: script: - "if [ \"$BEHAT_TEST\" = \"\" ]; then vendor/bin/phpunit framework/tests; fi" + - "if [ \"$BEHAT_TEST\" = \"\" ]; then vendor/bin/phpunit framework/admin/tests; fi" - "if [ \"$BEHAT_TEST\" = \"1\" ]; then vendor/bin/behat @framework; fi" after_failure: diff --git a/admin/tests/LeftAndMainTest.php b/admin/tests/LeftAndMainTest.php index b7a1b807e..f1d53eae2 100644 --- a/admin/tests/LeftAndMainTest.php +++ b/admin/tests/LeftAndMainTest.php @@ -17,7 +17,7 @@ class LeftAndMainTest extends FunctionalTest { // @todo fix controller stack problems and re-activate //$this->autoFollowRedirection = false; - CMSMenu::populate_menu(); + $this->resetMenu(); $this->backupCss = Config::inst()->get('LeftAndMain', 'extra_requirements_css'); $this->backupJs = Config::inst()->get('LeftAndMain', 'extra_requirements_javascript'); @@ -34,6 +34,23 @@ class LeftAndMainTest extends FunctionalTest { Requirements::set_combined_files_enabled(false); } + /** + * Clear menu to default state as per LeftAndMain::init() + */ + protected function resetMenu() { + CMSMenu::clear_menu(); + CMSMenu::populate_menu(); + CMSMenu::add_link( + 'Help', + _t('LeftAndMain.HELP', 'Help', 'Menu title'), + LeftAndMain::config()->help_link, + -2, + array( + 'target' => '_blank' + ) + ); + } + public function tearDown() { parent::tearDown(); @@ -127,13 +144,14 @@ class LeftAndMainTest extends FunctionalTest { public function testLeftAndMainSubclasses() { $adminuser = $this->objFromFixture('Member','admin'); $this->session()->inst_set('loggedInAs', $adminuser->ID); - - $menuItems = singleton('LeftAndMain')->MainMenu(); + + $this->resetMenu(); + $menuItems = singleton('LeftAndMain')->MainMenu(false); foreach($menuItems as $menuItem) { $link = $menuItem->Link; // don't test external links - if(preg_match('/^https?:\/\//',$link)) continue; + if(preg_match('/^(https?:)?\/\//',$link)) continue; $response = $this->get($link); @@ -157,6 +175,7 @@ class LeftAndMainTest extends FunctionalTest { // anonymous user $this->session()->inst_set('loggedInAs', null); + $this->resetMenu(); $menuItems = singleton('LeftAndMain')->MainMenu(false); $this->assertEquals( array_map($allValsFn, $menuItems->column('Code')), @@ -165,18 +184,24 @@ class LeftAndMainTest extends FunctionalTest { ); // restricted cms user - $this->session()->inst_set('loggedInAs', $securityonlyuser->ID); + $this->logInAs($securityonlyuser); + $this->resetMenu(); $menuItems = singleton('LeftAndMain')->MainMenu(false); $this->assertEquals( array_map($allValsFn, $menuItems->column('Code')), - array('SecurityAdmin','Help'), + array('CMSProfileController', 'SecurityAdmin','Help'), 'Groups with limited access can only access the interfaces they have permissions for' ); // all cms sections user - $this->session()->inst_set('loggedInAs', $allcmssectionsuser->ID); + $this->logInAs($allcmssectionsuser); + $this->resetMenu(); $menuItems = singleton('LeftAndMain')->MainMenu(false); - $this->assertContains('SecurityAdmin', + $this->assertContains('CMSProfileController', + array_map($allValsFn, $menuItems->column('Code')), + 'Group with CMS_ACCESS_LeftAndMain permission can edit own profile' + ); + $this->assertContains('SecurityAdmin', array_map($allValsFn, $menuItems->column('Code')), 'Group with CMS_ACCESS_LeftAndMain permission can access all sections' ); @@ -186,7 +211,8 @@ class LeftAndMainTest extends FunctionalTest { ); // admin - $this->session()->inst_set('loggedInAs', $adminuser->ID); + $this->logInAs($adminuser); + $this->resetMenu(); $menuItems = singleton('LeftAndMain')->MainMenu(false); $this->assertContains( 'SecurityAdmin', @@ -265,6 +291,8 @@ class LeftAndMainTest_Object extends DataObject implements TestOnly { 'URLSegment' => 'Varchar', 'Sort' => 'Int', ); + + private static $default_sort = '"Sort"'; private static $extensions = array( 'Hierarchy' diff --git a/model/Hierarchy.php b/model/Hierarchy.php index 638d2204b..e440a26f8 100644 --- a/model/Hierarchy.php +++ b/model/Hierarchy.php @@ -732,7 +732,7 @@ class Hierarchy extends DataExtension { $children = $baseClass::get() ->filter('ParentID', (int)$this->owner->ID) - ->sort('Sort', 'ASC'); + ->sort('"Sort"', 'ASC'); if ($afterNode) { $children = $children->filter('Sort:GreaterThan', $afterNode->Sort); } From 7367cf54c4069a8e296fafb511fb28e27a8efd7e Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Mon, 7 Sep 2015 13:44:16 +1200 Subject: [PATCH 4/5] [ss-2015-020]: Prevent possible Privilege escalation --- security/Member.php | 65 +++++++++++++++--- security/Security.php | 6 +- tests/model/DataListTest.php | 12 ++-- tests/model/DataObjectTest.php | 1 + tests/security/MemberTest.php | 73 ++++++++++++++++++++- tests/security/SecurityDefaultAdminTest.php | 8 ++- 6 files changed, 148 insertions(+), 17 deletions(-) diff --git a/security/Member.php b/security/Member.php index 1fd308cb7..fa19ff2de 100644 --- a/security/Member.php +++ b/security/Member.php @@ -254,7 +254,11 @@ class Member extends DataObject implements TemplateGlobalProvider { // Ensure this user is in the admin group if(!$admin->inGroup($adminGroup)) { - $admin->Groups()->add($adminGroup); + // Add member to group instead of adding group to member + // This bypasses the privilege escallation code in Member_GroupSet + $adminGroup + ->DirectMembers() + ->add($admin); } return $admin; @@ -890,27 +894,30 @@ class Member extends DataObject implements TemplateGlobalProvider { public function onAfterWrite() { parent::onAfterWrite(); + Permission::flush_permission_cache(); + if($this->isChanged('Password')) { MemberPassword::log($this); } } /** + * Filter out admin groups to avoid privilege escalation, * If any admin groups are requested, deny the whole save operation. * * @param Array $ids Database IDs of Group records - * @return boolean + * @return boolean True if the change can be accepted */ public function onChangeGroups($ids) { - // Filter out admin groups to avoid privilege escalation, // unless the current user is an admin already OR the logged in user is an admin - if(!(Permission::check('ADMIN') || Permission::checkMember($this, 'ADMIN'))) { - $adminGroups = Permission::get_groups_by_permission('ADMIN'); - $adminGroupIDs = ($adminGroups) ? $adminGroups->column('ID') : array(); - return count(array_intersect($ids, $adminGroupIDs)) == 0; - } else { + if(Permission::check('ADMIN') || Permission::checkMember($this, 'ADMIN')) { return true; } + + // If there are no admin groups in this set then it's ok + $adminGroups = Permission::get_groups_by_permission('ADMIN'); + $adminGroupIDs = ($adminGroups) ? $adminGroups->column('ID') : array(); + return count(array_intersect($ids, $adminGroupIDs)) == 0; } @@ -1147,6 +1154,7 @@ class Member extends DataObject implements TemplateGlobalProvider { * Use {@link DirectGroups()} to only retrieve the group relations without inheritance. * * @todo Push all this logic into Member_GroupSet's getIterator()? + * @return Member_Groupset */ public function Groups() { $groups = Member_GroupSet::create('Group', 'Group_Members', 'GroupID', 'MemberID'); @@ -1657,6 +1665,47 @@ class Member_GroupSet extends ManyManyList { public function foreignIDWriteFilter($id = null) { return parent::foreignIDFilter($id); } + + public function add($item, $extraFields = null) { + // Get Group.ID + $itemID = null; + if(is_numeric($item)) { + $itemID = $item; + } else if($item instanceof Group) { + $itemID = $item->ID; + } + + // Check if this group is allowed to be added + if($this->canAddGroups(array($itemID))) { + parent::add($item, $extraFields); + } + } + + /** + * Determine if the following groups IDs can be added + * + * @param array $itemIDs + * @return boolean + */ + protected function canAddGroups($itemIDs) { + if(empty($itemIDs)) { + return true; + } + $member = $this->getMember(); + return empty($member) || $member->onChangeGroups($itemIDs); + } + + /** + * Get foreign member record for this relation + * + * @return Member + */ + protected function getMember() { + $id = $this->getForeignID(); + if($id) { + return DataObject::get_by_id('Member', $id); + } + } } /** diff --git a/security/Security.php b/security/Security.php index 1033fbe99..f18f8e125 100644 --- a/security/Security.php +++ b/security/Security.php @@ -767,7 +767,11 @@ class Security extends Controller { $member = Member::create(); $member->FirstName = _t('Member.DefaultAdminFirstname', 'Default Admin'); $member->write(); - $member->Groups()->add($adminGroup); + // Add member to group instead of adding group to member + // This bypasses the privilege escallation code in Member_GroupSet + $adminGroup + ->DirectMembers() + ->add($member); } return $member; diff --git a/tests/model/DataListTest.php b/tests/model/DataListTest.php index faf9b353b..a30bc2209 100755 --- a/tests/model/DataListTest.php +++ b/tests/model/DataListTest.php @@ -156,7 +156,8 @@ class DataListTest extends SapphireTest { . ' "DataObjectTest_TeamComment"."Comment", "DataObjectTest_TeamComment"."TeamID",' . ' "DataObjectTest_TeamComment"."ID", CASE WHEN "DataObjectTest_TeamComment"."ClassName" IS NOT NULL' . ' THEN "DataObjectTest_TeamComment"."ClassName" ELSE '.$db->prepStringForDB('DataObjectTest_TeamComment') - . ' END AS "RecordClassName" FROM "DataObjectTest_TeamComment"'; + . ' END AS "RecordClassName" FROM "DataObjectTest_TeamComment"' + . ' ORDER BY "DataObjectTest_TeamComment"."Name" ASC'; $this->assertEquals($expected, $list->sql()); } @@ -176,7 +177,8 @@ class DataListTest extends SapphireTest { . ' "DataObjectTest_TeamComment"."ID", CASE WHEN "DataObjectTest_TeamComment"."ClassName" IS NOT NULL' . ' THEN "DataObjectTest_TeamComment"."ClassName" ELSE '.$db->prepStringForDB('DataObjectTest_TeamComment') . ' END AS "RecordClassName" FROM "DataObjectTest_TeamComment" INNER JOIN "DataObjectTest_Team" AS "Team"' - . ' ON "DataObjectTest_Team"."ID" = "DataObjectTest_TeamComment"."TeamID"'; + . ' ON "DataObjectTest_Team"."ID" = "DataObjectTest_TeamComment"."TeamID"' + . ' ORDER BY "DataObjectTest_TeamComment"."Name" ASC'; $this->assertEquals($expected, $list->sql()); } @@ -197,7 +199,8 @@ class DataListTest extends SapphireTest { . ' "DataObjectTest_TeamComment"."ID", CASE WHEN "DataObjectTest_TeamComment"."ClassName" IS NOT NULL' . ' THEN "DataObjectTest_TeamComment"."ClassName" ELSE '.$db->prepStringForDB('DataObjectTest_TeamComment') . ' END AS "RecordClassName" FROM "DataObjectTest_TeamComment" LEFT JOIN "DataObjectTest_Team" AS "Team"' - . ' ON "DataObjectTest_Team"."ID" = "DataObjectTest_TeamComment"."TeamID"'; + . ' ON "DataObjectTest_Team"."ID" = "DataObjectTest_TeamComment"."TeamID"' + . ' ORDER BY "DataObjectTest_TeamComment"."Name" ASC'; $this->assertEquals($expected, $list->sql()); @@ -220,7 +223,8 @@ class DataListTest extends SapphireTest { . 'ELSE ' . $db->prepStringForDB('DataObjectTest_TeamComment') . ' END AS "RecordClassName" ' . 'FROM "DataObjectTest_TeamComment" ' . 'LEFT JOIN "DataObjectTest\NamespacedClass" ON ' - . '"DataObjectTest\NamespacedClass"."ID" = "DataObjectTest_TeamComment"."ID"'; + . '"DataObjectTest\NamespacedClass"."ID" = "DataObjectTest_TeamComment"."ID"' + . ' ORDER BY "DataObjectTest_TeamComment"."Name" ASC'; $this->assertEquals($expected, $list->sql(), 'Retains backslashes in namespaced classes'); } diff --git a/tests/model/DataObjectTest.php b/tests/model/DataObjectTest.php index 73fbe33ec..e967e5fad 100644 --- a/tests/model/DataObjectTest.php +++ b/tests/model/DataObjectTest.php @@ -1521,6 +1521,7 @@ class DataObjectTest_TeamComment extends DataObject { 'Team' => 'DataObjectTest_Team' ); + private static $default_sort = '"Name" ASC'; } class DataObjectTest_ExtendedTeamComment extends DataObjectTest_TeamComment { diff --git a/tests/security/MemberTest.php b/tests/security/MemberTest.php index f058a755f..36554dba9 100644 --- a/tests/security/MemberTest.php +++ b/tests/security/MemberTest.php @@ -579,7 +579,6 @@ class MemberTest extends FunctionalTest { public function testOnChangeGroups() { $staffGroup = $this->objFromFixture('Group', 'staffgroup'); - $adminGroup = $this->objFromFixture('Group', 'admingroup'); $staffMember = $this->objFromFixture('Member', 'staffmember'); $adminMember = $this->objFromFixture('Member', 'admin'); $newAdminGroup = new Group(array('Title' => 'newadmin')); @@ -587,7 +586,7 @@ class MemberTest extends FunctionalTest { Permission::grant($newAdminGroup->ID, 'ADMIN'); $newOtherGroup = new Group(array('Title' => 'othergroup')); $newOtherGroup->write(); - + $this->assertTrue( $staffMember->onChangeGroups(array($staffGroup->ID)), 'Adding existing non-admin group relation is allowed for non-admin members' @@ -614,6 +613,76 @@ class MemberTest extends FunctionalTest { ); } + /** + * Test Member_GroupSet::add + */ + public function testOnChangeGroupsByAdd() { + $staffMember = $this->objFromFixture('Member', 'staffmember'); + $adminMember = $this->objFromFixture('Member', 'admin'); + + // Setup new admin group + $newAdminGroup = new Group(array('Title' => 'newadmin')); + $newAdminGroup->write(); + Permission::grant($newAdminGroup->ID, 'ADMIN'); + + // Setup non-admin group + $newOtherGroup = new Group(array('Title' => 'othergroup')); + $newOtherGroup->write(); + + // Test staff can be added to other group + $this->assertFalse($staffMember->inGroup($newOtherGroup)); + $staffMember->Groups()->add($newOtherGroup); + $this->assertTrue( + $staffMember->inGroup($newOtherGroup), + 'Adding new non-admin group relation is allowed for non-admin members' + ); + + // Test staff member can't be added to admin groups + $this->assertFalse($staffMember->inGroup($newAdminGroup)); + $staffMember->Groups()->add($newAdminGroup); + $this->assertFalse( + $staffMember->inGroup($newAdminGroup), + 'Adding new admin group relation is not allowed for non-admin members' + ); + + // Test staff member can be added to admin group by admins + $this->logInAs($adminMember); + $staffMember->Groups()->add($newAdminGroup); + $this->assertTrue( + $staffMember->inGroup($newAdminGroup), + 'Adding new admin group relation is allowed for normal users, when granter is logged in as admin' + ); + + // Test staff member can be added if they are already admin + $this->session()->inst_set('loggedInAs', null); + $this->assertFalse($adminMember->inGroup($newAdminGroup)); + $adminMember->Groups()->add($newAdminGroup); + $this->assertTrue( + $adminMember->inGroup($newAdminGroup), + 'Adding new admin group relation is allowed for admin members' + ); + } + + /** + * Test Member_GroupSet::add + */ + public function testOnChangeGroupsBySetIDList() { + $staffMember = $this->objFromFixture('Member', 'staffmember'); + + // Setup new admin group + $newAdminGroup = new Group(array('Title' => 'newadmin')); + $newAdminGroup->write(); + Permission::grant($newAdminGroup->ID, 'ADMIN'); + + // Test staff member can't be added to admin groups + $this->assertFalse($staffMember->inGroup($newAdminGroup)); + $staffMember->Groups()->setByIDList(array($newAdminGroup->ID)); + $this->assertFalse( + $staffMember->inGroup($newAdminGroup), + 'Adding new admin group relation is not allowed for non-admin members' + ); + } + /** * Test that extensions using updateCMSFields() are applied correctly */ diff --git a/tests/security/SecurityDefaultAdminTest.php b/tests/security/SecurityDefaultAdminTest.php index 738722233..4f1c1db06 100644 --- a/tests/security/SecurityDefaultAdminTest.php +++ b/tests/security/SecurityDefaultAdminTest.php @@ -1,6 +1,8 @@ defaultPassword = Security::default_admin_password(); Security::clear_default_admin(); Security::setDefaultAdmin('admin', 'password'); + Permission::flush_permission_cache(); } public function tearDown() { Security::setDefaultAdmin($this->defaultUsername, $this->defaultPassword); + Permission::flush_permission_cache(); parent::tearDown(); } @@ -42,9 +46,9 @@ class SecurityDefaultAdminTest extends SapphireTest { public function testFindAnAdministratorCreatesNewUser() { $adminMembers = Permission::get_members_by_permission('ADMIN'); $this->assertEquals(0, $adminMembers->count()); - + $admin = Security::findAnAdministrator(); - + $this->assertInstanceOf('Member', $admin); $this->assertTrue(Permission::checkMember($admin, 'ADMIN')); $this->assertEquals($admin->Email, Security::default_admin_username()); From 00caeb700dc0a291087b92f0499980e5cded0f4d Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Tue, 15 Sep 2015 10:33:26 +1200 Subject: [PATCH 5/5] Added 3.1.14 changelog Update translations --- admin/code/GroupImportForm.php | 25 +++++++++-------- admin/code/MemberImportForm.php | 23 ++++++++-------- docs/en/04_Changelogs/3.1.14.md | 49 +++++++++++++++++++++++++++++++++ lang/af.yml | 1 - lang/ar.yml | 2 -- lang/cs.yml | 4 --- lang/de.yml | 4 --- lang/en.yml | 8 +++--- lang/eo.yml | 3 -- lang/es.yml | 4 --- lang/et_EE.yml | 1 - lang/fi.yml | 3 -- lang/fr.yml | 2 -- lang/id.yml | 3 -- lang/id_ID.yml | 3 -- lang/it.yml | 4 --- lang/ja.yml | 2 -- lang/lt.yml | 6 ---- lang/mi.yml | 2 -- lang/nb.yml | 2 -- lang/nl.yml | 2 -- lang/pl.yml | 2 -- lang/ru.yml | 2 -- lang/sk.yml | 4 --- lang/sr.yml | 2 -- lang/sr@latin.yml | 2 -- lang/sr_RS.yml | 2 -- lang/sr_RS@latin.yml | 2 -- lang/sv.yml | 3 -- lang/zh.yml | 2 -- 30 files changed, 78 insertions(+), 96 deletions(-) create mode 100644 docs/en/04_Changelogs/3.1.14.md diff --git a/admin/code/GroupImportForm.php b/admin/code/GroupImportForm.php index a544e8373..fdba2db91 100644 --- a/admin/code/GroupImportForm.php +++ b/admin/code/GroupImportForm.php @@ -22,18 +22,19 @@ class GroupImportForm extends Form { . ' Show advanced usage

' ); $helpHtml .= _t( - 'GroupImportForm.Help2', -'
-

Advanced usage

-
    -
  • Allowed columns: %s
  • -
  • Existing groups are matched by their unique Code value, and updated with any new values from the - imported file
  • -
  • Group hierarchies can be created by using a ParentCode column.
  • -
  • Permission codes can be assigned by the PermissionCode column. Existing permission codes are not - cleared.
  • -
-
'); + 'GroupImportForm.Help2', + '
' + . '

Advanced usage

' + . '
    ' + . '
  • Allowed columns: %s
  • ' + . '
  • Existing groups are matched by their unique Code value, and updated with any new values from the ' + . 'imported file
  • ' + . '
  • Group hierarchies can be created by using a ParentCode column.
  • ' + . '
  • Permission codes can be assigned by the PermissionCode column. Existing permission codes are not ' + . 'cleared.
  • ' + . '
' + . '
' + ); $importer = new GroupCsvBulkLoader(); $importSpec = $importer->getImportSpec(); diff --git a/admin/code/MemberImportForm.php b/admin/code/MemberImportForm.php index 02e5d73f3..11cfc0565 100644 --- a/admin/code/MemberImportForm.php +++ b/admin/code/MemberImportForm.php @@ -22,17 +22,18 @@ class MemberImportForm extends Form { . ' Show advanced usage

' ); $helpHtml .= _t( - 'MemberImportForm.Help2', -'
-

Advanced usage

-
    -
  • Allowed columns: %s
  • -
  • Existing users are matched by their unique Code property, and updated with any new values from - the imported file.
  • -
  • Groups can be assigned by the Groups column. Groups are identified by their Code property, - multiple groups can be separated by comma. Existing group memberships are not cleared.
  • -
-
'); + 'MemberImportForm.Help2', + '
' + . '

Advanced usage

' + . '
    ' + . '
  • Allowed columns: %s
  • ' + . '
  • Existing users are matched by their unique Code property, and updated with any new values from ' + . 'the imported file.
  • ' + . '
  • Groups can be assigned by the Groups column. Groups are identified by their Code property, ' + . 'multiple groups can be separated by comma. Existing group memberships are not cleared.
  • ' + . '
' + . '
' + ); $importer = new MemberCsvBulkLoader(); $importSpec = $importer->getImportSpec(); diff --git a/docs/en/04_Changelogs/3.1.14.md b/docs/en/04_Changelogs/3.1.14.md new file mode 100644 index 000000000..99c5d4269 --- /dev/null +++ b/docs/en/04_Changelogs/3.1.14.md @@ -0,0 +1,49 @@ +# 3.1.14 + + + +## Change Log + +### Security + + * 2015-09-07 [d8fd64c](https://github.com/silverstripe/silverstripe-framework/commit/d8fd64c3e25dbf500615ecbbe9580e234e1730d4) Fix XSS in install.php (Damian Mooyman) - See [ss-2015-016](http://www.silverstripe.org/software/download/security-releases/ss-2015-016) + * 2015-09-07 [7192932](https://github.com/silverstripe/silverstripe-framework/commit/7192932022510d830d1fc2373a9edb80fee24f48) Fix insecure returnURL in DatabaseAdmin (Damian Mooyman) - See [ss-2015-015](http://www.silverstripe.org/software/download/security-releases/ss-2015-015) + * 2015-09-07 [7367cf5](https://github.com/silverstripe/silverstripe-framework/commit/7367cf54c4069a8e296fafb511fb28e27a8efd7e) Prevent possible Privilege escalation (Damian Mooyman) - See [ss-2015-020](http://www.silverstripe.org/software/download/security-releases/ss-2015-020) + +### API Changes + + * 2015-01-28 [782c4cb](https://github.com/silverstripe/silverstripe-framework/commit/782c4cbf6f5cde2fa4d45cdbd17552773a67f88f) Enable single-column fulltext filter search as fallback (Damian Mooyman) + +### Bugfixes + + * 2015-09-07 [45b22c7](https://github.com/silverstripe/silverstripe-framework/commit/45b22c788eeb5d7501844ceb19395cc4e15e61b6) Fix missing framework/admin/tests (Damian Mooyman) + * 2015-08-27 [899eb0b](https://github.com/silverstripe/silverstripe-framework/commit/899eb0b235859c843890c790e99c03f4fd4b825c) Use complete fieldlist for extracting data (Daniel Hensby) + * 2015-08-26 [2d4b743](https://github.com/silverstripe/silverstripe-framework/commit/2d4b743090935e7c10bd95e00398df7bfb5763af) Members can access their own profiles in CMS (Daniel Hensby) + * 2015-08-26 [0943b3b](https://github.com/silverstripe/silverstripe-framework/commit/0943b3b1a06e6c9130500532fd979c720b65c761) Recursion errors when sorting objects with circular dependencies (fixes #4464) (Loz Calver) + * 2015-08-20 [fc212e0](https://github.com/silverstripe/silverstripe-framework/commit/fc212e030c474d966ffb1821423ddcb3ae361b72) Fix illegalExtensions breaking tests. (Damian Mooyman) + * 2015-08-18 [8b638f5](https://github.com/silverstripe/silverstripe-framework/commit/8b638f56fb737dac18126c291297c87469eb7d0f) Using undefined var in ModelAdmin (Loz Calver) + * 2015-07-26 [5f5ce8a](https://github.com/silverstripe/silverstripe-framework/commit/5f5ce8a82c2bb1a29f9f8b7011d5cd990c34f128) Disable cache to prevent caching of build target (Damian Mooyman) + * 2015-07-16 [a3201d6](https://github.com/silverstripe/silverstripe-framework/commit/a3201d6ed9967179aa020802e6fb88d2a6a0e37e) $callerClass is undefined (Christopher Darling) + * 2015-07-08 [c7bd504](https://github.com/silverstripe/silverstripe-framework/commit/c7bd50427a4e0ad446502547b81648d78d354062) Fix cookie errors when running in CLI (Damian Mooyman) + * 2015-07-07 [5ace490](https://github.com/silverstripe/silverstripe-framework/commit/5ace4905c90be1373f49dbb0e1a579b279786a1c) Fix issue when SS_ALLOWED_HOSTS is run in CLI (Damian Mooyman) + * 2015-07-05 [a556b48](https://github.com/silverstripe/silverstripe-framework/commit/a556b4854a44b9dfe86c40140ec03d781d354d19) Fix of multiple i18nTextCollector issues: #3797, #3798, #3417 (Damian Mooyman) + * 2015-07-01 [6fabd01](https://github.com/silverstripe/silverstripe-framework/commit/6fabd0122be37faa671923b534a74e5684d58220) Fix potential XSS injection (Damian Mooyman) + * 2015-06-26 [d78d325](https://github.com/silverstripe/silverstripe-cms/commit/d78d3250736c5d2f48c5cfc1690fba8b98cc222b) RedirectorPage_Controller shouldn't attempt redirection if the response is finished (fixes #1230) (Loz Calver) + * 2015-06-18 [f7f92b3](https://github.com/silverstripe/silverstripe-installer/commit/f7f92b32260f31a5969dde4b1d8c55d81c289056) Invalid comment syntax for web.config (Daniel Hensby) + * 2015-06-16 [6169bf2](https://github.com/silverstripe/silverstripe-framework/commit/6169bf2760366b0aebf255c973803621472ce1fb) No longer caching has_one after ID change (Daniel Hensby) + * 2015-06-11 [6be0488](https://github.com/silverstripe/silverstripe-framework/commit/6be04887315522e5b95b83be1e301691441b985c) TreeDropdownField doesnt change label on unselect (Daniel Hensby) + * 2015-05-28 [0319f78](https://github.com/silverstripe/silverstripe-framework/commit/0319f7855bc4e8a6eb71d2766ac24a7d760d502e) Incorrect env setting in 3.1.13 (Damian Mooyman) + * 2015-05-22 [e0710ae](https://github.com/silverstripe/silverstripe-framework/commit/e0710ae4e4a03c191b841cc45a6c103a0e21ec7f) Fix DirectorTest failing when run with sake (Damian Mooyman) + * 2015-05-20 [94f6a13](https://github.com/silverstripe/silverstripe-framework/commit/94f6a137297d6638065583c388dffeeb9eccb55b) Fixed setting LastEdited for DataObject with class ancestry (Gregory Smirnov) + * 2015-05-20 [869e69a](https://github.com/silverstripe/silverstripe-framework/commit/869e69a9b2c1352e1fa6246432d9180eb81cf7e3) Clicking icon in site tree link fails (Jonathon Menz) + * 2015-05-20 [f9bdf61](https://github.com/silverstripe/silverstripe-framework/commit/f9bdf61b6f4cdd2f55ff2729a5b6be0a200f876a) Fixed handling of numbers in certain locales (Gregory Smirnov) + * 2015-05-19 [dbe2ad4](https://github.com/silverstripe/silverstripe-cms/commit/dbe2ad4f9fe818fe21755eff2ecf8d359c578736) Folder expansion icons (Jonathon Menz) + * 2015-05-19 [a56d08b](https://github.com/silverstripe/silverstripe-framework/commit/a56d08b1aeeb0a2dfc16e134ddc3bd7b699bd606) TreeDropdownField Folder expansion (Jonathon Menz) + * 2015-05-16 [c6bcfea](https://github.com/silverstripe/silverstripe-framework/commit/c6bcfea3e36a4211d2f69ff5c73db2fcab474ba8) FieldList::changeFieldOrder() leftovers discarded (Jonathon Menz) + * 2015-05-04 [1cca37c](https://github.com/silverstripe/silverstripe-framework/commit/1cca37c9082ef53f02633d1bdac27f4a815d4208) File::getFileType() was case sensitive (fixes #3631) (Loz Calver) + * 2015-04-01 [7ff131d](https://github.com/silverstripe/silverstripe-framework/commit/7ff131daa76d345cff90410469accdcca9049cf1) Fix default casted (boolean)false evaluating to true in templates (Damian Mooyman) + * 2014-12-31 [71a14c3](https://github.com/silverstripe/silverstripe-framework/commit/71a14c30352e69e4c0ac59e5ea72e1da0c79009b) Prevent url= querystring argument override (Damian Mooyman) + * 2014-10-25 [28be51c](https://github.com/silverstripe/silverstripe-framework/commit/28be51cab0b567b692632503e0f440d30a2fe09e) Config state leaking between unit tests (Loz Calver) + * 2014-09-20 [bbc1cb8](https://github.com/silverstripe/silverstripe-framework/commit/bbc1cb82702b678b21bef15394f067c146e47625) #3458 iframe transport multi file upload FIX #3343, FIX #3148 (Thierry François) + * 2014-05-25 [40c5b8b](https://github.com/silverstripe/silverstripe-framework/commit/40c5b8b6758676a3e2a5daf3c438a7720c49baaf) FulltextFilter did not work and was not usable (micmania1) + * 2014-03-24 [fd755a7](https://github.com/silverstripe/silverstripe-framework/commit/fd755a7ff9de69802f04763570f69e4c3b68c08c) ChangePasswordForm validation message should render HTML correctly. (Sean Harvey) diff --git a/lang/af.yml b/lang/af.yml index 83c0b0875..3dbfb4deb 100644 --- a/lang/af.yml +++ b/lang/af.yml @@ -230,7 +230,6 @@ af: DELETED: Was verwyder DropdownBatchActionsDefault: Aksies PERMAGAIN: 'Jy is uit die IBS uitgeteken. As jy weer wil inteken, moet jy ''n gebruikersnaam en wagwoord onder in tik' - PLEASESAVE: 'Stoor asseblief die bladsy: Die bladsy kon nie opgedateer word nie omdat dit nog nie gestoor is nie' PreviewButton: Beskou REORGANISATIONSUCCESSFUL: 'Die ''site tree'' is suksesvol geheorganiseer' SAVEDUP: Gestoor diff --git a/lang/ar.yml b/lang/ar.yml index 40c56546f..8c0fb82cd 100644 --- a/lang/ar.yml +++ b/lang/ar.yml @@ -263,8 +263,6 @@ ar: FROMWEB: 'من الإنترنت' FindInFolder: 'ابحث في المجلد' IMAGEALT: 'النص البديل (بديل)' - IMAGEALTTEXT: 'النص البديل (ألت) - يظهر إذا كان لا يمكن عرض الصورة' - IMAGEALTTEXTDESC: 'تبين قارئي الشاشة أو إذا لم يمكن عرض الصورة' IMAGEDIMENSIONS: الأبعاد IMAGEHEIGHTPX: الطول IMAGETITLE: 'العنوان - لإضافة معلومات إلى الصورة' diff --git a/lang/cs.yml b/lang/cs.yml index c8048abd8..adbd61569 100644 --- a/lang/cs.yml +++ b/lang/cs.yml @@ -291,8 +291,6 @@ cs: FROMWEB: 'Z webu' FindInFolder: 'Hledat ve složce' IMAGEALT: 'Alternativní text (alt)' - IMAGEALTTEXT: 'Alternativní text (alt) - ukáže se, když obrázek nemúže být zobrazen' - IMAGEALTTEXTDESC: 'Zobrazeno na obrazovce, anebo když obrázek nemůže být zobrazen' IMAGEDIMENSIONS: Rozměry IMAGEHEIGHTPX: Výška IMAGETITLE: 'Titul text (tooltip) - další informace o obrázku' @@ -327,9 +325,7 @@ cs: DELETED: Smazáno. DropdownBatchActionsDefault: Akcie HELP: Nápověda - PAGETYPE: 'Typ stránky' PERMAGAIN: 'Byli jste odhlášeni z CMS. Pokud se chcete znovu přihlásit, zadejte níže své uživatelské jméno a heslo.' - PLEASESAVE: 'Uložte stránku, prosím. Tato stránka nemůže být aktualizována, protože ještě nebyla uložena.' PreviewButton: Náhled REORGANISATIONSUCCESSFUL: 'Strom webu reorganizován úspěšně.' SAVEDUP: Uloženo. diff --git a/lang/de.yml b/lang/de.yml index e232f147c..15f637333 100644 --- a/lang/de.yml +++ b/lang/de.yml @@ -291,8 +291,6 @@ de: FROMWEB: 'Aus dem Web' FindInFolder: 'In Ordner suchen' IMAGEALT: 'Alternativtext (alt)' - IMAGEALTTEXT: 'Alternativtext (alt) - erscheint, falls das Bild nicht angezeigt werden kann.' - IMAGEALTTEXTDESC: 'Wird von Screenreadern vorgelesen oder angezeigt, falls das Bild nicht angezeigt werden kann.' IMAGEDIMENSIONS: Dimensionen IMAGEHEIGHTPX: Höhe (px) IMAGETITLE: 'Titeltext (Tooltip) - für zusätzliche Informationen über das Bild' @@ -327,9 +325,7 @@ de: DELETED: Gelöscht. DropdownBatchActionsDefault: Aktionen HELP: Hilfe - PAGETYPE: 'Seitentyp' PERMAGAIN: 'Sie wurden aus dem System ausgeloggt. Falls Sie sich wieder einloggen möchten, geben Sie bitte Benutzernamen und Passwort im untenstehenden Formular an.' - PLEASESAVE: 'Diese Seite konnte nicht aktualisiert werden weil sie noch nicht gespeichert wurde - bitte speichern.' PreviewButton: Vorschau REORGANISATIONSUCCESSFUL: 'Der Seitenbaum wurde erfolgreich sortiert.' SAVEDUP: Gespeichert. diff --git a/lang/en.yml b/lang/en.yml index 5cc8afeff..e194d2225 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -292,8 +292,8 @@ en: FROMWEB: 'From the web' FindInFolder: 'Find in Folder' IMAGEALT: 'Alternative text (alt)' - IMAGEALTTEXT: 'Alternative text (alt) - shown if image can''t be displayed' - IMAGEALTTEXTDESC: 'Shown to screen readers or if image can''t be displayed' + IMAGEALTTEXT: 'Alternative text (alt) - shown if image cannot be displayed' + IMAGEALTTEXTDESC: 'Shown to screen readers or if image can not be displayed' IMAGEDIMENSIONS: Dimensions IMAGEHEIGHTPX: Height IMAGETITLE: 'Title text (tooltip) - for additional information about the image' @@ -328,11 +328,11 @@ en: DELETED: Deleted. DropdownBatchActionsDefault: Actions HELP: Help - PAGETYPE: 'Page type' + PAGETYPE: 'Page type: ' PERMAGAIN: 'You have been logged out of the CMS. If you would like to log in again, enter a username and password below.' PERMALREADY: 'I''m sorry, but you can''t access that part of the CMS. If you want to log in as someone else, do so below.' PERMDEFAULT: 'You must be logged in to access the administration area; please enter your credentials below.' - PLEASESAVE: 'Please Save Page: This page could not be updated because it hasn''t been saved yet.' + PLEASESAVE: 'Please Save Page: This page could not be upated because it hasn''t been saved yet.' PreviewButton: Preview REORGANISATIONSUCCESSFUL: 'Reorganised the site tree successfully.' SAVEDUP: Saved. diff --git a/lang/eo.yml b/lang/eo.yml index 369505f86..14ca046e4 100644 --- a/lang/eo.yml +++ b/lang/eo.yml @@ -291,8 +291,6 @@ eo: FROMWEB: 'El la TTT' FindInFolder: 'Serĉi en dosierujo' IMAGEALT: 'Alternativa teksto (alt)' - IMAGEALTTEXT: 'Alternativa teksto (alt) - vidiĝas se ne eblas vidigi bildon' - IMAGEALTTEXTDESC: 'Vidiĝas se ne eblas vidigi bildon' IMAGEDIMENSIONS: Dimensioj IMAGEHEIGHTPX: Alto IMAGETITLE: 'Titola teksto (ŝpruchelpilo) - por plua informo pri la bildo' @@ -328,7 +326,6 @@ eo: DropdownBatchActionsDefault: Agoj HELP: Helpo PERMAGAIN: 'Vin adiaŭis la CMS. Se vi volas denove saluti, enigu salutnomon kaj pasvorton malsupre.' - PLEASESAVE: 'Bonvolu konservi paĝon: ne povis ĝisdatigi ĉi tiun paĝon ĉar ĝi ankoraŭ estas nekonservita.' PreviewButton: Antaŭvido REORGANISATIONSUCCESSFUL: 'Sukcese reorganizis la retejan arbon.' SAVEDUP: Konservita. diff --git a/lang/es.yml b/lang/es.yml index ad8ee8eda..427098d8f 100644 --- a/lang/es.yml +++ b/lang/es.yml @@ -290,8 +290,6 @@ es: FROMWEB: 'Desde la web' FindInFolder: 'Buscar en carpeta' IMAGEALT: 'Texto alternativo (alt)' - IMAGEALTTEXT: 'Texto alternativo (alt) - es mostrado si la imagen no puede ser visualizada' - IMAGEALTTEXTDESC: 'Texto alternativo (desc) - es mostrado si la imagen no puede ser visualizada o a los lectores de pantalla' IMAGEDIMENSIONS: Dimensiones IMAGEHEIGHTPX: Alto IMAGETITLE: 'Texto del título (tooltip) - para obtener más información acerca de la imagen' @@ -326,9 +324,7 @@ es: DELETED: Borrado DropdownBatchActionsDefault: Acciones HELP: Ayuda - PAGETYPE: 'Tipo de página' PERMAGAIN: 'Ha sido desconectado del CMS. Si quiere volver a entrar, introduzca su nombre de usuario y contraseña a continuación.' - PLEASESAVE: 'Por favor guarde la página: Esta página no se ha podido actualizar porque aún no ha sido guardada.' PreviewButton: Vista previa REORGANISATIONSUCCESSFUL: 'Reorganizado el árbol del sitio con éxito.' SAVEDUP: Guardado diff --git a/lang/et_EE.yml b/lang/et_EE.yml index 5c536d806..6dbae6917 100644 --- a/lang/et_EE.yml +++ b/lang/et_EE.yml @@ -240,7 +240,6 @@ et_EE: FROMWEB: 'Veebist' FindInFolder: 'Otsi kaustast' IMAGEALT: 'Asetekst (alt)' - IMAGEALTTEXT: 'Asetekst (alt) – kuvatakse, kui kujutist ei ole võimalik kuvada' IMAGEDIMENSIONS: Mõõtmed IMAGEHEIGHTPX: Laius IMAGETITLE: 'Pealkirja tekst (kohtspikker) – lisateabeks kujutise kohta' diff --git a/lang/fi.yml b/lang/fi.yml index 0f1971cf1..e06029735 100644 --- a/lang/fi.yml +++ b/lang/fi.yml @@ -291,8 +291,6 @@ fi: FROMWEB: 'Webistä' FindInFolder: 'Etsi kansiosta' IMAGEALT: 'Vaihtoehtoinen teksti (alt)' - IMAGEALTTEXT: 'Vaihtoehtoinen teksti (alt) - näytetään jos kuvaa ei voida näyttää' - IMAGEALTTEXTDESC: 'Näytetään ruudunlukuohjelmille tai jos kuvia ei voi näyttää' IMAGEDIMENSIONS: Mitat IMAGEHEIGHTPX: Korkeus IMAGETITLE: 'Otsikko (tooltip) - kuvan lisätietoja varten' @@ -328,7 +326,6 @@ fi: DropdownBatchActionsDefault: Toimenpiteet HELP: Ohje PERMAGAIN: 'Olet kirjautunut ulos CMS:stä. Jos haluat kirjautua uudelleen sisään, syötä käyttäjätunnuksesi ja salasanasi alla.' - PLEASESAVE: 'Tallenna sivu: tätä sivua ei voida päivittää, koska sitä ei ole vielä tallennettu.' PreviewButton: Esikatselu REORGANISATIONSUCCESSFUL: 'Hakemistopuu järjestettiin uudelleen onnistuneesti.' SAVEDUP: Tallennettu. diff --git a/lang/fr.yml b/lang/fr.yml index 41f563c69..745b53d73 100644 --- a/lang/fr.yml +++ b/lang/fr.yml @@ -263,8 +263,6 @@ fr: FROMWEB: 'Du web' FindInFolder: 'Trouver dans un dossier' IMAGEALT: 'Texte alternatif (alt)' - IMAGEALTTEXT: 'Texte alternatif (alt) - s''affiche si l''image ne peut être affichée.' - IMAGEALTTEXTDESC: 'Proposé aux lecteurs d’écran ou si l’image ne peut pas être affichée' IMAGEDIMENSIONS: Dimensions IMAGEHEIGHTPX: Hauteur IMAGETITLE: 'Texte du titre (tooltip) - informations à propos de l''image' diff --git a/lang/id.yml b/lang/id.yml index 0fd04b7ce..39c28c73a 100644 --- a/lang/id.yml +++ b/lang/id.yml @@ -291,8 +291,6 @@ id: FROMWEB: 'Dari situs lain' FindInFolder: 'Temukan di Folder' IMAGEALT: 'Teks alternatif (alt)' - IMAGEALTTEXT: 'Teks alternatif (alt) - pengganti jika gambar tidak tampil' - IMAGEALTTEXTDESC: 'Tampil ke pembaca layar, atau jika gambar tidak tampil' IMAGEDIMENSIONS: Dimensi IMAGEHEIGHTPX: Tinggi IMAGETITLE: 'Teks judul (tooltip) - untuk informasi tambahan tentang gambar' @@ -328,7 +326,6 @@ id: DropdownBatchActionsDefault: Tindakan HELP: Bantuan PERMAGAIN: 'Anda telah keluar dari situs. Jika ingin kembali masuk, isikan nama pengguna dan kata kunci di bawah ini.' - PLEASESAVE: 'Mohon Simpan Laman: Laman ini tidak dapat diperbarui karena belum disimpan.' PreviewButton: Pratinjau REORGANISATIONSUCCESSFUL: 'Pengaturan ulang struktur situs berhasil.' SAVEDUP: Tersimpan. diff --git a/lang/id_ID.yml b/lang/id_ID.yml index 8c42f15eb..16f42aac4 100644 --- a/lang/id_ID.yml +++ b/lang/id_ID.yml @@ -291,8 +291,6 @@ id_ID: FROMWEB: 'Dari situs lain' FindInFolder: 'Temukan di Folder' IMAGEALT: 'Teks alternatif (alt)' - IMAGEALTTEXT: 'Teks alternatif (alt) - pengganti jika gambar tidak tampil' - IMAGEALTTEXTDESC: 'Tampil ke pembaca layar, atau jika gambar tidak tampil' IMAGEDIMENSIONS: Dimensi IMAGEHEIGHTPX: Tinggi IMAGETITLE: 'Teks judul (tooltip) - untuk informasi tambahan tentang gambar' @@ -328,7 +326,6 @@ id_ID: DropdownBatchActionsDefault: Tindakan HELP: Bantuan PERMAGAIN: 'Anda telah keluar dari situs. Jika ingin kembali masuk, isikan nama pengguna dan kata kunci di bawah ini.' - PLEASESAVE: 'Mohon Simpan Laman: Laman ini tidak dapat diperbarui karena belum disimpan.' PreviewButton: Pratinjau REORGANISATIONSUCCESSFUL: 'Pengaturan ulang struktur situs berhasil.' SAVEDUP: Tersimpan. diff --git a/lang/it.yml b/lang/it.yml index 4dae4610b..17627d5cb 100644 --- a/lang/it.yml +++ b/lang/it.yml @@ -291,8 +291,6 @@ it: FROMWEB: 'Dal web' FindInFolder: 'Trova nella Cartella' IMAGEALT: 'Testo alternativo (alt)' - IMAGEALTTEXT: 'Testo alternativo (alt) - mostrato se l''immagine non può essere mostrata.' - IMAGEALTTEXTDESC: 'Mostrato agli screen reader o se l''immagine non può essere visualizzata' IMAGEDIMENSIONS: Dimensioni IMAGEHEIGHTPX: Altezza IMAGETITLE: 'Titolo (tooltip) - per informazioni aggiuntive sull''immagine.' @@ -327,9 +325,7 @@ it: DELETED: Eliminato. DropdownBatchActionsDefault: Azioni HELP: Aiuto - PAGETYPE: 'Tipo di pagina' PERMAGAIN: 'Sei stato disconnesso dal CMS. Se desideri autenticarti nuovamente, inserisci qui sotto nome utente e password.' - PLEASESAVE: 'Per favore salvare la pagina: potrebbe non venire aggiornata perché non è ancora stata salvata.' PreviewButton: Anteprima REORGANISATIONSUCCESSFUL: 'Albero del sito riorganizzato con successo.' SAVEDUP: Salvato. diff --git a/lang/ja.yml b/lang/ja.yml index 4db7f6ab6..fc9bb04b1 100644 --- a/lang/ja.yml +++ b/lang/ja.yml @@ -261,8 +261,6 @@ ja: FROMWEB: 'Webから' FindInFolder: 'フォルダ内を探す' IMAGEALT: '代替テキスト(Alt)' - IMAGEALTTEXT: '代替(Alt)テキスト - 画像が表示されなかった場合に表示されます' - IMAGEALTTEXTDESC: 'スクリーンリーダー利用者やイメージが表示されなかった場合に表示されます' IMAGEDIMENSIONS: サイズ IMAGEHEIGHTPX: 高さ IMAGETITLE: 'タイトル(ツールチップ)テキスト - 画像に対する追加的情報' diff --git a/lang/lt.yml b/lang/lt.yml index 3a9f0c28f..994b01641 100644 --- a/lang/lt.yml +++ b/lang/lt.yml @@ -260,7 +260,6 @@ lt: many_many_Members: Vartotojai GroupImportForm: Help1: '

Importuoti vieną ar kelias grupes CSV formatu (kableliu atskirtos reikšmės). Rodyti detalesnį aprašymą

' - Help2: '

Detalesnis aprašymas

  • Galimi stulpeliai: %s
  • Esamos grupės yra surandamos su jų unikalia Code reikšme ir atnaujinamos duomenimis iš importuojamos bylos.
  • Grupių hierarchija gali būti sukurta naudojant ParentCode stulpelį.
  • Leidimų kodai gali būti priskirti naudojant PermissionCode stulpelį. Esami leidimai nebus pakeisti.
' ResultCreated: 'Sukurta {count} grupių' ResultDeleted: 'Ištrinta %d grupių' ResultUpdated: 'Atnaujinta %d grupių' @@ -292,8 +291,6 @@ lt: FROMWEB: 'Iš interneto' FindInFolder: 'Rasti kataloge' IMAGEALT: 'Alternatyvus tekstas (alt)' - IMAGEALTTEXT: 'Alternatyvus tekstas (alt) - rodomas, jeigu nepavyko parodyti paveikslėlio' - IMAGEALTTEXTDESC: 'Rodomas, jeigu nepavyko parodyti paveikslėlio' IMAGEDIMENSIONS: Matmenys IMAGEHEIGHTPX: Aukštis IMAGETITLE: 'Pavadinimo tekstas (tooltip) - papildomai informacijai apie paveikslėlį' @@ -328,11 +325,9 @@ lt: DELETED: Ištrinta. DropdownBatchActionsDefault: Veiksmai HELP: Pagalba - PAGETYPE: 'Puslapio tipas' PERMAGAIN: 'Jūs atsijungėte. Norėdami vėl prisijungti, įveskite savo duomenis į žemiau esančius laukelius.' PERMALREADY: 'Deja, bet Jūs negalite patekti į šią TVS dalį. Jeigu norite prisijungti kitu vartotoju, tai atlikite žemiau.' PERMDEFAULT: 'Jūs turite būti prisijungę, norėdami pasiekti administravimo zoną; prašome suvesti prisijungimo duomenis į žemiau esančius laukelius.' - PLEASESAVE: 'Prašome išsaugoti puslapį: Šis puslapis negali būti atnaujintas, nes jis dar nėra išsaugotas.' PreviewButton: Peržiūra REORGANISATIONSUCCESSFUL: 'Puslapių medis pertvarkytas sėkmingai.' SAVEDUP: Išsaugota. @@ -420,7 +415,6 @@ lt: Toggle: 'Rodyti formatavimo aprašymą' MemberImportForm: Help1: '

Importuoti vartotojus CSV formatu (kableliu atskirtos reikšmės). Rodyti detalesnį aprašymą

' - Help2: '

Detalesnis aprašymas

  • Galimi stulpeliai: %s
  • Esami vartotojai yra surandami su jų unikalia Code reikšme ir atnaujinami duomenimis iš importuojamos bylos.
  • Grupės gali būti priskirtos naudojant Groups column. stulpelį. Grupės yra atpažįstamos pagal Code stulpelį, kelios grupės nurodomos per kablelį. Jau priskirtos vartotojui grupės nebus pakeistos.
' ResultCreated: 'Sukurta {count} vartotojų' ResultDeleted: 'Ištrinta %d vartotojų' ResultNone: 'Nėra jokių pakeitimų' diff --git a/lang/mi.yml b/lang/mi.yml index 9a9b7babc..33b4ddafa 100644 --- a/lang/mi.yml +++ b/lang/mi.yml @@ -263,8 +263,6 @@ mi: FROMWEB: 'Mai i te tukutuku' FindInFolder: 'Rapu i te Kōpaki' IMAGEALT: 'Tuhinga kē (alt)' - IMAGEALTTEXT: 'Kuputuhi kē (alt) - ka whakaaturia ki te kore e taea te atahanga te whakaatu' - IMAGEALTTEXTDESC: 'Ka whakaaturia ki ngā pūpānui mata ki te kore e taea te atahanga te whakaatu' IMAGEDIMENSIONS: Ngā Rahinga IMAGEHEIGHTPX: Teitei IMAGETITLE: 'Tuhinga taitara (ākiutauta) - mō ngā mōhiohio tāpiri mō te atahanga' diff --git a/lang/nb.yml b/lang/nb.yml index a1aa097ff..50651fa36 100644 --- a/lang/nb.yml +++ b/lang/nb.yml @@ -265,8 +265,6 @@ nb: FROMWEB: 'Fra internett' FindInFolder: 'Finn i mappe' IMAGEALT: 'Alternativ tekst (alt)' - IMAGEALTTEXT: 'Alternativ tekst (alt) - blir brukt hvis bildet ikke kan vises' - IMAGEALTTEXTDESC: 'Blir vist til skjermlesere eller hvis bildet ikke kan vises' IMAGEDIMENSIONS: Dimensjoner IMAGEHEIGHTPX: Høyde IMAGETITLE: 'Titteltekst (tooltip) - for tilleggsinformasjon om bildet' diff --git a/lang/nl.yml b/lang/nl.yml index 00d5a9043..3f16cd791 100644 --- a/lang/nl.yml +++ b/lang/nl.yml @@ -266,8 +266,6 @@ nl: FROMWEB: 'Vanaf een website' FindInFolder: 'Zoek in map' IMAGEALT: 'Alternatieve tekst (alt tekst)' - IMAGEALTTEXT: 'Alternatieve tekst (alt-tekst) - wordt gebruikt als de afbeelding niet geladen kan worden ' - IMAGEALTTEXTDESC: 'Voor schermlezers, of als de afbeelding niet weergegeven kan worden ' IMAGEDIMENSIONS: Dimensies IMAGEHEIGHTPX: Hoogte IMAGETITLE: 'Tooltip (title) - Toon extra informatie over de afbeelding' diff --git a/lang/pl.yml b/lang/pl.yml index e5e5dec9b..085faaaf0 100644 --- a/lang/pl.yml +++ b/lang/pl.yml @@ -265,8 +265,6 @@ pl: FROMWEB: 'Z WWW' FindInFolder: 'Znajdź w Folderze' IMAGEALT: 'Tekst alternatywny (alt)' - IMAGEALTTEXT: 'Alternatywny tekst (alt) - pokazuje się gdy zdjęcie nie może się wyświetlić' - IMAGEALTTEXTDESC: 'Używane przez czytniki ekranu lub gdy obraz nie może zostać wyświetlony' IMAGEDIMENSIONS: Rozmiar IMAGEHEIGHTPX: Wysokość (px) IMAGETITLE: 'Tytuł (tooltip) - dodatkowe informacje o obrazku' diff --git a/lang/ru.yml b/lang/ru.yml index 7866e9244..81f4181db 100644 --- a/lang/ru.yml +++ b/lang/ru.yml @@ -265,8 +265,6 @@ ru: FROMWEB: 'Из интернета' FindInFolder: 'Найти в папке' IMAGEALT: 'Альтернативный текст (alt)' - IMAGEALTTEXT: 'Альтернативный текст (alt) - показывается, если изображение недоступно' - IMAGEALTTEXTDESC: 'Передается программе чтения экрана или отображается, если изображение недоступно' IMAGEDIMENSIONS: Размеры IMAGEHEIGHTPX: Высота IMAGETITLE: 'Текст (всплывающая подсказка) - для дополнительной информации об изображении' diff --git a/lang/sk.yml b/lang/sk.yml index 674c380c2..930f95f65 100644 --- a/lang/sk.yml +++ b/lang/sk.yml @@ -291,8 +291,6 @@ sk: FROMWEB: 'Z webu' FindInFolder: 'Vyhľadať v priečinku' IMAGEALT: 'Atlernatívny text (alt)' - IMAGEALTTEXT: 'Atlernatívny text (alt) - zobrazí sa ak obrázok nemože byť zobrazený ' - IMAGEALTTEXTDESC: 'Zobrazí sa na obrazovke, ak obrázok nemôže byť zobrazený' IMAGEDIMENSIONS: Rozmery IMAGEHEIGHTPX: Výška IMAGETITLE: 'Text titulky (tooltip) - pre doplňujúce informácie o obrázku' @@ -327,9 +325,7 @@ sk: DELETED: Zmazané. DropdownBatchActionsDefault: Akcie HELP: Pomoc - PAGETYPE: 'Typ stránky' PERMAGAIN: 'Boli ste odhlásený' - PLEASESAVE: 'Uložte stránku, prosím. Táto stránka nemôže byť aktualizovaná, pretože eště nebola uložená.' PreviewButton: Náhľad REORGANISATIONSUCCESSFUL: 'Strom webu bol reorganizovaný úspešne.' SAVEDUP: Uložené. diff --git a/lang/sr.yml b/lang/sr.yml index f5848d509..77e339da4 100644 --- a/lang/sr.yml +++ b/lang/sr.yml @@ -265,8 +265,6 @@ sr: FROMWEB: 'Са веба' FindInFolder: 'Пронађи у фасцикли' IMAGEALT: 'Алтернативни текст (alt)' - IMAGEALTTEXT: 'Алтернативни текст (alt) - приказује се ако слика не може бити приказана' - IMAGEALTTEXTDESC: 'Приказује се читачима екрана или ако слика не може бити приказана' IMAGEDIMENSIONS: Димензије IMAGEHEIGHTPX: Висина IMAGETITLE: 'Текст наслова (tooltip) - за додатне информације о слици' diff --git a/lang/sr@latin.yml b/lang/sr@latin.yml index 2ddf73a9a..6ae4e5b26 100644 --- a/lang/sr@latin.yml +++ b/lang/sr@latin.yml @@ -265,8 +265,6 @@ sr@latin: FROMWEB: 'Sa veba' FindInFolder: 'Pronađi u fascikli' IMAGEALT: 'Alternativni tekst (alt)' - IMAGEALTTEXT: 'Alternativni tekst (alt) - prikazuje se ako slika ne može biti prikazana' - IMAGEALTTEXTDESC: 'Prikazuje se čitačima ekrana ili ako slika ne može biti prikazana' IMAGEDIMENSIONS: Dimenzije IMAGEHEIGHTPX: Visina IMAGETITLE: 'Tekst naslova (tooltip) - za dodatne informacije o slici' diff --git a/lang/sr_RS.yml b/lang/sr_RS.yml index 5d96b1d8d..60f2ff25d 100644 --- a/lang/sr_RS.yml +++ b/lang/sr_RS.yml @@ -265,8 +265,6 @@ sr_RS: FROMWEB: 'Са веба' FindInFolder: 'Пронађи у фасцикли' IMAGEALT: 'Алтернативни текст (alt)' - IMAGEALTTEXT: 'Алтернативни текст (alt) - приказује се ако слика не може бити приказана' - IMAGEALTTEXTDESC: 'Приказује се читачима екрана или ако слика не може бити приказана' IMAGEDIMENSIONS: Димензије IMAGEHEIGHTPX: Висина IMAGETITLE: 'Текст наслова (tooltip) - за додатне информације о слици' diff --git a/lang/sr_RS@latin.yml b/lang/sr_RS@latin.yml index 7b28390a8..a7365d321 100644 --- a/lang/sr_RS@latin.yml +++ b/lang/sr_RS@latin.yml @@ -265,8 +265,6 @@ sr_RS@latin: FROMWEB: 'Sa veba' FindInFolder: 'Pronađi u fascikli' IMAGEALT: 'Alternativni tekst (alt)' - IMAGEALTTEXT: 'Alternativni tekst (alt) - prikazuje se ako slika ne može biti prikazana' - IMAGEALTTEXTDESC: 'Prikazuje se čitačima ekrana ili ako slika ne može biti prikazana' IMAGEDIMENSIONS: Dimenzije IMAGEHEIGHTPX: Visina IMAGETITLE: 'Tekst naslova (tooltip) - za dodatne informacije o slici' diff --git a/lang/sv.yml b/lang/sv.yml index 4576590dd..c3b4a8f83 100644 --- a/lang/sv.yml +++ b/lang/sv.yml @@ -290,8 +290,6 @@ sv: FROMWEB: 'Från webben' FindInFolder: 'Hitta i mapp' IMAGEALT: 'Alternativ text (alt)' - IMAGEALTTEXT: 'Alternativ text (alt) - visas om bilden inte kan visas' - IMAGEALTTEXTDESC: 'Visas för skärmläsare eller om bilden inte kan visas' IMAGEDIMENSIONS: Dimensioner IMAGEHEIGHTPX: Höjd IMAGETITLE: 'Titel text (tooltip) - för ytterligare information om bilden' @@ -327,7 +325,6 @@ sv: DropdownBatchActionsDefault: Åtgärder HELP: Hjälp PERMAGAIN: 'Du har blivit utloggad. Om du vill logga in igen anger du dina uppgifter nedan.' - PLEASESAVE: 'Var god spara sidan. Den kan inte uppdateras eftersom den har inte sparats ännu.' PreviewButton: Förhandsgranska REORGANISATIONSUCCESSFUL: 'Omorganisationen av sidträdet luyckades.' SAVEDUP: Sparad. diff --git a/lang/zh.yml b/lang/zh.yml index 7c755c398..37ac3a870 100644 --- a/lang/zh.yml +++ b/lang/zh.yml @@ -265,8 +265,6 @@ zh: FROMWEB: '从网站上' FindInFolder: '在文件夹中寻找' IMAGEALT: '替代性文本 (alt)' - IMAGEALTTEXT: '替代文字 (alt) - 用于图像无法显示时' - IMAGEALTTEXTDESC: '向显示屏读者显示,或者用于图像无法显示时' IMAGEDIMENSIONS: 体积 IMAGEHEIGHTPX: 高度 IMAGETITLE: '标题文字(工具提示)- 关于该图像的更多信息'