зеркало из https://github.com/nextcloud/server.git
fix the privatedata key value store
This commit is contained in:
Родитель
d21a5b45f3
Коммит
330d026be7
|
@ -1077,4 +1077,67 @@
|
||||||
|
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
|
||||||
|
<name>*dbprefix*privatedata</name>
|
||||||
|
|
||||||
|
<declaration>
|
||||||
|
|
||||||
|
<field>
|
||||||
|
<name>keyid</name>
|
||||||
|
<type>integer</type>
|
||||||
|
<default>0</default>
|
||||||
|
<notnull>true</notnull>
|
||||||
|
<unsigned>true</unsigned>
|
||||||
|
<length>4</length>
|
||||||
|
<autoincrement>1</autoincrement>
|
||||||
|
</field>
|
||||||
|
|
||||||
|
<field>
|
||||||
|
<name>user</name>
|
||||||
|
<type>text</type>
|
||||||
|
<default></default>
|
||||||
|
<notnull>true</notnull>
|
||||||
|
<length>255</length>
|
||||||
|
</field>
|
||||||
|
|
||||||
|
<field>
|
||||||
|
<name>app</name>
|
||||||
|
<type>text</type>
|
||||||
|
<default></default>
|
||||||
|
<notnull>true</notnull>
|
||||||
|
<length>255</length>
|
||||||
|
</field>
|
||||||
|
|
||||||
|
<field>
|
||||||
|
<name>key</name>
|
||||||
|
<type>text</type>
|
||||||
|
<default></default>
|
||||||
|
<notnull>true</notnull>
|
||||||
|
<length>255</length>
|
||||||
|
</field>
|
||||||
|
|
||||||
|
<field>
|
||||||
|
<name>value</name>
|
||||||
|
<type>text</type>
|
||||||
|
<default></default>
|
||||||
|
<notnull>true</notnull>
|
||||||
|
<length>255</length>
|
||||||
|
</field>
|
||||||
|
|
||||||
|
<index>
|
||||||
|
<primary>true</primary>
|
||||||
|
<unique>true</unique>
|
||||||
|
<name>keyid_index</name>
|
||||||
|
<field>
|
||||||
|
<name>keyid</name>
|
||||||
|
<sorting>ascending</sorting>
|
||||||
|
</field>
|
||||||
|
</index>
|
||||||
|
|
||||||
|
</declaration>
|
||||||
|
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
</database>
|
</database>
|
||||||
|
|
|
@ -228,36 +228,4 @@ class OC_OCS {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* get private data
|
|
||||||
* @param string $user
|
|
||||||
* @param string $app
|
|
||||||
* @param string $key
|
|
||||||
* @param bool $like use LIKE instead of = when comparing keys
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public static function getData($user, $app="", $key="") {
|
|
||||||
if($app) {
|
|
||||||
$apps=array($app);
|
|
||||||
}else{
|
|
||||||
$apps=OC_Preferences::getApps($user);
|
|
||||||
}
|
|
||||||
if($key) {
|
|
||||||
$keys=array($key);
|
|
||||||
}else{
|
|
||||||
foreach($apps as $app) {
|
|
||||||
$keys=OC_Preferences::getKeys($user, $app);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$result=array();
|
|
||||||
foreach($apps as $app) {
|
|
||||||
foreach($keys as $key) {
|
|
||||||
$value=OC_Preferences::getValue($user, $app, $key);
|
|
||||||
$result[]=array('app'=>$app, 'key'=>$key, 'value'=>$value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,35 +22,75 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
class OC_OCS_Privatedata {
|
class OC_OCS_Privatedata {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* read keys
|
||||||
|
* test: curl http://login:passwd@oc/core/ocs/v1.php/privatedata/getattribute/testy/123
|
||||||
|
* test: curl http://login:passwd@oc/core/ocs/v1.php/privatedata/getattribute/testy
|
||||||
|
* @param array $parameters The OCS parameter
|
||||||
|
*/
|
||||||
public static function get($parameters) {
|
public static function get($parameters) {
|
||||||
OC_Util::checkLoggedIn();
|
OC_Util::checkLoggedIn();
|
||||||
$user = OC_User::getUser();
|
$user = OC_User::getUser();
|
||||||
$app = addslashes(strip_tags($parameters['app']));
|
$app = addslashes(strip_tags($parameters['app']));
|
||||||
$key = addslashes(strip_tags($parameters['key']));
|
$key = addslashes(strip_tags($parameters['key']));
|
||||||
$result = OC_OCS::getData($user, $app, $key);
|
|
||||||
$xml = array();
|
if(empty($key)) {
|
||||||
foreach($result as $i=>$log) {
|
$query = \OCP\DB::prepare('SELECT `key`, `app`, `value` FROM `*PREFIX*privatedata` WHERE `user` = ? AND `app` = ? ');
|
||||||
$xml[$i]['key']=$log['key'];
|
$result = $query->execute(array($user, $app));
|
||||||
$xml[$i]['app']=$log['app'];
|
} else {
|
||||||
$xml[$i]['value']=$log['value'];
|
$query = \OCP\DB::prepare('SELECT `key`, `app`, `value` FROM `*PREFIX*privatedata` WHERE `user` = ? AND `app` = ? AND `key` = ? ');
|
||||||
|
$result = $query->execute(array($user, $app, $key));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$xml = array();
|
||||||
|
while ($row = $result->fetchRow()) {
|
||||||
|
$data=array();
|
||||||
|
$data['key']=$row['key'];
|
||||||
|
$data['app']=$row['app'];
|
||||||
|
$data['value']=$row['value'];
|
||||||
|
$xml[] = $data;
|
||||||
|
}
|
||||||
|
|
||||||
return new OC_OCS_Result($xml);
|
return new OC_OCS_Result($xml);
|
||||||
//TODO: replace 'privatedata' with 'attribute' once a new libattice has been released that works with it
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set a key
|
||||||
|
* test: curl http://login:passwd@oc/core/ocs/v1.php/privatedata/setattribute/testy/123 --data "value=foobar"
|
||||||
|
* @param array $parameters The OCS parameter
|
||||||
|
*/
|
||||||
public static function set($parameters) {
|
public static function set($parameters) {
|
||||||
OC_Util::checkLoggedIn();
|
OC_Util::checkLoggedIn();
|
||||||
$user = OC_User::getUser();
|
$user = OC_User::getUser();
|
||||||
$app = addslashes(strip_tags($parameters['app']));
|
$app = addslashes(strip_tags($parameters['app']));
|
||||||
$key = addslashes(strip_tags($parameters['key']));
|
$key = addslashes(strip_tags($parameters['key']));
|
||||||
$value = OC_OCS::readData('post', 'value', 'text');
|
$value = OC_OCS::readData('post', 'value', 'text');
|
||||||
if(OC_Preferences::setValue($user, $app, $key, $value)) {
|
|
||||||
return new OC_OCS_Result(null, 100);
|
// check if key is already set
|
||||||
|
$query = \OCP\DB::prepare('SELECT `value` FROM `*PREFIX*privatedata` WHERE `user` = ? AND `app` = ? AND `key` = ? ');
|
||||||
|
$result = $query->execute(array($user, $app, $key));
|
||||||
|
|
||||||
|
if ($result->numRows()==0) {
|
||||||
|
// store in DB
|
||||||
|
$query = \OCP\DB::prepare('INSERT INTO `*PREFIX*privatedata` (`user`, `app`, `key`, `value`)' . ' VALUES(?, ?, ?, ?)');
|
||||||
|
$query->execute(array($user, $app, $key, $value));
|
||||||
|
} else {
|
||||||
|
// update in DB
|
||||||
|
$query = \OCP\DB::prepare('UPDATE `*PREFIX*privatedata` SET `value` = ? WHERE `user` = ? AND `app` = ? AND `key` = ? ');
|
||||||
|
$query->execute(array($value, $user, $app, $key ));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return new OC_OCS_Result(null, 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* delete a key
|
||||||
|
* test: curl http://login:passwd@oc/core/ocs/v1.php/privatedata/deleteattribute/testy/123 --data "post=1"
|
||||||
|
* @param array $parameters The OCS parameter
|
||||||
|
*/
|
||||||
public static function delete($parameters) {
|
public static function delete($parameters) {
|
||||||
OC_Util::checkLoggedIn();
|
OC_Util::checkLoggedIn();
|
||||||
$user = OC_User::getUser();
|
$user = OC_User::getUser();
|
||||||
|
@ -59,8 +99,12 @@ class OC_OCS_Privatedata {
|
||||||
if($key==="" or $app==="") {
|
if($key==="" or $app==="") {
|
||||||
return new OC_OCS_Result(null, 101); //key and app are NOT optional here
|
return new OC_OCS_Result(null, 101); //key and app are NOT optional here
|
||||||
}
|
}
|
||||||
if(OC_Preferences::deleteKey($user, $app, $key)) {
|
|
||||||
return new OC_OCS_Result(null, 100);
|
// delete in DB
|
||||||
}
|
$query = \OCP\DB::prepare('DELETE FROM `*PREFIX*privatedata` WHERE `user` = ? AND `app` = ? AND `key` = ? ');
|
||||||
|
$query->execute(array($user, $app, $key ));
|
||||||
|
|
||||||
|
return new OC_OCS_Result(null, 100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче