Merge pull request #304 from nextcloud/bugfix/noid/compat-friendica

Compat friendica
pull/305/head v0.1.2
Maxence Lange 2019-01-04 10:37:59 -01:00 zatwierdzone przez GitHub
commit 42f482fa34
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
7 zmienionych plików z 449 dodań i 24 usunięć

Wyświetl plik

@ -11,9 +11,15 @@
],
"require": {
"daita/my-small-php-tools": "dev-master",
"digitalbazaar/json-ld": "0.4.7"
"friendica/json-ld": "^1.0"
},
"require-dev": {
"jakub-onderka/php-parallel-lint": "^1.0"
}
},
"repositories": [
{
"type": "vcs",
"url": "https://git.friendi.ca/friendica/php-json-ld"
}
]
}

32
composer.lock wygenerowano
Wyświetl plik

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
"content-hash": "2c21b8c338f3d2f929f349df19edbc0e",
"content-hash": "1fa362334ed7efc57377a715b00b640d",
"packages": [
{
"name": "daita/my-small-php-tools",
@ -43,22 +43,16 @@
"time": "2018-12-27T11:14:55+00:00"
},
{
"name": "digitalbazaar/json-ld",
"version": "0.4.7",
"name": "friendica/json-ld",
"version": "1.1.1",
"source": {
"type": "git",
"url": "https://github.com/digitalbazaar/php-json-ld.git",
"reference": "dc1bd23f0ee2efd27ccf636d32d2738dabcee182"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/digitalbazaar/php-json-ld/zipball/dc1bd23f0ee2efd27ccf636d32d2738dabcee182",
"reference": "dc1bd23f0ee2efd27ccf636d32d2738dabcee182",
"shasum": ""
"url": "https://git.friendi.ca/friendica/php-json-ld",
"reference": "ca3916d10d2ad9073b3b1eae383978dbe828e1e1"
},
"require": {
"ext-json": "*",
"php": ">=5.3.0"
"php": ">=5.4.0"
},
"type": "library",
"autoload": {
@ -66,27 +60,31 @@
"jsonld.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Digital Bazaar, Inc.",
"email": "support@digitalbazaar.com"
"email": "support@digitalbazaar.com",
"homepage": "http://digitalbazaar.com/"
},
{
"name": "Friendica Team",
"homepage": "https://friendi.ca/"
}
],
"description": "A JSON-LD Processor and API implementation in PHP.",
"homepage": "https://github.com/digitalbazaar/php-json-ld",
"homepage": "https://git.friendi.ca/friendica/php-json-ld",
"keywords": [
"JSON",
"JSON-LD",
"Linked Data",
"RDF",
"Semantic Web",
"json",
"jsonld"
],
"time": "2016-04-25T04:17:52+00:00"
"time": "2018-10-08T20:41:00+00:00"
}
],
"packages-dev": [

Wyświetl plik

@ -0,0 +1,118 @@
<?php
declare(strict_types=1);
/**
* Nextcloud - Social Support
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Maxence Lange <maxence@artificial-owl.com>
* @copyright 2018, Maxence Lange <maxence@artificial-owl.com>
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Social\Migration;
use Closure;
use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\Schema\SchemaException;
use Doctrine\DBAL\Types\Type;
use OCA\Social\Db\CoreRequestBuilder;
use OCP\DB\ISchemaWrapper;
use OCP\IDBConnection;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;
/**
* Class Version0001Date20190103000001
*
* @package OCA\Social\Migration
*/
class Version0001Date20190103000001 extends SimpleMigrationStep {
/** @var IDBConnection */
private $connection;
/** @var array */
public static $editToChar2000 = [
[CoreRequestBuilder::TABLE_CACHE_ACTORS, 'public_key']
];
/**
* @param IDBConnection $connection
*/
public function __construct(IDBConnection $connection) {
$this->connection = $connection;
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*
* @return ISchemaWrapper
* @throws SchemaException
* @throws DBALException
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options
): ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();
foreach (self::$editToChar2000 as $edit) {
list($tableName, $field) = $edit;
$table = $schema->getTable($tableName);
if ($table->hasColumn($field . '_copy')) {
continue;
}
$table->addColumn($field . '_copy', Type::TEXT, ['notnull' => false]);
}
return $schema;
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*/
public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options) {
foreach (self::$editToChar2000 as $edit) {
list($tableName, $field) = $edit;
$qb = $this->connection->getQueryBuilder();
$qb->update($tableName)
->set($field . '_copy', $field)
->execute();
}
}
}

Wyświetl plik

@ -0,0 +1,75 @@
<?php
declare(strict_types=1);
/**
* Nextcloud - Social Support
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Maxence Lange <maxence@artificial-owl.com>
* @copyright 2018, Maxence Lange <maxence@artificial-owl.com>
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Social\Migration;
use Closure;
use Doctrine\DBAL\Schema\SchemaException;
use OCP\DB\ISchemaWrapper;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;
/**
* Class Version0001Date20190103000002
*
* @package OCA\Social\Migration
*/
class Version0001Date20190103000002 extends SimpleMigrationStep {
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*
* @return ISchemaWrapper
* @throws SchemaException
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options
): ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();
foreach (Version0001Date20190103000001::$editToChar2000 as $edit) {
list($tableName, $field) = $edit;
$table = $schema->getTable($tableName);
if ($table->hasColumn($field) && $table->hasColumn($field . '_copy')) {
$table->dropColumn($field);
}
}
return $schema;
}
}

Wyświetl plik

@ -0,0 +1,111 @@
<?php
declare(strict_types=1);
/**
* Nextcloud - Social Support
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Maxence Lange <maxence@artificial-owl.com>
* @copyright 2018, Maxence Lange <maxence@artificial-owl.com>
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Social\Migration;
use Closure;
use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\Schema\SchemaException;
use Doctrine\DBAL\Types\Type;
use OCP\DB\ISchemaWrapper;
use OCP\IDBConnection;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;
/**
* Class Version0001Date20190103000003
*
* @package OCA\Social\Migration
*/
class Version0001Date20190103000003 extends SimpleMigrationStep {
/** @var IDBConnection */
private $connection;
/**
* @param IDBConnection $connection
*/
public function __construct(IDBConnection $connection) {
$this->connection = $connection;
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*
* @return ISchemaWrapper
* @throws SchemaException
* @throws DBALException
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options
): ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();
foreach (Version0001Date20190103000001::$editToChar2000 as $edit) {
list($tableName, $field) = $edit;
$table = $schema->getTable($tableName);
if ($table->hasColumn($field)) {
continue;
}
$table->addColumn($field, Type::STRING, ['notnull' => false, 'length' => 2000]);
}
return $schema;
}
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*/
public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options) {
foreach (Version0001Date20190103000001::$editToChar2000 as $edit) {
list($table, $field) = $edit;
$qb = $this->connection->getQueryBuilder();
$qb->update($table)
->set($field, $field . '_copy')
->execute();
}
}
}

Wyświetl plik

@ -0,0 +1,77 @@
<?php
declare(strict_types=1);
/**
* Nextcloud - Social Support
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Maxence Lange <maxence@artificial-owl.com>
* @copyright 2018, Maxence Lange <maxence@artificial-owl.com>
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Social\Migration;
use Closure;
use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\Schema\SchemaException;
use OCP\DB\ISchemaWrapper;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;
/**
* Class Version0001Date20190103000004
*
* @package OCA\Social\Migration
*/
class Version0001Date20190103000004 extends SimpleMigrationStep {
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
*
* @return ISchemaWrapper
* @throws SchemaException
* @throws DBALException
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options
): ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();
foreach (Version0001Date20190103000001::$editToChar2000 as $edit) {
list($tableName, $field) = $edit;
$table = $schema->getTable($tableName);
if ($table->hasColumn($field) && $table->hasColumn($field . '_copy')) {
$table->dropColumn($field . '_copy');
}
}
return $schema;
}
}

Wyświetl plik

@ -56,6 +56,9 @@ class LinkedDataSignature implements JsonSerializable {
/** @var string */
private $created = '';
/** @var string */
private $nonce = '';
/** @var string */
private $signatureValue = '';
@ -111,6 +114,26 @@ class LinkedDataSignature implements JsonSerializable {
return $this;
}
/**
* @return string
*/
public function getNonce(): string {
return $this->nonce;
}
/**
* @param string $nonce
*
* @return LinkedDataSignature
*/
public function setNonce(string $nonce): LinkedDataSignature {
$this->nonce = $nonce;
return $this;
}
/**
* @return string
*/
@ -237,19 +260,24 @@ class LinkedDataSignature implements JsonSerializable {
$header = [
'@context' => 'https://w3id.org/identity/v1',
'nonce' => $this->getNonce(),
'creator' => $this->getCreator(),
'created' => $this->getCreated()
];
$hash = $this->hashedCanonicalize($header) . $this->hashedCanonicalize($this->getObject());
$signed = base64_decode($this->getSignatureValue());
$hashHeader = $this->hashedCanonicalize($header, true);
$hashObject = $this->hashedCanonicalize($this->getObject());
$algo = OPENSSL_ALGO_SHA256;
if ($this->getType() === 'RsaSignature2017') {
$algo = OPENSSL_ALGO_SHA256;
}
if (openssl_verify($hash, $signed, $this->getPublicKey(), $algo) === 1) {
$signed = base64_decode($this->getSignatureValue());
if ($signed !== false
&& openssl_verify(
$hashHeader . $hashObject, $signed, $this->getPublicKey(), $algo
) === 1) {
return true;
}
@ -259,10 +287,21 @@ class LinkedDataSignature implements JsonSerializable {
/**
* @param array $data
*
* @param bool $removeEmptyValue
*
* @return string
*/
private function hashedCanonicalize(array $data): string {
$object = json_decode(json_encode($data), false);
private function hashedCanonicalize(array $data, bool $removeEmptyValue = false): string {
if ($removeEmptyValue) {
$data = array_filter(
$data,
function($v) {
return ($v !== '');
}
);
}
$object = json_decode(json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
$res = jsonld_normalize(
$object,
[
@ -293,6 +332,7 @@ class LinkedDataSignature implements JsonSerializable {
$this->setType($this->get('type', $signature, ''));
$this->setCreator($this->get('creator', $signature, ''));
$this->setNonce($this->get('nonce', $signature, ''));
$this->setCreated($this->get('created', $signature, ''));
$this->setSignatureValue($this->get('signatureValue', $signature, ''));