Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
die_coolen_jungs
our_own_cloud_project
Commits
5da4071c
Commit
5da4071c
authored
Jan 26, 2015
by
Thomas Müller
Browse files
Merge pull request #13621 from owncloud/system-config-multiset
Add a method to set/unset multiple config values with one write
parents
810d5a6a
9ad9d7bf
Changes
15
Hide whitespace changes
Inline
Side-by-side
core/command/db/converttype.php
View file @
5da4071c
...
...
@@ -282,17 +282,19 @@ class ConvertType extends Command {
protected
function
saveDBInfo
(
InputInterface
$input
)
{
$type
=
$input
->
getArgument
(
'type'
);
$username
=
$input
->
getArgument
(
'username'
);
$db
h
ost
=
$input
->
getArgument
(
'hostname'
);
$db
n
ame
=
$input
->
getArgument
(
'database'
);
$db
H
ost
=
$input
->
getArgument
(
'hostname'
);
$db
N
ame
=
$input
->
getArgument
(
'database'
);
$password
=
$input
->
getOption
(
'password'
);
if
(
$input
->
getOption
(
'port'
))
{
$db
h
ost
.
=
':'
.
$input
->
getOption
(
'port'
);
$db
H
ost
.
=
':'
.
$input
->
getOption
(
'port'
);
}
$this
->
config
->
setSystemValue
(
'dbtype'
,
$type
);
$this
->
config
->
setSystemValue
(
'dbname'
,
$dbname
);
$this
->
config
->
setSystemValue
(
'dbhost'
,
$dbhost
);
$this
->
config
->
setSystemValue
(
'dbuser'
,
$username
);
$this
->
config
->
setSystemValue
(
'dbpassword'
,
$password
);
$this
->
config
->
setSystemValues
([
'dbtype'
=>
$type
,
'dbname'
=>
$dbName
,
'dbhost'
=>
$dbHost
,
'dbuser'
=>
$username
,
'dbpassword'
=>
$password
,
]);
}
}
lib/private/allconfig.php
View file @
5da4071c
...
...
@@ -69,6 +69,16 @@ class AllConfig implements \OCP\IConfig {
}
}
/**
* Sets and deletes system wide values
*
* @param array $configs Associative array with `key => value` pairs
* If value is null, the config key will be deleted
*/
public
function
setSystemValues
(
array
$configs
)
{
$this
->
systemConfig
->
setValues
(
$configs
);
}
/**
* Sets a new system wide value
*
...
...
lib/private/config.php
View file @
5da4071c
...
...
@@ -41,10 +41,10 @@ class Config {
/**
* Lists all available config keys
* @return array an array of key names
*
* This function returns all keys saved in config.php. Please note that it
* does not return the values.
* Please note that it does not return the values.
*
* @return array an array of key names
*/
public
function
getKeys
()
{
return
array_keys
(
$this
->
cache
);
...
...
@@ -52,12 +52,12 @@ class Config {
/**
* Gets a value from config.php
*
* If it does not exist, $default will be returned.
*
* @param string $key key
* @param mixed $default = null default value
* @return mixed the value or $default
*
* This function gets the value from config.php. If it does not exist,
* $default will be returned.
*/
public
function
getValue
(
$key
,
$default
=
null
)
{
if
(
isset
(
$this
->
cache
[
$key
]))
{
...
...
@@ -68,36 +68,81 @@ class Config {
}
/**
* Sets a value
* @param string $key key
* @param mixed $value value
*
* This function sets the value and writes the config.php.
* Sets and deletes values and writes the config.php
*
* @param array $configs Associative array with `key => value` pairs
* If value is null, the config key will be deleted
*/
public
function
setValue
(
$key
,
$value
)
{
// Add change
$this
->
cache
[
$key
]
=
$value
;
public
function
setValues
(
array
$configs
)
{
$needsUpdate
=
false
;
foreach
(
$configs
as
$key
=>
$value
)
{
if
(
$value
!==
null
)
{
$needsUpdate
|=
$this
->
set
(
$key
,
$value
);
}
else
{
$needsUpdate
|=
$this
->
delete
(
$key
);
}
}
// Write changes
$this
->
writeData
();
if
(
$needsUpdate
)
{
// Write changes
$this
->
writeData
();
}
}
/**
* Removes a key from the config
* @param string $key key
* Sets the value and writes it to config.php if required
*
* This function removes a key from the config.php.
* @param string $key key
* @param mixed $value value
*/
public
function
setValue
(
$key
,
$value
)
{
if
(
$this
->
set
(
$key
,
$value
))
{
// Write changes
$this
->
writeData
();
}
}
/**
* This function sets the value
*
* @param string $key key
* @param mixed $value value
* @return bool True if the file needs to be updated, false otherwise
*/
protected
function
set
(
$key
,
$value
)
{
if
(
!
isset
(
$this
->
cache
[
$key
])
||
$this
->
cache
[
$key
]
!==
$value
)
{
// Add change
$this
->
cache
[
$key
]
=
$value
;
return
true
;
}
return
false
;
}
/**
* Removes a key from the config and removes it from config.php if required
* @param string $key
*/
public
function
deleteKey
(
$key
)
{
if
(
$this
->
delete
(
$key
))
{
// Write changes
$this
->
writeData
();
}
}
/**
* This function removes a key from the config
*
* @param string $key
* @return bool True if the file needs to be updated, false otherwise
*/
protected
function
delete
(
$key
)
{
if
(
isset
(
$this
->
cache
[
$key
]))
{
// Delete key from cache
unset
(
$this
->
cache
[
$key
]);
// Write changes
$this
->
writeData
();
return
true
;
}
return
false
;
}
/**
...
...
lib/private/legacy/config.php
View file @
5da4071c
...
...
@@ -58,6 +58,16 @@ class OC_Config {
self
::
$object
->
setValue
(
$key
,
$value
);
}
/**
* Sets and deletes values and writes the config.php
*
* @param array $configs Associative array with `key => value` pairs
* If value is null, the config key will be deleted
*/
public
static
function
setValues
(
array
$configs
)
{
self
::
$object
->
setValues
(
$configs
);
}
/**
* Removes a key from the config
* @param string $key key
...
...
lib/private/setup.php
View file @
5da4071c
...
...
@@ -176,18 +176,19 @@ class OC_Setup {
//generate a random salt that is used to salt the local user passwords
$salt
=
\
OC
::
$server
->
getSecureRandom
()
->
getLowStrengthGenerator
()
->
generate
(
30
);
\
OC
::
$server
->
getConfig
()
->
setSystemValue
(
'passwordsalt'
,
$salt
);
// generate a secret
$secret
=
\
OC
::
$server
->
getSecureRandom
()
->
getMediumStrengthGenerator
()
->
generate
(
48
);
\
OC
::
$server
->
getConfig
()
->
setSystemValue
(
'secret'
,
$secret
);
//write the config file
\
OC
::
$server
->
getConfig
()
->
setSystemValue
(
'trusted_domains'
,
$trustedDomains
);
\
OC
::
$server
->
getConfig
()
->
setSystemValue
(
'datadirectory'
,
$dataDir
);
\
OC
::
$server
->
getConfig
()
->
setSystemValue
(
'overwrite.cli.url'
,
\
OC_Request
::
serverProtocol
()
.
'://'
.
\
OC_Request
::
serverHost
()
.
OC
::
$WEBROOT
);
\
OC
::
$server
->
getConfig
()
->
setSystemValue
(
'dbtype'
,
$dbType
);
\
OC
::
$server
->
getConfig
()
->
setSystemValue
(
'version'
,
implode
(
'.'
,
OC_Util
::
getVersion
()));
\
OC
::
$server
->
getConfig
()
->
setSystemValues
([
'passwordsalt'
=>
$salt
,
'secret'
=>
$secret
,
'trusted_domains'
=>
$trustedDomains
,
'datadirectory'
=>
$dataDir
,
'overwrite.cli.url'
=>
\
OC_Request
::
serverProtocol
()
.
'://'
.
\
OC_Request
::
serverHost
()
.
OC
::
$WEBROOT
,
'dbtype'
=>
$dbType
,
'version'
=>
implode
(
'.'
,
OC_Util
::
getVersion
()),
]);
try
{
$dbSetup
->
initialize
(
$options
);
...
...
lib/private/setup/abstractdatabase.php
View file @
5da4071c
...
...
@@ -35,20 +35,24 @@ abstract class AbstractDatabase {
}
public
function
initialize
(
$config
)
{
$dbuser
=
$config
[
'dbuser'
];
$dbpass
=
$config
[
'dbpass'
];
$dbname
=
$config
[
'dbname'
];
$dbhost
=
!
empty
(
$config
[
'dbhost'
])
?
$config
[
'dbhost'
]
:
'localhost'
;
$dbtableprefix
=
isset
(
$config
[
'dbtableprefix'
])
?
$config
[
'dbtableprefix'
]
:
'oc_'
;
\
OC_Config
::
setValue
(
'dbname'
,
$dbname
);
\
OC_Config
::
setValue
(
'dbhost'
,
$dbhost
);
\
OC_Config
::
setValue
(
'dbtableprefix'
,
$dbtableprefix
);
$this
->
dbuser
=
$dbuser
;
$this
->
dbpassword
=
$dbpass
;
$this
->
dbname
=
$dbname
;
$this
->
dbhost
=
$dbhost
;
$this
->
tableprefix
=
$dbtableprefix
;
$dbUser
=
$config
[
'dbuser'
];
$dbPass
=
$config
[
'dbpass'
];
$dbName
=
$config
[
'dbname'
];
$dbHost
=
!
empty
(
$config
[
'dbhost'
])
?
$config
[
'dbhost'
]
:
'localhost'
;
$dbTablePrefix
=
isset
(
$config
[
'dbtableprefix'
])
?
$config
[
'dbtableprefix'
]
:
'oc_'
;
\
OC_Config
::
setValues
([
'dbname'
=>
$dbName
,
'dbhost'
=>
$dbHost
,
'dbtableprefix'
=>
$dbTablePrefix
,
]);
$this
->
dbuser
=
$dbUser
;
$this
->
dbpassword
=
$dbPass
;
$this
->
dbname
=
$dbName
;
$this
->
dbhost
=
$dbHost
;
$this
->
tableprefix
=
$dbTablePrefix
;
}
abstract
public
function
setupDatabase
(
$userName
);
}
lib/private/setup/mssql.php
View file @
5da4071c
...
...
@@ -5,7 +5,7 @@ namespace OC\Setup;
class
MSSQL
extends
AbstractDatabase
{
public
$dbprettyname
=
'MS SQL Server'
;
public
function
setupDatabase
()
{
public
function
setupDatabase
(
$username
)
{
//check if the database user has admin right
$masterConnectionInfo
=
array
(
"Database"
=>
"master"
,
"UID"
=>
$this
->
dbuser
,
"PWD"
=>
$this
->
dbpassword
);
...
...
@@ -21,8 +21,10 @@ class MSSQL extends AbstractDatabase {
$this
->
trans
->
t
(
'You need to enter either an existing account or the administrator.'
));
}
\
OC_Config
::
setValue
(
'dbuser'
,
$this
->
dbuser
);
\
OC_Config
::
setValue
(
'dbpassword'
,
$this
->
dbpassword
);
\
OC_Config
::
setValues
([
'dbuser'
=>
$this
->
dbuser
,
'dbpassword'
=>
$this
->
dbpassword
,
]);
$this
->
createDBLogin
(
$masterConnection
);
...
...
lib/private/setup/mysql.php
View file @
5da4071c
...
...
@@ -51,8 +51,10 @@ class MySQL extends AbstractDatabase {
}
};
\
OC_Config
::
setValue
(
'dbuser'
,
$this
->
dbuser
);
\
OC_Config
::
setValue
(
'dbpassword'
,
$this
->
dbpassword
);
\
OC_Config
::
setValues
([
'dbuser'
=>
$this
->
dbuser
,
'dbpassword'
=>
$this
->
dbpassword
,
]);
}
//create the database
...
...
lib/private/setup/oci.php
View file @
5da4071c
...
...
@@ -16,8 +16,11 @@ class OCI extends AbstractDatabase {
}
// allow empty hostname for oracle
$this
->
dbhost
=
$config
[
'dbhost'
];
\
OC_Config
::
setValue
(
'dbhost'
,
$this
->
dbhost
);
\
OC_Config
::
setValue
(
'dbtablespace'
,
$this
->
dbtablespace
);
\
OC_Config
::
setValues
([
'dbhost'
=>
$this
->
dbhost
,
'dbtablespace'
=>
$this
->
dbtablespace
,
]);
}
public
function
validate
(
$config
)
{
...
...
@@ -72,37 +75,32 @@ class OCI extends AbstractDatabase {
$result
=
oci_execute
(
$stmt
);
if
(
$result
)
{
$row
=
oci_fetch_row
(
$stmt
);
}
if
(
$result
and
$row
[
0
]
>
0
)
{
//use the admin login data for the new database user
//add prefix to the oracle user name to prevent collisions
$this
->
dbuser
=
'oc_'
.
$username
;
//create a new password so we don't need to store the admin config in the config file
$this
->
dbpassword
=
\
OC_Util
::
generateRandomBytes
(
30
);
if
(
$row
[
0
]
>
0
)
{
//use the admin login data for the new database user
//
oracle passwords are treated as identifiers:
// must start with alphanumeric char
//
needs to be shortene
d
t
o
30 bytes, as the two "
need
ed
to
escap
e the
identifier count towards the identifier length.
$this
->
dbpassword
=
substr
(
$this
->
dbpassword
,
0
,
30
);
//
add prefix to the oracle user name to prevent collisions
$this
->
dbuser
=
'oc_'
.
$username
;
//
create a new passwor
d
s
o
we don't
need to
stor
e the
admin config in the config file
$this
->
dbpassword
=
\
OC_Util
::
generateRandomBytes
(
30
);
$this
->
createDBUser
(
$connection
);
//oracle passwords are treated as identifiers:
// must start with alphanumeric char
// needs to be shortened to 30 bytes, as the two " needed to escape the identifier count towards the identifier length.
$this
->
dbpassword
=
substr
(
$this
->
dbpassword
,
0
,
30
);
\
OC_Config
::
setValue
(
'dbuser'
,
$this
->
dbuser
);
\
OC_Config
::
setValue
(
'dbname'
,
$this
->
dbuser
);
\
OC_Config
::
setValue
(
'dbpassword'
,
$this
->
dbpassword
);
//create the database not necessary, oracle implies user = schema
//$this->createDatabase($this->dbname, $this->dbuser, $connection);
}
else
{
$this
->
createDBUser
(
$connection
);
}
}
\
OC_Config
::
setValue
(
'dbuser'
,
$this
->
dbuser
);
\
OC_Config
::
setValue
(
'dbname'
,
$this
->
dbname
);
\
OC_Config
::
setValue
(
'dbpassword'
,
$this
->
dbpassword
);
\
OC_Config
::
setValues
([
'dbuser'
=>
$this
->
dbuser
,
'dbname'
=>
$this
->
dbname
,
'dbpassword'
=>
$this
->
dbpassword
,
]);
//create the database not necessary, oracle implies user = schema
//$this->createDatabase($this->dbname, $this->dbuser, $connection);
}
//create the database not necessary, oracle implies user = schema
//$this->createDatabase($this->dbname, $this->dbuser, $connection);
//FIXME check tablespace exists: select * from user_tablespaces
...
...
lib/private/setup/postgresql.php
View file @
5da4071c
...
...
@@ -43,20 +43,15 @@ class PostgreSQL extends AbstractDatabase {
$this
->
dbpassword
=
\
OC_Util
::
generateRandomBytes
(
30
);
$this
->
createDBUser
(
$connection
);
\
OC_Config
::
setValue
(
'dbuser'
,
$this
->
dbuser
);
\
OC_Config
::
setValue
(
'dbpassword'
,
$this
->
dbpassword
);
//create the database
$this
->
createDatabase
(
$connection
);
}
else
{
\
OC_Config
::
setValue
(
'dbuser'
,
$this
->
dbuser
);
\
OC_Config
::
setValue
(
'dbpassword'
,
$this
->
dbpassword
);
//create the database
$this
->
createDatabase
(
$connection
);
}
\
OC_Config
::
setValues
([
'dbuser'
=>
$this
->
dbuser
,
'dbpassword'
=>
$this
->
dbpassword
,
]);
//create the database
$this
->
createDatabase
(
$connection
);
// the connection to dbname=postgres is not needed anymore
pg_close
(
$connection
);
...
...
lib/private/systemconfig.php
View file @
5da4071c
...
...
@@ -27,6 +27,16 @@ class SystemConfig {
\
OC_Config
::
setValue
(
$key
,
$value
);
}
/**
* Sets and deletes values and writes the config.php
*
* @param array $configs Associative array with `key => value` pairs
* If value is null, the config key will be deleted
*/
public
function
setValues
(
array
$configs
)
{
\
OC_Config
::
setValues
(
$configs
);
}
/**
* Looks up a system wide defined value
*
...
...
lib/public/iconfig.php
View file @
5da4071c
...
...
@@ -34,6 +34,14 @@ namespace OCP;
* Access to all the configuration options ownCloud offers
*/
interface
IConfig
{
/**
* Sets and deletes system wide values
*
* @param array $configs Associative array with `key => value` pairs
* If value is null, the config key will be deleted
*/
public
function
setSystemValues
(
array
$configs
);
/**
* Sets a new system wide value
*
...
...
settings/controller/mailsettingscontroller.php
View file @
5da4071c
...
...
@@ -84,20 +84,19 @@ class MailSettingsController extends Controller {
$mail_smtpport
)
{
$params
=
get_defined_vars
();
$configs
=
[];
foreach
(
$params
as
$key
=>
$value
)
{
if
(
empty
(
$value
))
{
$this
->
config
->
deleteSystemValue
(
$key
);
}
else
{
$this
->
config
->
setSystemValue
(
$key
,
$value
);
}
$configs
[
$key
]
=
(
empty
(
$value
))
?
null
:
$value
;
}
// Delete passwords from config in case no auth is specified
if
(
$params
[
'mail_smtpauth'
]
!==
1
)
{
$
this
->
config
->
deleteSystemValue
(
'mail_smtpname'
)
;
$
this
->
config
->
deleteSystemValue
(
'mail_smtppassword'
)
;
if
(
$params
[
'mail_smtpauth'
]
!==
1
)
{
$
configs
[
'mail_smtpname'
]
=
null
;
$
configs
[
'mail_smtppassword'
]
=
null
;
}
$this
->
config
->
setSystemValues
(
$configs
);
return
array
(
'data'
=>
array
(
'message'
=>
(
string
)
$this
->
l10n
->
t
(
'Saved'
)
...
...
@@ -113,8 +112,10 @@ class MailSettingsController extends Controller {
* @return array
*/
public
function
storeCredentials
(
$mail_smtpname
,
$mail_smtppassword
)
{
$this
->
config
->
setSystemValue
(
'mail_smtpname'
,
$mail_smtpname
);
$this
->
config
->
setSystemValue
(
'mail_smtppassword'
,
$mail_smtppassword
);
$this
->
config
->
setSystemValues
([
'mail_smtpname'
=>
$mail_smtpname
,
'mail_smtppassword'
=>
$mail_smtppassword
,
]);
return
array
(
'data'
=>
array
(
'message'
=>
...
...
tests/lib/config.php
View file @
5da4071c
...
...
@@ -71,6 +71,36 @@ class Test_Config extends \Test\TestCase {
$this
->
assertEquals
(
$expected
,
$content
);
}
public
function
testSetValues
()
{
$content
=
file_get_contents
(
$this
->
configFile
);
$this
->
assertEquals
(
self
::
TESTCONTENT
,
$content
);
// Changing configs to existing values and deleting non-existing once
// should not rewrite the config.php
$this
->
config
->
setValues
([
'foo'
=>
'bar'
,
'not_exists'
=>
null
,
]);
$this
->
assertAttributeEquals
(
$this
->
initialConfig
,
'cache'
,
$this
->
config
);
$content
=
file_get_contents
(
$this
->
configFile
);
$this
->
assertEquals
(
self
::
TESTCONTENT
,
$content
);
$this
->
config
->
setValues
([
'foo'
=>
'moo'
,
'alcohol_free'
=>
null
,
]);
$expectedConfig
=
$this
->
initialConfig
;
$expectedConfig
[
'foo'
]
=
'moo'
;
unset
(
$expectedConfig
[
'alcohol_free'
]);
$this
->
assertAttributeEquals
(
$expectedConfig
,
'cache'
,
$this
->
config
);
$content
=
file_get_contents
(
$this
->
configFile
);
$expected
=
"<?php
\n\$
CONFIG = array (
\n
'foo' => 'moo',
\n
'beers' =>
\n
array (
\n
0 => 'Appenzeller',
\n
"
.
" 1 => 'Guinness',
\n
2 => 'Kölsch',
\n
),
\n
);
\n
"
;
$this
->
assertEquals
(
$expected
,
$content
);
}
public
function
testDeleteKey
()
{
$this
->
config
->
deleteKey
(
'foo'
);
$expectedConfig
=
$this
->
initialConfig
;
...
...
tests/settings/controller/mailsettingscontrollertest.php
View file @
5da4071c
...
...
@@ -69,26 +69,37 @@ class MailSettingsControllerTest extends \Test\TestCase {
);
*/
$this
->
container
[
'C
onfig
'
]
->
expects
(
$this
->
exactly
(
15
))
->
method
(
'setSystemValue'
);
/** @var \PHPUnit_Framework_MockObject_MockObject $c
onfig
*/
$config
=
$this
->
container
[
'Config'
];
$config
->
expects
(
$this
->
exactly
(
2
))
->
method
(
'setSystemValues'
);
/**
* FIXME: Use the following block once Jenkins uses PHPUnit >= 4.1
*/
/*
$this->container['Config']
->expects($this->exactly(3))
->method('deleteSystemValue')
->withConsecutive(
array($this->equalTo('mail_smtpauth')),
array($this->equalTo('mail_smtpname')),
array($this->equalTo('mail_smtppassword'))
[[
'mail_domain' => 'owncloud.com',
'mail_from_address' => 'demo@owncloud.com',
'mail_smtpmode' => 'smtp',
'mail_smtpsecure' => 'ssl',
'mail_smtphost' => 'mx.owncloud.org',
'mail_smtpauthtype' => 'NTLM',
'mail_smtpauth' => 1,
'mail_smtpport' => '25',
]],
[[
'mail_domain' => 'owncloud.com',
'mail_from_address' => 'demo@owncloud.com',
'mail_smtpmode' => 'smtp',
'mail_smtpsecure' => 'ssl',
'mail_smtphost' => 'mx.owncloud.org',
'mail_smtpauthtype' => 'NTLM',
'mail_smtpauth' => null,
'mail_smtpport' => '25',
'mail_smtpname' => null,
'mail_smtppassword' => null,
]]
);
*/
$this
->
container
[
'Config'
]
->
expects
(
$this
->
exactly
(
3
))
->
method
(
'deleteSystemValue'
);
*/
// With authentication
$response
=
$this
->
container
[
'MailSettingsController'
]
->
setMailSettings
(
...
...
@@ -126,21 +137,13 @@ class MailSettingsControllerTest extends \Test\TestCase {
->
method
(
't'
)
->
will
(
$this
->
returnValue
(
'Saved'
));
/**
* FIXME: Use this block once Jenkins uses PHPUnit >= 4.1
*/
/*
$this
->
container
[
'Config'
]
->expects($this->exactly(2))
->method('setSystemValue')
->withConsecutive(
array($this->equalTo('mail_smtpname'), $this->equalTo('UsernameToStore')),
array($this->equalTo('mail_smtppassword'), $this->equalTo('PasswordToStore'))
);
*/
$this
->
container
[
'Config'
]
->
expects
(
$this
->
exactly
(
2
))
->
method
(
'setSystemValue'
);
->
expects
(
$this
->
once
())
->
method
(
'setSystemValues'
)
->
with
([
'mail_smtpname'
=>
'UsernameToStore'
,
'mail_smtppassword'
=>
'PasswordToStore'
,
]);
$response
=
$this
->
container
[
'MailSettingsController'
]
->
storeCredentials
(
'UsernameToStore'
,
'PasswordToStore'
);
$expectedResponse
=
array
(
'data'
=>
array
(
'message'
=>
'Saved'
),
'status'
=>
'success'
);
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment