deactivate social avatars from twitter

Signed-off-by: call-me-matt <nextcloud@matthiasheinisch.de>
This commit is contained in:
call-me-matt 2023-07-07 01:02:37 +02:00
parent cecab50d2d
commit 82fde0e121
No known key found for this signature in database
GPG Key ID: F141C4C1F8F39D19
6 changed files with 3 additions and 324 deletions

View File

@ -1 +0,0 @@
<svg aria-hidden="true" focusable="false" data-prefix="fab" data-icon="twitter" class="svg-inline--fa fa-twitter fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"></path></svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -32,7 +32,6 @@ class CompositeSocialProvider {
public function __construct(InstagramProvider $instagramProvider,
MastodonProvider $mastodonProvider,
TwitterProvider $twitterProvider,
// FacebookProvider $facebookProvider,
TumblrProvider $tumblrProvider,
DiasporaProvider $diasporaProvider,
@ -43,8 +42,7 @@ class CompositeSocialProvider {
$this->providers = [
$instagramProvider->name => $instagramProvider,
$mastodonProvider->name => $mastodonProvider,
$twitterProvider->name => $twitterProvider,
// $facebookProvider->name => $facebookProvider,
// $facebookProvider->name => $facebookProvider,
$tumblrProvider->name => $tumblrProvider,
$diasporaProvider->name => $diasporaProvider,
$xingProvider->name => $xingProvider,

View File

@ -25,7 +25,6 @@ namespace OCA\Contacts\Service\Social;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\RequestOptions;
use OC\AppFramework\Http\Request;
use OCA\Contacts\AppInfo\Application;
use OCP\Http\Client\IClientService;
use Psr\Log\LoggerInterface;
@ -127,7 +126,6 @@ class TelegramProvider implements ISocialProvider {
try {
$result = $this->httpClient->get($url, [
RequestOptions::HEADERS => [
// Make the request as google bot so twitter display the full static html page
'User-Agent' => 'Googlebot/2.1'
]
]);

View File

@ -1,156 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2020 Matthias Heinisch <nextcloud@matthiasheinisch.de>
*
* @author Matthias Heinisch <nextcloud@matthiasheinisch.de>
*
* @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\Contacts\Service\Social;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\RequestOptions;
use OC\AppFramework\Http\Request;
use OCA\Contacts\AppInfo\Application;
use OCP\Http\Client\IClientService;
use Psr\Log\LoggerInterface;
class TwitterProvider implements ISocialProvider {
/** @var IClientService */
private $httpClient;
/** @var LoggerInterface */
private $logger;
/** @var string */
public $name = 'twitter';
public function __construct(IClientService $httpClient,
LoggerInterface $logger) {
$this->httpClient = $httpClient->NewClient();
$this->logger = $logger;
}
/**
* Returns if this provider supports this contact
*
* @param {array} contact info
*
* @return bool
*/
public function supportsContact(array $contact):bool {
if (!array_key_exists('X-SOCIALPROFILE', $contact)) {
return false;
}
$socialprofiles = $this->getProfileIds($contact);
return isset($socialprofiles) && count($socialprofiles) > 0;
}
/**
* Returns the profile-picture url
*
* @param {array} contact information
*
* @return array
*/
public function getImageUrls(array $contact):array {
$profileIds = $this->getProfileIds($contact);
$urls = [];
foreach ($profileIds as $profileId) {
$recipe = 'https://twitter.com/{socialId}';
$connector = str_replace('{socialId}', $profileId, $recipe);
$connector = $this->getFromHtml($connector, 'profile_image');
$urls[] = $connector;
}
return $urls;
}
/**
* Returns the profile-id
*
* @param {string} the value from the contact's x-socialprofile
*
* @return string
*/
protected function cleanupId(string $candidate):string {
$candidate = basename($candidate);
if ($candidate[0] === '@') {
$candidate = substr($candidate, 1);
}
return $candidate;
}
/**
* Returns all possible profile ids for contact
*
* @param {array} contact information
*
* @return array of string profile ids
*/
protected function getProfileIds($contact):array {
$socialprofiles = $contact['X-SOCIALPROFILE'];
$profileIds = [];
if (isset($socialprofiles)) {
foreach ($socialprofiles as $profile) {
if (strtolower($profile['type']) == $this->name) {
$profileIds[] = $this->cleanupId($profile['value']);
}
}
}
return $profileIds;
}
/**
* extracts desired value from an html page
*
* @param {string} url the target from where to fetch the content
* @param {String} the desired catchword to filter for
*
* @returns {String} the extracted value (first match) or null if not present
*/
protected function getFromHtml(string $url, string $desired) : ?string {
try {
$result = $this->httpClient->get($url, [
RequestOptions::HEADERS => [
// Make the request as google bot so twitter display the full static html page
'User-Agent' => 'Googlebot/2.1'
]
]);
$htmlResult = new \DOMDocument();
$htmlResult->loadHTML($result->getBody());
$imgs = $htmlResult->getElementsByTagName('img');
foreach ($imgs as $img) {
foreach ($img->attributes as $attr) {
$value = $attr->nodeValue;
if (strpos($value, $desired)) {
$value = str_replace('normal', '400x400', $value);
return $value;
}
}
}
return null;
} catch (RequestException $e) {
$this->logger->debug('Error fetching twitter urls', [
'app' => Application::APP_ID,
'exception' => $e
]);
return null;
}
}
}

View File

@ -139,13 +139,13 @@ class TelegramProviderTest extends TestCase {
$contactWithoutSocialImgs = [];
return [
'contact with twitter fields' => [
'contact with social fields' => [
$contactWithSocial,
$contactWithSocialHtml,
$contactWithSocialUrls,
$contactWithSocialImgs
],
'contact without twitter fields' => [
'contact without social fields' => [
$contactWithoutSocial,
$contactWithoutSocialHtml,
$contactWithoutSocialUrls,

View File

@ -1,160 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2020 Matthias Heinisch <nextcloud@matthiasheinisch.de>
*
* @author Matthias Heinisch <nextcloud@matthiasheinisch.de>
*
* @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\Contacts\Service\Social;
use OCP\Http\Client\IClient;
use OCP\Http\Client\IResponse;
use OCP\Http\Client\IClientService;
use ChristophWurst\Nextcloud\Testing\TestCase;
use PHPUnit\Framework\MockObject\MockObject;
use Psr\Log\LoggerInterface;
class TwitterProviderTest extends TestCase {
private $provider;
/** @var IClientService|MockObject */
private $clientService;
/** @var LoggerInterface|MockObject */
private $logger;
/** @var IClient|MockObject */
private $client;
/** @var IResponse|MockObject */
private $response;
protected function setUp(): void {
parent::setUp();
$this->clientService = $this->createMock(IClientService::class);
$this->logger = $this->createMock(LoggerInterface::class);
$this->response = $this->createMock(IResponse::class);
$this->client = $this->createMock(IClient::class);
$this->clientService
->method('NewClient')
->willReturn($this->client);
$this->provider = new TwitterProvider(
$this->clientService,
$this->logger
);
}
public function dataProviderSupportsContact() {
$contactWithSocial = [
'X-SOCIALPROFILE' => [
['value' => 'username1', 'type' => 'twitter'],
['value' => 'username2', 'type' => 'twitter']
]
];
$contactWithoutSocial = [
'X-SOCIALPROFILE' => [
['value' => 'one', 'type' => 'social2'],
['value' => 'two', 'type' => 'social1']
]
];
return [
'contact with twitter fields' => [$contactWithSocial, true],
'contact without twitter fields' => [$contactWithoutSocial, false]
];
}
/**
* @dataProvider dataProviderSupportsContact
*/
public function testSupportsContact($contact, $expected) {
$result = $this->provider->supportsContact($contact);
$this->assertEquals($expected, $result);
}
public function dataProviderGetImageUrls() {
$contactWithSocial = [
'X-SOCIALPROFILE' => [
['value' => 'https://twitter.com/username1', 'type' => 'twitter'],
['value' => 'https://twitter.com/@username2', 'type' => 'twitter']
]
];
$contactWithSocialUrls = [
'https://twitter.com/username1',
'https://twitter.com/username2',
];
$contactWithSocialHtml = [
'<html><img src="./profile_images/username1_normal.jpg" /></html>',
'<html><img src="./profile_images/username2_normal.jpg" /></html>',
];
$contactWithSocialImgs = [
'./profile_images/username1_400x400.jpg',
'./profile_images/username2_400x400.jpg'
];
$contactWithoutSocial = [
'X-SOCIALPROFILE' => [
['value' => 'one', 'type' => 'social2'],
['value' => 'two', 'type' => 'social1']
]
];
$contactWithoutSocialUrls = [];
$contactWithoutSocialHtml = [];
$contactWithoutSocialImgs = [];
return [
'contact with twitter fields' => [
$contactWithSocial,
$contactWithSocialHtml,
$contactWithSocialUrls,
$contactWithSocialImgs
],
'contact without twitter fields' => [
$contactWithoutSocial,
$contactWithoutSocialHtml,
$contactWithoutSocialUrls,
$contactWithoutSocialImgs
]
];
}
/**
* @dataProvider dataProviderGetImageUrls
*/
public function testGetImageUrls($contact, $htmls, $urls, $imgs) {
if (count($urls)) {
$this->response->method('getBody')->willReturnOnConsecutiveCalls(...$htmls);
$this->client
->expects($this->exactly(count($urls)))
->method('get')
->withConsecutive(...array_map(function ($a) {
return [$a];
}, $urls))
->willReturn($this->response);
}
$result = $this->provider->getImageUrls($contact);
$this->assertEquals($imgs, $result);
}
}