Merge remote-tracking branch 'origin/master' into 2.4

This commit is contained in:
Jeremy Benoist 2019-05-15 14:38:07 +02:00
commit 9f0957b831
No known key found for this signature in database
GPG key ID: BCA73962457ACC3C
26 changed files with 253 additions and 64 deletions

View file

@ -1,5 +1,21 @@
# Changelog # Changelog
## [2.3.8](https://github.com/wallabag/wallabag/tree/2.3.8)
[Full Changelog](https://github.com/wallabag/wallabag/compare/2.3.7...2.3.8)
### Fixes
- Jump to 2.3.8-dev [#3897](https://github.com/wallabag/wallabag/pull/3897)
- material: fix left padding on non-entry pages [#3901](https://github.com/wallabag/wallabag/pull/3901)
- Make dev/install/update script posix compatible [#3860](https://github.com/wallabag/wallabag/pull/3860)
- epub: fix exception when articles have the same title [#3908](https://github.com/wallabag/wallabag/pull/3908)
- Fix PHP warning [#3909](https://github.com/wallabag/wallabag/pull/3909)
- Add ability to match many domains for credentials [#3937](https://github.com/wallabag/wallabag/pull/3937)
- material: add metadata to list view [#3942](https://github.com/wallabag/wallabag/pull/3942)
- Enable no-referrer on img tags, enable strict-origin-when-cross-origin by default [#3943](https://github.com/wallabag/wallabag/pull/3943)
- Remove preview picture from share view page#3922
- Fix Intl Locale issue [#3964](https://github.com/wallabag/wallabag/pull/3964)
## [2.3.7](https://github.com/wallabag/wallabag/tree/2.3.7) ## [2.3.7](https://github.com/wallabag/wallabag/tree/2.3.7)
[Full Changelog](https://github.com/wallabag/wallabag/compare/2.3.6...2.3.7) [Full Changelog](https://github.com/wallabag/wallabag/compare/2.3.6...2.3.7)

View file

@ -18,6 +18,24 @@ main {
overflow: hidden; overflow: hidden;
} }
@mixin mixin-reading-time {
.reading-time {
display: inline-flex;
vertical-align: middle;
.card-reading-time,
.card-created-at {
display: inline-flex;
}
span {
margin-right: 5px;
}
@content;
}
}
.card { .card {
.card-content .card-title, .card-content .card-title,
.card-reveal .card-title { .card-reveal .card-title {
@ -98,19 +116,7 @@ main {
margin-right: 5px !important; margin-right: 5px !important;
} }
.reading-time { @include mixin-reading-time;
display: inline-flex;
vertical-align: middle;
.card-reading-time,
.card-created-at {
display: inline-flex;
}
span {
margin-right: 5px;
}
}
} }
.card-image { .card-image {
@ -235,10 +241,18 @@ a.original:not(.waves-effect) {
} }
div.metadata { div.metadata {
overflow: hidden;
height: 1.5em;
display: flex;
ul.tags {
margin-left: 4px;
}
.chip { .chip {
background-color: $blueAccentColor; background-color: $blueAccentColor;
padding: 0 7px; padding: 0 7px;
margin: auto 2px; margin: auto 1px;
border-radius: 6px; border-radius: 6px;
line-height: 22px; line-height: 22px;
height: 22px; height: 22px;
@ -255,6 +269,16 @@ a.original:not(.waves-effect) {
padding-left: 8px; padding-left: 8px;
} }
} }
@include mixin-reading-time {
padding: 0 5px;
flex-wrap: wrap;
margin-left: auto;
i.material-icons {
font-size: 20px;
}
}
} }
div.card-content { div.card-content {

View file

@ -173,6 +173,10 @@
.row .col { .row .col {
padding: 0; padding: 0;
} }
.card-stacked div.metadata .reading-time {
display: none;
}
} }
@media screen and (max-width: 310px), @media screen and (max-width: 310px),

View file

@ -1,5 +1,5 @@
wallabag_core: wallabag_core:
version: 2.3.8-dev version: 2.3.8
paypal_url: "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=9UBA65LG3FX9Y&lc=gb" paypal_url: "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=9UBA65LG3FX9Y&lc=gb"
languages: languages:
en: 'English' en: 'English'

View file

@ -5,20 +5,39 @@ namespace Wallabag\CoreBundle\DataFixtures;
use Doctrine\Bundle\FixturesBundle\Fixture; use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\DataFixtures\DependentFixtureInterface; use Doctrine\Common\DataFixtures\DependentFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager; use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Wallabag\CoreBundle\Entity\SiteCredential; use Wallabag\CoreBundle\Entity\SiteCredential;
use Wallabag\UserBundle\DataFixtures\UserFixtures; use Wallabag\UserBundle\DataFixtures\UserFixtures;
class SiteCredentialFixtures extends Fixture implements DependentFixtureInterface class SiteCredentialFixtures extends Fixture implements DependentFixtureInterface, ContainerAwareInterface
{ {
/**
* @var ContainerInterface
*/
private $container;
public function setContainer(ContainerInterface $container = null)
{
$this->container = $container;
}
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function load(ObjectManager $manager) public function load(ObjectManager $manager)
{ {
$credential = new SiteCredential($this->getReference('admin-user')); $credential = new SiteCredential($this->getReference('admin-user'));
$credential->setHost('example.com'); $credential->setHost('.super.com');
$credential->setUsername('foo'); $credential->setUsername($this->container->get('wallabag_core.helper.crypto_proxy')->crypt('.super'));
$credential->setPassword('bar'); $credential->setPassword($this->container->get('wallabag_core.helper.crypto_proxy')->crypt('bar'));
$manager->persist($credential);
$credential = new SiteCredential($this->getReference('admin-user'));
$credential->setHost('paywall.example.com');
$credential->setUsername($this->container->get('wallabag_core.helper.crypto_proxy')->crypt('paywall.example'));
$credential->setPassword($this->container->get('wallabag_core.helper.crypto_proxy')->crypt('bar'));
$manager->persist($credential); $manager->persist($credential);

View file

@ -62,11 +62,24 @@ class GrabySiteConfigBuilder implements SiteConfigBuilder
$host = substr($host, 4); $host = substr($host, 4);
} }
$credentials = null; if (!$this->currentUser) {
if ($this->currentUser) { $this->logger->debug('Auth: no current user defined.');
$credentials = $this->credentialRepository->findOneByHostAndUser($host, $this->currentUser->getId());
return false;
} }
$hosts = [$host];
// will try to see for a host without the first subdomain (fr.example.org & .example.org)
$split = explode('.', $host);
if (\count($split) > 1) {
// remove first subdomain
array_shift($split);
$hosts[] = '.' . implode('.', $split);
}
$credentials = $this->credentialRepository->findOneByHostsAndUser($hosts, $this->currentUser->getId());
if (null === $credentials) { if (null === $credentials) {
$this->logger->debug('Auth: no credentials available for host.', ['host' => $host]); $this->logger->debug('Auth: no credentials available for host.', ['host' => $host]);

View file

@ -47,6 +47,7 @@ class ContentProxy
*/ */
public function updateEntry(Entry $entry, $url, array $content = [], $disableContentUpdate = false) public function updateEntry(Entry $entry, $url, array $content = [], $disableContentUpdate = false)
{ {
$this->graby->toggleImgNoReferrer(true);
if (!empty($content['html'])) { if (!empty($content['html'])) {
$content['html'] = $this->graby->cleanupHtml($content['html'], $url); $content['html'] = $this->graby->cleanupHtml($content['html'], $url);
} }

View file

@ -19,16 +19,16 @@ class SiteCredentialRepository extends \Doctrine\ORM\EntityRepository
/** /**
* Retrieve one username/password for the given host and userId. * Retrieve one username/password for the given host and userId.
* *
* @param string $host * @param array $hosts An array of host to look for
* @param int $userId * @param int $userId
* *
* @return array|null * @return array|null
*/ */
public function findOneByHostAndUser($host, $userId) public function findOneByHostsAndUser($hosts, $userId)
{ {
$res = $this->createQueryBuilder('s') $res = $this->createQueryBuilder('s')
->select('s.username', 's.password') ->select('s.username', 's.password')
->where('s.host = :hostname')->setParameter('hostname', $host) ->where('s.host IN (:hosts)')->setParameter('hosts', $hosts)
->andWhere('s.user = :userId')->setParameter('userId', $userId) ->andWhere('s.user = :userId')->setParameter('userId', $userId)
->setMaxResults(1) ->setMaxResults(1)
->getQuery() ->getQuery()

View file

@ -572,7 +572,7 @@ site_credential:
# create_new_one: Create a new credential # create_new_one: Create a new credential
# form: # form:
# username_label: 'Username' # username_label: 'Username'
# host_label: 'Host' # host_label: 'Host (subdomain.example.org, .example.org, etc.)'
# password_label: 'Password' # password_label: 'Password'
# save: Save # save: Save
# delete: Delete # delete: Delete

View file

@ -563,7 +563,7 @@ site_credential:
create_new_one: 'Einen neuen Seitenzugang anlegen' create_new_one: 'Einen neuen Seitenzugang anlegen'
form: form:
username_label: 'Benutzername' username_label: 'Benutzername'
host_label: 'Host' host_label: 'Host (subdomain.example.org, .example.org, etc.)'
password_label: 'Passwort' password_label: 'Passwort'
save: 'Speichern' save: 'Speichern'
delete: 'Löschen' delete: 'Löschen'

View file

@ -572,7 +572,7 @@ site_credential:
create_new_one: Create a new credential create_new_one: Create a new credential
form: form:
username_label: 'Username' username_label: 'Username'
host_label: 'Host' host_label: 'Host (subdomain.example.org, .example.org, etc.)'
password_label: 'Password' password_label: 'Password'
save: Save save: Save
delete: Delete delete: Delete

View file

@ -572,7 +572,7 @@ site_credential:
# create_new_one: Create a new credential # create_new_one: Create a new credential
# form: # form:
# username_label: 'Username' # username_label: 'Username'
# host_label: 'Host' # host_label: 'Host (subdomain.example.org, .example.org, etc.)'
# password_label: 'Password' # password_label: 'Password'
# save: Save # save: Save
# delete: Delete # delete: Delete

View file

@ -572,7 +572,7 @@ site_credential:
# create_new_one: Create a new credential # create_new_one: Create a new credential
# form: # form:
# username_label: 'Username' # username_label: 'Username'
# host_label: 'Host' # host_label: 'Host (subdomain.example.org, .example.org, etc.)'
# password_label: 'Password' # password_label: 'Password'
# save: Save # save: Save
# delete: Delete # delete: Delete

View file

@ -573,7 +573,7 @@ site_credential:
create_new_one: Créer un nouvel accès à un site create_new_one: Créer un nouvel accès à un site
form: form:
username_label: 'Identifiant' username_label: 'Identifiant'
host_label: 'Domaine' host_label: 'Domaine (subdomain.example.org, .example.org, etc.)'
password_label: 'Mot de passe' password_label: 'Mot de passe'
save: "Sauvegarder" save: "Sauvegarder"
delete: "Supprimer" delete: "Supprimer"

View file

@ -571,7 +571,7 @@ site_credential:
# create_new_one: Create a new credential # create_new_one: Create a new credential
# form: # form:
# username_label: 'Username' # username_label: 'Username'
# host_label: 'Host' # host_label: 'Host (subdomain.example.org, .example.org, etc.)'
# password_label: 'Password' # password_label: 'Password'
# save: Save # save: Save
# delete: Delete # delete: Delete

View file

@ -571,7 +571,7 @@ site_credential:
create_new_one: Crear un novèl identificant create_new_one: Crear un novèl identificant
form: form:
username_label: "Nom d'utilizaire" username_label: "Nom d'utilizaire"
host_label: 'Òste' host_label: 'Òste (subdomain.example.org, .example.org, etc.)'
password_label: 'Senhal' password_label: 'Senhal'
save: 'Enregistrar' save: 'Enregistrar'
delete: 'Suprimir' delete: 'Suprimir'

View file

@ -571,7 +571,7 @@ site_credential:
create_new_one: Stwórz nowe poświadczenie create_new_one: Stwórz nowe poświadczenie
form: form:
username_label: 'Nazwa użytkownika' username_label: 'Nazwa użytkownika'
host_label: 'Host' host_label: 'Host (subdomain.example.org, .example.org, etc.)'
password_label: 'Hasło' password_label: 'Hasło'
save: Zapisz save: Zapisz
delete: Usuń delete: Usuń

View file

@ -571,7 +571,7 @@ site_credential:
# create_new_one: Create a new credential # create_new_one: Create a new credential
form: form:
# username_label: 'Username' # username_label: 'Username'
# host_label: 'Host' # host_label: 'Host (subdomain.example.org, .example.org, etc.)'
# password_label: 'Password' # password_label: 'Password'
save: 'Salvar' save: 'Salvar'
delete: 'Apagar' delete: 'Apagar'

View file

@ -571,7 +571,7 @@ site_credential:
# create_new_one: Create a new credential # create_new_one: Create a new credential
# form: # form:
# username_label: 'Username' # username_label: 'Username'
# host_label: 'Host' # host_label: 'Host (subdomain.example.org, .example.org, etc.)'
# password_label: 'Password' # password_label: 'Password'
# save: Save # save: Save
# delete: Delete # delete: Delete

View file

@ -569,7 +569,7 @@ site_credential:
create_new_one: สร้างข้อมูลส่วนตัวใหม่ create_new_one: สร้างข้อมูลส่วนตัวใหม่
form: form:
username_label: 'ชื่อผู้ใช้' username_label: 'ชื่อผู้ใช้'
host_label: 'โฮส' host_label: 'โฮส (subdomain.example.org, .example.org, etc.)'
password_label: 'รหัสผ่าน' password_label: 'รหัสผ่าน'
save: บันทึก save: บันทึก
delete: ลบ delete: ลบ

View file

@ -8,6 +8,7 @@
{% block head %} {% block head %}
<meta name="viewport" content="initial-scale=1.0"> <meta name="viewport" content="initial-scale=1.0">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="referrer" content="strict-origin-when-cross-origin">
<!--[if IE]> <!--[if IE]>
<meta http-equiv="X-UA-Compatible" content="IE=10"> <meta http-equiv="X-UA-Compatible" content="IE=10">
<![endif]--> <![endif]-->

View file

@ -29,9 +29,6 @@
<h1>{{ entry.title|e|raw }}</h1> <h1>{{ entry.title|e|raw }}</h1>
<a href="{{ entry.url|e }}" target="_blank" rel="noopener" title="{{ 'entry.view.original_article'|trans }} : {{ entry.title|e|raw }}" class="tool">{{ entry.domainName|removeWww }}</a> <a href="{{ entry.url|e }}" target="_blank" rel="noopener" title="{{ 'entry.view.original_article'|trans }} : {{ entry.title|e|raw }}" class="tool">{{ entry.domainName|removeWww }}</a>
<p class="shared-by">{{ "entry.public.shared_by_wallabag"|trans({'%wallabag_instance%': url('homepage'), '%username%': entry.user.username})|raw }}.</p> <p class="shared-by">{{ "entry.public.shared_by_wallabag"|trans({'%wallabag_instance%': url('homepage'), '%username%': entry.user.username})|raw }}.</p>
{% if entry.previewPicture is not null %}
<img class="preview" src="{{ entry.previewPicture }}" alt="{{ entry.title|striptags|e('html_attr') }}" />
{% endif %}
</header> </header>
<article class="block"> <article class="block">
{{ entry.content | raw }} {{ entry.content | raw }}

View file

@ -8,8 +8,11 @@
<div class="{{ subClass|default('original grey-text') }}"> <div class="{{ subClass|default('original grey-text') }}">
<a href="{{ entry.url|e }}" target="_blank" title="{{ entry.domainName|removeWww }}" class="tool grey-text">{{ entry.domainName|removeWww }}</a> <a href="{{ entry.url|e }}" target="_blank" title="{{ entry.domainName|removeWww }}" class="tool grey-text">{{ entry.domainName|removeWww }}</a>
{% if withTags is defined %} {% if withMetadata is defined %}
{% include "@WallabagCore/themes/material/Entry/_tags.html.twig" with {'tags': entry.tags | slice(0, 3), 'entryId': entry.id, 'listClass': ' hide-on-med-and-down'} only %} {% include "@WallabagCore/themes/material/Entry/_tags.html.twig" with {'tags': entry.tags | slice(0, 3), 'entryId': entry.id, 'listClass': ' hide-on-med-and-down'} only %}
<div class="reading-time grey-text">
<div class="card-reading-time">{% include "@WallabagCore/themes/material/Entry/_reading_time.html.twig" with {'entry': entry} only %}</div>
</div>
{% endif %} {% endif %}
</div> </div>
</div> </div>

View file

@ -5,7 +5,7 @@
<span class="preview{{ previewClassModifier }}" style="background-image: url({{ entry.previewPicture | default(asset('wallassets/themes/_global/img/logo-square.svg')) }})"></span> <span class="preview{{ previewClassModifier }}" style="background-image: url({{ entry.previewPicture | default(asset('wallassets/themes/_global/img/logo-square.svg')) }})"></span>
</a> </a>
</div> </div>
{% include "@WallabagCore/themes/material/Entry/Card/_content.html.twig" with {'entry': entry, 'withTags': true, 'subClass': 'metadata'} only %} {% include "@WallabagCore/themes/material/Entry/Card/_content.html.twig" with {'entry': entry, 'withMetadata': true, 'subClass': 'metadata'} only %}
<ul class="tools-list hide-on-small-only"> <ul class="tools-list hide-on-small-only">
<li> <li>
<a title="{{ 'entry.list.toogle_as_read'|trans }}" class="tool grey-text" href="{{ path('archive_entry', { 'id': entry.id }) }}"><i class="material-icons">{% if entry.isArchived == 0 %}done{% else %}unarchive{% endif %}</i></a> <a title="{{ 'entry.list.toogle_as_read'|trans }}" class="tool grey-text" href="{{ path('archive_entry', { 'id': entry.id }) }}"><i class="material-icons">{% if entry.isArchived == 0 %}done{% else %}unarchive{% endif %}</i></a>

View file

@ -5,26 +5,22 @@ namespace Tests\Wallabag\CoreBundle\GuzzleSiteAuthenticator;
use Graby\SiteConfig\SiteConfig as GrabySiteConfig; use Graby\SiteConfig\SiteConfig as GrabySiteConfig;
use Monolog\Handler\TestHandler; use Monolog\Handler\TestHandler;
use Monolog\Logger; use Monolog\Logger;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
use Wallabag\CoreBundle\GuzzleSiteAuthenticator\GrabySiteConfigBuilder; use Wallabag\CoreBundle\GuzzleSiteAuthenticator\GrabySiteConfigBuilder;
class GrabySiteConfigBuilderTest extends TestCase class GrabySiteConfigBuilderTest extends WallabagCoreTestCase
{ {
/** @var \Wallabag\CoreBundle\GuzzleSiteAuthenticator\GrabySiteConfigBuilder */
protected $builder;
public function testBuildConfigExists() public function testBuildConfigExists()
{ {
/* @var \Graby\SiteConfig\ConfigBuilder|\PHPUnit_Framework_MockObject_MockObject */
$grabyConfigBuilderMock = $this->getMockBuilder('Graby\SiteConfig\ConfigBuilder') $grabyConfigBuilderMock = $this->getMockBuilder('Graby\SiteConfig\ConfigBuilder')
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
$grabySiteConfig = new GrabySiteConfig(); $grabySiteConfig = new GrabySiteConfig();
$grabySiteConfig->requires_login = true; $grabySiteConfig->requires_login = true;
$grabySiteConfig->login_uri = 'http://www.example.com/login'; $grabySiteConfig->login_uri = 'http://api.example.com/login';
$grabySiteConfig->login_username_field = 'login'; $grabySiteConfig->login_username_field = 'login';
$grabySiteConfig->login_password_field = 'password'; $grabySiteConfig->login_password_field = 'password';
$grabySiteConfig->login_extra_fields = ['field=value']; $grabySiteConfig->login_extra_fields = ['field=value'];
@ -32,7 +28,7 @@ class GrabySiteConfigBuilderTest extends TestCase
$grabyConfigBuilderMock $grabyConfigBuilderMock
->method('buildForHost') ->method('buildForHost')
->with('example.com') ->with('api.example.com')
->willReturn($grabySiteConfig); ->willReturn($grabySiteConfig);
$logger = new Logger('foo'); $logger = new Logger('foo');
@ -43,8 +39,8 @@ class GrabySiteConfigBuilderTest extends TestCase
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
$siteCrentialRepo->expects($this->once()) $siteCrentialRepo->expects($this->once())
->method('findOneByHostAndUser') ->method('findOneByHostsAndUser')
->with('example.com', 1) ->with(['api.example.com', '.example.com'], 1)
->willReturn(['username' => 'foo', 'password' => 'bar']); ->willReturn(['username' => 'foo', 'password' => 'bar']);
$user = $this->getMockBuilder('Wallabag\UserBundle\Entity\User') $user = $this->getMockBuilder('Wallabag\UserBundle\Entity\User')
@ -59,18 +55,18 @@ class GrabySiteConfigBuilderTest extends TestCase
$tokenStorage = new TokenStorage(); $tokenStorage = new TokenStorage();
$tokenStorage->setToken($token); $tokenStorage->setToken($token);
$this->builder = new GrabySiteConfigBuilder( $builder = new GrabySiteConfigBuilder(
$grabyConfigBuilderMock, $grabyConfigBuilderMock,
$tokenStorage, $tokenStorage,
$siteCrentialRepo, $siteCrentialRepo,
$logger $logger
); );
$config = $this->builder->buildForHost('www.example.com'); $config = $builder->buildForHost('api.example.com');
$this->assertSame('example.com', $config->getHost()); $this->assertSame('api.example.com', $config->getHost());
$this->assertTrue($config->requiresLogin()); $this->assertTrue($config->requiresLogin());
$this->assertSame('http://www.example.com/login', $config->getLoginUri()); $this->assertSame('http://api.example.com/login', $config->getLoginUri());
$this->assertSame('login', $config->getUsernameField()); $this->assertSame('login', $config->getUsernameField());
$this->assertSame('password', $config->getPasswordField()); $this->assertSame('password', $config->getPasswordField());
$this->assertSame(['field' => 'value'], $config->getExtraFields()); $this->assertSame(['field' => 'value'], $config->getExtraFields());
@ -85,7 +81,6 @@ class GrabySiteConfigBuilderTest extends TestCase
public function testBuildConfigDoesntExist() public function testBuildConfigDoesntExist()
{ {
/* @var \Graby\SiteConfig\ConfigBuilder|\PHPUnit_Framework_MockObject_MockObject */
$grabyConfigBuilderMock = $this->getMockBuilder('\Graby\SiteConfig\ConfigBuilder') $grabyConfigBuilderMock = $this->getMockBuilder('\Graby\SiteConfig\ConfigBuilder')
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
@ -103,8 +98,8 @@ class GrabySiteConfigBuilderTest extends TestCase
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
$siteCrentialRepo->expects($this->once()) $siteCrentialRepo->expects($this->once())
->method('findOneByHostAndUser') ->method('findOneByHostsAndUser')
->with('unknown.com', 1) ->with(['unknown.com', '.com'], 1)
->willReturn(null); ->willReturn(null);
$user = $this->getMockBuilder('Wallabag\UserBundle\Entity\User') $user = $this->getMockBuilder('Wallabag\UserBundle\Entity\User')
@ -119,14 +114,14 @@ class GrabySiteConfigBuilderTest extends TestCase
$tokenStorage = new TokenStorage(); $tokenStorage = new TokenStorage();
$tokenStorage->setToken($token); $tokenStorage->setToken($token);
$this->builder = new GrabySiteConfigBuilder( $builder = new GrabySiteConfigBuilder(
$grabyConfigBuilderMock, $grabyConfigBuilderMock,
$tokenStorage, $tokenStorage,
$siteCrentialRepo, $siteCrentialRepo,
$logger $logger
); );
$config = $this->builder->buildForHost('unknown.com'); $config = $builder->buildForHost('unknown.com');
$this->assertFalse($config); $this->assertFalse($config);
@ -137,7 +132,6 @@ class GrabySiteConfigBuilderTest extends TestCase
public function testBuildConfigWithBadExtraFields() public function testBuildConfigWithBadExtraFields()
{ {
/* @var \Graby\SiteConfig\ConfigBuilder|\PHPUnit_Framework_MockObject_MockObject */
$grabyConfigBuilderMock = $this->getMockBuilder('Graby\SiteConfig\ConfigBuilder') $grabyConfigBuilderMock = $this->getMockBuilder('Graby\SiteConfig\ConfigBuilder')
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
@ -202,4 +196,121 @@ class GrabySiteConfigBuilderTest extends TestCase
$this->assertCount(1, $records, 'One log was recorded'); $this->assertCount(1, $records, 'One log was recorded');
} }
public function testBuildConfigUserNotDefined()
{
$grabyConfigBuilderMock = $this->getMockBuilder('\Graby\SiteConfig\ConfigBuilder')
->disableOriginalConstructor()
->getMock();
$grabyConfigBuilderMock
->method('buildForHost')
->with('unknown.com')
->willReturn(new GrabySiteConfig());
$logger = new Logger('foo');
$handler = new TestHandler();
$logger->pushHandler($handler);
$siteCrentialRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\SiteCredentialRepository')
->disableOriginalConstructor()
->getMock();
$tokenStorage = new TokenStorage();
$builder = new GrabySiteConfigBuilder(
$grabyConfigBuilderMock,
$tokenStorage,
$siteCrentialRepo,
$logger
);
$config = $builder->buildForHost('unknown.com');
$this->assertFalse($config);
}
public function dataProviderCredentials()
{
return [
[
'host' => 'example.com',
],
[
'host' => 'other.example.com',
],
[
'host' => 'paywall.example.com',
'expectedUsername' => 'paywall.example',
'expectedPassword' => 'bar',
],
[
'host' => 'api.super.com',
'expectedUsername' => '.super',
'expectedPassword' => 'bar',
],
[
'host' => '.super.com',
'expectedUsername' => '.super',
'expectedPassword' => 'bar',
],
];
}
/**
* @dataProvider dataProviderCredentials
*/
public function testBuildConfigWithDbAccess($host, $expectedUsername = null, $expectedPassword = null)
{
$grabyConfigBuilderMock = $this->getMockBuilder('Graby\SiteConfig\ConfigBuilder')
->disableOriginalConstructor()
->getMock();
$grabySiteConfig = new GrabySiteConfig();
$grabySiteConfig->requires_login = true;
$grabySiteConfig->login_uri = 'http://api.example.com/login';
$grabySiteConfig->login_username_field = 'login';
$grabySiteConfig->login_password_field = 'password';
$grabySiteConfig->login_extra_fields = ['field=value'];
$grabySiteConfig->not_logged_in_xpath = '//div[@class="need-login"]';
$grabyConfigBuilderMock
->method('buildForHost')
->with($host)
->willReturn($grabySiteConfig);
$user = $this->getMockBuilder('Wallabag\UserBundle\Entity\User')
->disableOriginalConstructor()
->getMock();
$user->expects($this->once())
->method('getId')
->willReturn(1);
$token = new UsernamePasswordToken($user, 'pass', 'provider');
$tokenStorage = new TokenStorage();
$tokenStorage->setToken($token);
$logger = new Logger('foo');
$handler = new TestHandler();
$logger->pushHandler($handler);
$builder = new GrabySiteConfigBuilder(
$grabyConfigBuilderMock,
$tokenStorage,
$this->getClient()->getContainer()->get('wallabag_core.site_credential_repository'),
$logger
);
$config = $builder->buildForHost($host);
if (null === $expectedUsername && null === $expectedPassword) {
$this->assertFalse($config);
return;
}
$this->assertSame($expectedUsername, $config->getUsername());
$this->assertSame($expectedPassword, $config->getPassword());
}
} }

File diff suppressed because one or more lines are too long