if ($no_exit) {
return false;
} else {
- throw new \Friendica\Network\HTTPException\BadRequestException();
+ throw new HTTPException\BadRequestException();
}
}
} else {
if ($no_exit) {
return false;
} else {
- throw new \Friendica\Network\HTTPException\BadRequestException();
+ throw new HTTPException\BadRequestException();
}
}
if ($no_exit) {
return false;
} else {
- throw new \Friendica\Network\HTTPException\BadRequestException();
+ throw new HTTPException\BadRequestException();
}
}
if ($no_exit) {
return false;
} else {
- throw new \Friendica\Network\HTTPException\BadRequestException();
+ throw new HTTPException\BadRequestException();
}
}
if ($no_exit) {
return false;
} else {
- throw new \Friendica\Network\HTTPException\BadRequestException();
+ throw new HTTPException\BadRequestException();
}
}
if (!$base) {
Logger::notice('unable to locate salmon data in xml');
- throw new \Friendica\Network\HTTPException\BadRequestException();
+ throw new HTTPException\BadRequestException();
}
$encoding = $base->encoding;
$alg = $base->alg;
-
$signed_data = $data . '.' . Strings::base64UrlEncode($type) . '.' . Strings::base64UrlEncode($encoding) . '.' . Strings::base64UrlEncode($alg);
-
// decode the data
$data = Strings::base64UrlDecode($data);
-
if ($public) {
$inner_decrypted = $data;
} else {
$key = self::key($author);
if (!$key) {
Logger::notice('Could not retrieve author key.');
- throw new \Friendica\Network\HTTPException\BadRequestException();
+ throw new HTTPException\BadRequestException();
}
$verify = Crypto::rsaVerify($signed_data, $signature, $key);
if (!$verify) {
Logger::notice('Message did not verify. Discarding.');
- throw new \Friendica\Network\HTTPException\BadRequestException();
+ throw new HTTPException\BadRequestException();
}
Logger::info('Message verified.');
*/
public static function dispatchPublic(array $msg, int $direction)
{
- $enabled = intval(DI::config()->get('system', 'diaspora_enabled'));
- if (!$enabled) {
+ if (!DI::config()->get('system', 'diaspora_enabled')) {
Logger::notice('Diaspora is disabled');
return false;
}
*/
private static function key(WebFingerUri $uri): string
{
- Logger::info('Fetching diaspora key', ['handle' => $uri->getAddr(), 'callstack' => System::callstack(20)]);
+ Logger::info('Fetching diaspora key', ['handle' => $uri->getAddr()]);
try {
return DI::dsprContact()->getByAddr($uri)->pubKey;
} catch (HTTPException\NotFoundException | \InvalidArgumentException $e) {
{
$item = Post::selectFirst(['id'], ['uid' => $uid, 'guid' => $guid]);
if (DBA::isResult($item)) {
- Logger::notice('Message ' . $guid . ' already exists for user ' . $uid);
+ Logger::notice('Message already exists.', ['uid' => $uid, 'guid' => $guid, 'id' => $item['id']]);
return $item['id'];
}
* Checks for links to posts in a message
*
* @param array $item The item array
+ *
* @return void
*/
private static function fetchGuid(array $item)
{
$fields = [
'id', 'parent', 'body', 'wall', 'uri', 'guid', 'private', 'origin',
+ 'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid',
'author-name', 'author-link', 'author-avatar', 'gravity',
'owner-name', 'owner-link', 'owner-avatar'
];
$datarray['verb'] = Activity::POST;
$datarray['gravity'] = Item::GRAVITY_COMMENT;
+ $datarray['private'] = $toplevel_parent_item['private'];
+ $datarray['allow_cid'] = $toplevel_parent_item['allow_cid'];
+ $datarray['allow_gid'] = $toplevel_parent_item['allow_gid'];
+ $datarray['deny_cid'] = $toplevel_parent_item['deny_cid'];
+ $datarray['deny_gid'] = $toplevel_parent_item['deny_gid'];
+
$datarray['thr-parent'] = $thr_parent ?: $toplevel_parent_item['uri'];
$datarray['object-type'] = Activity\ObjectType::COMMENT;
$datarray['verb'] = $verb;
$datarray['gravity'] = Item::GRAVITY_ACTIVITY;
+
+ $datarray['private'] = $toplevel_parent_item['private'];
+ $datarray['allow_cid'] = $toplevel_parent_item['allow_cid'];
+ $datarray['allow_gid'] = $toplevel_parent_item['allow_gid'];
+ $datarray['deny_cid'] = $toplevel_parent_item['deny_cid'];
+ $datarray['deny_gid'] = $toplevel_parent_item['deny_gid'];
+
$datarray['thr-parent'] = $toplevel_parent_item['uri'];
$datarray['object-type'] = Activity\ObjectType::NOTE;
}
/**
- * Processes poll participations - unssupported
+ * Processes poll participations - unsupported
*
* @param array $importer Array of the importer user
* @param object $data The message object
*
* @param int $uriid
* @param object $photo
+ *
* @return void
*/
private static function storePhotoAsMedia(int $uriid, $photo)
{
// @TODO Need to find object type, roland@f.haeder.net
Logger::debug('photo=' . get_class($photo));
- $data = [];
- $data['uri-id'] = $uriid;
- $data['type'] = Post\Media::IMAGE;
- $data['url'] = XML::unescape($photo->remote_photo_path) . XML::unescape($photo->remote_photo_name);
- $data['height'] = (int)XML::unescape($photo->height ?? 0);
- $data['width'] = (int)XML::unescape($photo->width ?? 0);
- $data['description'] = XML::unescape($photo->text ?? '');
+ $data = [
+ 'uri-id' => $uriid,
+ 'type' => Post\Media::IMAGE,
+ 'url' => XML::unescape($photo->remote_photo_path) . XML::unescape($photo->remote_photo_name),
+ 'height' => (int)XML::unescape($photo->height ?? 0),
+ 'width' => (int)XML::unescape($photo->width ?? 0),
+ 'description' => XML::unescape($photo->text ?? ''),
+ ];
Post\Media::insert($data);
}
$raw_body = $body = Markdown::toBBCode($text);
- $datarray = [];
+ $datarray = [
+ 'guid' => $guid,
+ 'plink' => self::plink($author, $guid),
+ 'uid' => $importer['uid'],
+ 'contact-id' => $contact['id'],
+ 'network' => Protocol::DIASPORA,
+ 'author-link' => $contact['url'],
+ 'author-id' => Contact::getIdForURL($contact['url'], 0),
+ 'verb' => Activity::POST,
+ 'gravity' => Item::GRAVITY_PARENT,
+ 'protocol' => Conversation::PARCEL_DIASPORA,
+ 'source' => $xml,
+ 'body' => self::replacePeopleGuid($body, $contact['url']),
+ 'raw-body' => self::replacePeopleGuid($raw_body, $contact['url']),
+ 'private' => (($public == 'false') ? Item::PRIVATE : Item::PUBLIC),
+ // Default is note (aka. comment), later below is being checked the real type
+ 'object-type' => Activity\ObjectType::NOTE,
+ 'post-type' => Item::PT_NOTE,
+ ];
- $datarray['guid'] = $guid;
- $datarray['uri'] = $datarray['thr-parent'] = self::getUriFromGuid($guid, $author);
- $datarray['uri-id'] = ItemURI::insert(['uri' => $datarray['uri'], 'guid' => $datarray['guid']]);
+ $datarray['uri'] = $datarray['thr-parent'] = self::getUriFromGuid($guid, $author);
+ $datarray['uri-id'] = ItemURI::insert(['uri' => $datarray['uri'], 'guid' => $datarray['guid']]);
+ $datarray['owner-link'] = $datarray['author-link'];
+ $datarray['owner-id'] = $datarray['author-id'];
+
+ $datarray = self::setDirection($datarray, $direction);
// Attach embedded pictures to the body
if ($data->photo) {
$datarray['object-type'] = Activity\ObjectType::IMAGE;
$datarray['post-type'] = Item::PT_IMAGE;
} elseif ($data->poll) {
- $datarray['object-type'] = Activity\ObjectType::NOTE;
$datarray['post-type'] = Item::PT_POLL;
- } else {
- $datarray['object-type'] = Activity\ObjectType::NOTE;
- $datarray['post-type'] = Item::PT_NOTE;
}
/// @todo enable support for polls
/// @todo enable support for events
- $datarray['uid'] = $importer['uid'];
- $datarray['contact-id'] = $contact['id'];
- $datarray['network'] = Protocol::DIASPORA;
-
- $datarray['author-link'] = $contact['url'];
- $datarray['author-id'] = Contact::getIdForURL($contact['url'], 0);
-
- $datarray['owner-link'] = $datarray['author-link'];
- $datarray['owner-id'] = $datarray['author-id'];
-
- $datarray['verb'] = Activity::POST;
- $datarray['gravity'] = Item::GRAVITY_PARENT;
-
- $datarray['protocol'] = Conversation::PARCEL_DIASPORA;
- $datarray['source'] = $xml;
-
- $datarray = self::setDirection($datarray, $direction);
-
- $datarray['body'] = self::replacePeopleGuid($body, $contact['url']);
- $datarray['raw-body'] = self::replacePeopleGuid($raw_body, $contact['url']);
-
self::storeMentions($datarray['uri-id'], $text);
Tag::storeRawTagsFromBody($datarray['uri-id'], $datarray['body']);
$datarray['app'] = $provider_display_name;
}
- $datarray['plink'] = self::plink($author, $guid);
- $datarray['private'] = (($public == 'false') ? Item::PRIVATE : Item::PUBLIC);
$datarray['changed'] = $datarray['created'] = $datarray['edited'] = $created_at;
if (isset($address['address'])) {
* ************************************************************************************** */
/**
- * returnes the handle of a contact
+ * returns the handle of a contact
*
* @param array $contact contact array
*
}
// Normally we should have a filled "addr" field - but in the past this wasn't the case
- // So - just in case - we build the the address here.
+ // So - just in case - we build the address here.
if ($contact['nickname'] != '') {
$nick = $contact['nickname'];
} else {
public static function buildMagicEnvelope(string $msg, array $user): string
{
$b64url_data = Strings::base64UrlEncode($msg);
- $data = str_replace(["\n", "\r", " ", "\t"], ['', '', '', ''], $b64url_data);
+ $data = str_replace(["\n", "\r", ' ', "\t"], ['', '', '', ''], $b64url_data);
$key_id = Strings::base64UrlEncode(self::myHandle($user));
$type = 'application/xml';
$xmldata = [
'me:env' => [
- 'me:data' => $data,
- '@attributes' => ['type' => $type],
- 'me:encoding' => $encoding,
- 'me:alg' => $alg,
- 'me:sig' => $sig,
+ 'me:data' => $data,
+ '@attributes' => ['type' => $type],
+ 'me:encoding' => $encoding,
+ 'me:alg' => $alg,
+ 'me:sig' => $sig,
'@attributes2' => ['key_id' => $key_id]
]
];
// The "addr" field should always be filled.
// If this isn't the case, it will raise a notice some lines later.
// And in the log we will see where it came from, and we can handle it there.
- Logger::notice('Empty addr', ['contact' => $contact ?? [], 'callstack' => System::callstack(20)]);
+ Logger::notice('Empty addr', ['contact' => $contact ?? []]);
}
$envelope = self::buildMessage($msg, $owner, $contact, $owner['uprvkey'], $pubkey ?? '', $public_batch);
// If the item belongs to a user, we take this user id.
if ($item['uid'] == 0) {
// @todo Possibly use an administrator account?
- $condition = [
- 'verified' => true, 'blocked' => false,
- 'account_removed' => false, 'account_expired' => false, 'account-type' => User::ACCOUNT_TYPE_PERSON
- ];
+ $condition = ['verified' => true, 'blocked' => false, 'account_removed' => false, 'account_expired' => false, 'account-type' => User::ACCOUNT_TYPE_PERSON];
$first_user = DBA::selectFirst('user', ['uid'], $condition, ['order' => ['uid']]);
$owner = User::getOwnerDataById($first_user['uid']);
} else {
if ($item['event-id'] > 0) {
$event = self::buildEvent($item['event-id']);
if (count($event)) {
- $message['event'] = $event;
+ // Deactivated, since Diaspora seems to have problems with the processing.
+ // $message['event'] = $event;
if (
!empty($event['location']['address']) &&
*/
private static function createProfileData(int $uid): array
{
- $profile = DBA::selectFirst('owner-view', ['uid', 'addr', 'name', 'location', 'net-publish', 'dob', 'about', 'pub_keywords'], ['uid' => $uid]);
+ $profile = DBA::selectFirst('owner-view', ['uid', 'addr', 'name', 'location', 'net-publish', 'dob', 'about', 'pub_keywords', 'updated'], ['uid' => $uid]);
if (!DBA::isResult($profile)) {
return [];
$data = [
'author' => $profile['addr'],
+ 'edited_at' => DateTimeFormat::utc($profile['updated']),
+ 'full_name' => $profile['name'],
'first_name' => $split_name['first'],
'last_name' => $split_name['last'],
'image_url' => DI::baseUrl() . '/photo/custom/300/' . $profile['uid'] . '.jpg',
'image_url_medium' => DI::baseUrl() . '/photo/custom/100/' . $profile['uid'] . '.jpg',
'image_url_small' => DI::baseUrl() . '/photo/custom/50/' . $profile['uid'] . '.jpg',
- 'searchable' => ($profile['net-publish'] ? 'true' : 'false'),
+ 'bio' => null,
'birthday' => null,
- 'about' => null,
+ 'gender' => null,
'location' => null,
- 'tag_string' => null,
+ 'searchable' => ($profile['net-publish'] ? 'true' : 'false'),
+ 'public' => 'false',
'nsfw' => 'false',
+ 'tag_string' => null,
];
if ($data['searchable'] === 'true') {
$data['birthday'] = DateTimeFormat::utc($year . '-' . $month . '-' . $day, 'Y-m-d');
}
- $data['about'] = BBCode::toMarkdown($profile['about'] ?? '');
+ $data['bio'] = BBCode::toMarkdown($profile['about'] ?? '');
$data['location'] = $profile['location'];
$data['tag_string'] = '';
// @todo Split this into single worker jobs
foreach ($recipients as $recipient) {
- Logger::info('Send updated profile data for user ' . $uid . ' to contact ' . $recipient['id']);
- self::buildAndTransmit($owner, $recipient, 'profile', $message);
+ if ((empty($recipient['gsid']) || GServer::isReachableById($recipient['gsid'])) && !Contact\User::isBlocked($recipient['id'], $uid)) {
+ Logger::info('Send updated profile data for user ' . $uid . ' to contact ' . $recipient['id']);
+ self::buildAndTransmit($owner, $recipient, 'profile', $message);
+ }
}
}
return false;
}
- if (!self::parentSupportDiaspora($item['thr-parent-id'])) {
+ if (!self::parentSupportDiaspora($item['thr-parent-id'], $uid)) {
Logger::info('One of the parents does not support Diaspora. A signature will not be created.', ['uri-id' => $item['uri-id'], 'guid' => $item['guid']]);
return false;
}
* Check if the parent and their parents support Diaspora
*
* @param integer $parent_id
+ * @param integer $uid
* @return boolean
* @throws InternalServerErrorException
* @throws \ImagickException
*/
- private static function parentSupportDiaspora(int $parent_id): bool
+ private static function parentSupportDiaspora(int $parent_id, int $uid): bool
{
- $parent_post = Post::selectFirstPost(['gravity', 'signed_text', 'author-link', 'thr-parent-id'], ['uri-id' => $parent_id]);
+ $parent_post = Post::selectFirst(['gravity', 'signed_text', 'author-link', 'thr-parent-id', 'protocol'], ['uri-id' => $parent_id, 'uid' => [0, $uid]]);
if (empty($parent_post['thr-parent-id'])) {
Logger::warning('Parent post does not exist.', ['parent-id' => $parent_id]);
return false;
return false;
}
- if (($parent_post['gravity'] == Item::GRAVITY_COMMENT) && empty($parent_post['signed_text'])) {
+ if (($parent_post['protocol'] != Conversation::PARCEL_DIASPORA) && ($parent_post['gravity'] == Item::GRAVITY_COMMENT) && empty($parent_post['signed_text'])) {
Logger::info('Parent comment has got no Diaspora signature.', ['parent-id' => $parent_id]);
return false;
}
if ($parent_post['gravity'] == Item::GRAVITY_COMMENT) {
- return self::parentSupportDiaspora($parent_post['thr-parent-id']);
+ return self::parentSupportDiaspora($parent_post['thr-parent-id'], $uid);
}
return true;