--- /dev/null
+<?php
+
+namespace Wallabag\CoreBundle\DataFixtures\ORM;
+
+use Doctrine\Common\DataFixtures\AbstractFixture;
+use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
+use Doctrine\Common\Persistence\ObjectManager;
+use Wallabag\CoreBundle\Entity\SiteCredential;
+
+class LoadSiteCredentialData extends AbstractFixture implements OrderedFixtureInterface
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function load(ObjectManager $manager)
+ {
+ $credential = new SiteCredential($this->getReference('admin-user'));
+ $credential->setHost('example.com');
+ $credential->setUsername('foo');
+ $credential->setPassword('bar');
+
+ $manager->persist($credential);
+
+ $manager->flush();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getOrder()
+ {
+ return 50;
+ }
+}
use Graby\SiteConfig\ConfigBuilder;
use Psr\Log\LoggerInterface;
use Wallabag\CoreBundle\Repository\SiteCredentialRepository;
-use Wallabag\UserBundle\Entity\User;
+use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
class GrabySiteConfigBuilder implements SiteConfigBuilder
{
private $logger;
/**
- * @var User
+ * @var Wallabag\UserBundle\Entity\User|null
*/
private $currentUser;
* GrabySiteConfigBuilder constructor.
*
* @param ConfigBuilder $grabyConfigBuilder
- * @param User $currentUser
+ * @param TokenStorage $token
* @param SiteCredentialRepository $credentialRepository
* @param LoggerInterface $logger
*/
- public function __construct(ConfigBuilder $grabyConfigBuilder, User $currentUser, SiteCredentialRepository $credentialRepository, LoggerInterface $logger)
+ public function __construct(ConfigBuilder $grabyConfigBuilder, TokenStorage $token, SiteCredentialRepository $credentialRepository, LoggerInterface $logger)
{
$this->grabyConfigBuilder = $grabyConfigBuilder;
$this->credentialRepository = $credentialRepository;
- $this->currentUser = $currentUser;
$this->logger = $logger;
+
+ if ($token->getToken()) {
+ $this->currentUser = $token->getToken()->getUser();
+ }
}
/**
$host = substr($host, 4);
}
- $credentials = $this->credentialRepository->findOneByHostAndUser($host, $this->currentUser->getId());
+ $credentials = null;
+ if ($this->currentUser) {
+ $credentials = $this->credentialRepository->findOneByHostAndUser($host, $this->currentUser->getId());
+ }
if (null === $credentials) {
$this->logger->debug('Auth: no credentials available for host.', ['host' => $host]);
class: Wallabag\CoreBundle\GuzzleSiteAuthenticator\GrabySiteConfigBuilder
arguments:
- "@wallabag_core.graby.config_builder"
- - "@=service('security.token_storage').getToken().getUser()"
+ - "@security.token_storage"
- "@wallabag_core.site_credential_repository"
- '@logger'
tags:
# save_link: 'Save a link'
back_to_unread: 'Tilbage til de ulæste artikler'
# users_management: 'Users management'
+ # site_credentials: 'Site credentials'
top:
add_new_entry: 'Tilføj ny artikel'
search: 'Søg'
save_link: 'Link speichern'
back_to_unread: 'Zurück zu ungelesenen Artikeln'
users_management: 'Benutzerverwaltung'
+ # site_credentials: 'Site credentials'
top:
add_new_entry: 'Neuen Artikel hinzufügen'
search: 'Suche'
save_link: 'Save a link'
back_to_unread: 'Back to unread articles'
users_management: 'Users management'
+ site_credentials: 'Site credentials'
top:
add_new_entry: 'Add a new entry'
search: 'Search'
save_link: 'Guardar un enlace'
back_to_unread: 'Volver a los artículos sin leer'
users_management: 'Configuración de usuarios'
+ # site_credentials: 'Site credentials'
top:
add_new_entry: 'Añadir un nuevo artículo'
search: 'Buscar'
save_link: 'ذخیرهٔ یک پیوند'
back_to_unread: 'بازگشت به خواندهنشدهها'
# users_management: 'Users management'
+ # site_credentials: 'Site credentials'
top:
add_new_entry: 'افزودن مقالهٔ تازه'
search: 'جستجو'
save_link: "Sauvegarder un nouvel article"
back_to_unread: "Retour aux articles non lus"
users_management: "Gestion des utilisateurs"
+ site_credentials: 'Accès aux sites'
top:
add_new_entry: "Sauvegarder un nouvel article"
search: "Rechercher"
save_link: 'Salva collegamento'
back_to_unread: 'Torna ai contenuti non letti'
# users_management: 'Users management'
+ # site_credentials: 'Site credentials'
top:
add_new_entry: 'Aggiungi un nuovo contenuto'
search: 'Cerca'
save_link: 'Enregistrar un novèl article'
back_to_unread: 'Tornar als articles pas legits'
users_management: 'Gestion dels utilizaires'
+ # site_credentials: 'Site credentials'
top:
add_new_entry: 'Enregistrar un novèl article'
search: 'Cercar'
save_link: 'Zapisz link'
back_to_unread: 'Powrót do nieprzeczytanych artykułów'
users_management: 'Zarządzanie użytkownikami'
+ # site_credentials: 'Site credentials'
top:
add_new_entry: 'Dodaj nowy wpis'
search: 'Szukaj'
save_link: 'Salvar um link'
back_to_unread: 'Voltar para os artigos não lidos'
users_management: 'Gestão de Usuários'
+ # site_credentials: 'Site credentials'
top:
add_new_entry: 'Adicionar uma nova entrada'
search: 'Pesquisa'
# save_link: 'Save a link'
back_to_unread: 'Înapoi la articolele necitite'
# users_management: 'Users management'
+ # site_credentials: 'Site credentials'
top:
add_new_entry: 'Introdu un nou articol'
search: 'Căutare'
# save_link: 'Save a link'
back_to_unread: 'Okunmayan makalelere geri dön'
# users_management: 'Users management'
+ # site_credentials: 'Site credentials'
top:
add_new_entry: 'Yeni bir makale ekle'
search: 'Ara'
<button onclick="return confirm('{{ 'site_credential.form.delete_confirm'|trans|escape('js') }}')" type="submit" class="btn waves-effect waves-light red">{{ 'site_credential.form.delete'|trans }}</button>
{{ form_end(delete_form) }}
</p>
- <p><a class="waves-effect waves-light btn blue-grey" href="{{ path('site_credential_index') }}">{{ 'site_credential.form.back_to_list'|trans }}</a></p>
+ <p><a class="waves-effect waves-light btn blue-grey" href="{{ path('site_credentials_index') }}">{{ 'site_credential.form.back_to_list'|trans }}</a></p>
</div>
</div>
</div>
<td>{{ credential.host }}</td>
<td>{{ credential.username }}</td>
<td>
- <a href="{{ path('site_credential_edit', { 'id': credential.id }) }}">{{ 'site_credential.list.edit_action'|trans }}</a>
+ <a href="{{ path('site_credentials_edit', { 'id': credential.id }) }}">{{ 'site_credential.list.edit_action'|trans }}</a>
</td>
</tr>
{% endfor %}
</table>
<br />
<p>
- <a href="{{ path('site_credential_new') }}" class="waves-effect waves-light btn">{{ 'site_credential.list.create_new_one'|trans }}</a>
+ <a href="{{ path('site_credentials_new') }}" class="waves-effect waves-light btn">{{ 'site_credential.list.create_new_one'|trans }}</a>
</p>
</div>
</div>
{{ form_widget(form.save, {'attr': {'class': 'btn waves-effect waves-light'}}) }}
{{ form_rest(form) }}
</form>
- <p><a class="waves-effect waves-light btn blue-grey" href="{{ path('site_credential_index') }}">{{ 'site_credential.form.back_to_list'|trans }}</a></p>
+ <p><a class="waves-effect waves-light btn blue-grey" href="{{ path('site_credentials_index') }}">{{ 'site_credential.form.back_to_list'|trans }}</a></p>
</div>
</div>
</div>
{{ render(controller("WallabagCoreBundle:Entry:searchForm", {'currentRoute': app.request.attributes.get('_route')})) }}
</div>
</li>
+ {% if craue_setting('restricted_access') %}
+ <li class="menu site_credentials"><a href="{{ path('site_credentials_index') }}">{{ 'menu.left.site_credentials'|trans }}</a></li>
+ {% endif %}
<li class="menu config"><a href="{{ path('config') }}">{{ 'menu.left.config'|trans }}</a></li>
{% if is_granted('ROLE_SUPER_ADMIN') %}
<li class="menu users"><a href="{{ path('user_index') }}">{{ 'menu.left.users_management'|trans }}</a></li>
<li class="bold {% if currentRoute == 'config' %}active{% endif %}">
<a class="waves-effect" href="{{ path('config') }}">{{ 'menu.left.config'|trans }}</a>
</li>
+ {% if craue_setting('restricted_access') %}
+ <li class="bold {% if currentRoute starts with 'site_credentials_' %}active{% endif %}">
+ <a class="waves-effect" href="{{ path('site_credentials_index') }}">{{ 'menu.left.site_credentials'|trans }}</a>
+ </li>
+ {% endif %}
{% if is_granted('ROLE_SUPER_ADMIN') %}
<li class="bold {% if currentRoute starts with 'user_' %}active{% endif %}">
<a class="waves-effect" href="{{ path('user_index') }}">{{ 'menu.left.users_management'|trans }}</a>
--- /dev/null
+<?php
+
+namespace Tests\Wallabag\CoreBundle\Controller;
+
+use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
+
+class SiteCredentialControllerTest extends WallabagCoreTestCase
+{
+ public function testListSiteCredential()
+ {
+ $this->logInAs('admin');
+ $client = $this->getClient();
+
+ $crawler = $client->request('GET', '/site-credentials/');
+
+ $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+ $body = $crawler->filter('body')->extract(['_text'])[0];
+
+ $this->assertContains('site_credential.description', $body);
+ $this->assertContains('site_credential.list.create_new_one', $body);
+ }
+
+ public function testNewSiteCredential()
+ {
+ $this->logInAs('admin');
+ $client = $this->getClient();
+
+ $crawler = $client->request('GET', '/site-credentials/new');
+
+ $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+ $body = $crawler->filter('body')->extract(['_text'])[0];
+
+ $this->assertContains('site_credential.new_site_credential', $body);
+ $this->assertContains('site_credential.form.back_to_list', $body);
+
+ $form = $crawler->filter('button[id=site_credential_save]')->form();
+
+ $data = [
+ 'site_credential[host]' => 'google.io',
+ 'site_credential[username]' => 'sergei',
+ 'site_credential[password]' => 'microsoft',
+ ];
+
+ $client->submit($form, $data);
+
+ $this->assertEquals(302, $client->getResponse()->getStatusCode());
+
+ $crawler = $client->followRedirect();
+
+ $this->assertContains('flashes.site_credential.notice.added', $crawler->filter('body')->extract(['_text'])[0]);
+ }
+
+ /**
+ * @depends testNewSiteCredential
+ */
+ public function testEditSiteCredential()
+ {
+ $this->logInAs('admin');
+ $client = $this->getClient();
+
+ $credential = $client->getContainer()
+ ->get('doctrine.orm.entity_manager')
+ ->getRepository('WallabagCoreBundle:SiteCredential')
+ ->findOneByHost('google.io');
+
+ $crawler = $client->request('GET', '/site-credentials/'.$credential->getId().'/edit');
+
+ $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+ $body = $crawler->filter('body')->extract(['_text'])[0];
+
+ $this->assertContains('site_credential.edit_site_credential', $body);
+ $this->assertContains('site_credential.form.back_to_list', $body);
+
+ $form = $crawler->filter('button[id=site_credential_save]')->form();
+
+ $data = [
+ 'site_credential[host]' => 'google.io',
+ 'site_credential[username]' => 'larry',
+ 'site_credential[password]' => 'microsoft',
+ ];
+
+ $client->submit($form, $data);
+
+ $this->assertEquals(302, $client->getResponse()->getStatusCode());
+
+ $crawler = $client->followRedirect();
+
+ $this->assertContains('flashes.site_credential.notice.updated', $crawler->filter('body')->extract(['_text'])[0]);
+ $this->assertContains('larry', $crawler->filter('input[id=site_credential_username]')->attr('value'));
+ }
+
+ /**
+ * @depends testNewSiteCredential
+ */
+ public function testEditFromADifferentUserSiteCredential()
+ {
+ $this->logInAs('bob');
+ $client = $this->getClient();
+
+ $credential = $client->getContainer()
+ ->get('doctrine.orm.entity_manager')
+ ->getRepository('WallabagCoreBundle:SiteCredential')
+ ->findOneByHost('google.io');
+
+ $client->request('GET', '/site-credentials/'.$credential->getId().'/edit');
+
+ $this->assertEquals(403, $client->getResponse()->getStatusCode());
+ }
+
+ /**
+ * @depends testNewSiteCredential
+ */
+ public function testDeleteSiteCredential()
+ {
+ $this->logInAs('admin');
+ $client = $this->getClient();
+
+ $credential = $client->getContainer()
+ ->get('doctrine.orm.entity_manager')
+ ->getRepository('WallabagCoreBundle:SiteCredential')
+ ->findOneByHost('google.io');
+
+ $crawler = $client->request('GET', '/site-credentials/'.$credential->getId().'/edit');
+
+ $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+ $deleteForm = $crawler->filter('body')->selectButton('site_credential.form.delete')->form();
+
+ $client->submit($deleteForm, []);
+
+ $this->assertEquals(302, $client->getResponse()->getStatusCode());
+
+ $crawler = $client->followRedirect();
+
+ $this->assertContains('flashes.site_credential.notice.deleted', $crawler->filter('body')->extract(['_text'])[0]);
+ }
+}
use Graby\SiteConfig\SiteConfig as GrabySiteConfig;
use PHPUnit_Framework_TestCase;
use Wallabag\CoreBundle\GuzzleSiteAuthenticator\GrabySiteConfigBuilder;
+use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
+use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
class GrabySiteConfigBuilderTest extends PHPUnit_Framework_TestCase
{
public function testBuildConfigExists()
{
/* @var \Graby\SiteConfig\ConfigBuilder|\PHPUnit_Framework_MockObject_MockObject */
- $grabyConfigBuilderMock = $this->getMockBuilder('\Graby\SiteConfig\ConfigBuilder')
+ $grabyConfigBuilderMock = $this->getMockBuilder('Graby\SiteConfig\ConfigBuilder')
->disableOriginalConstructor()
->getMock();
$handler = new TestHandler();
$logger->pushHandler($handler);
+ $siteCrentialRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\SiteCredentialRepository')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $siteCrentialRepo->expects($this->once())
+ ->method('findOneByHostAndUser')
+ ->with('example.com', 1)
+ ->willReturn(['username' => 'foo', 'password' => 'bar']);
+
+ $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);
+
$this->builder = new GrabySiteConfigBuilder(
$grabyConfigBuilderMock,
- ['example.com' => ['username' => 'foo', 'password' => 'bar']],
+ $tokenStorage,
+ $siteCrentialRepo,
$logger
);
$handler = new TestHandler();
$logger->pushHandler($handler);
+ $siteCrentialRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\SiteCredentialRepository')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $siteCrentialRepo->expects($this->once())
+ ->method('findOneByHostAndUser')
+ ->with('unknown.com', 1)
+ ->willReturn(null);
+
+ $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);
+
$this->builder = new GrabySiteConfigBuilder(
$grabyConfigBuilderMock,
- [],
+ $tokenStorage,
+ $siteCrentialRepo,
$logger
);