new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
new FOS\RestBundle\FOSRestBundle(),
+ new FOS\UserBundle\FOSUserBundle(),
new JMS\SerializerBundle\JMSSerializerBundle(),
new Nelmio\ApiDocBundle\NelmioApiDocBundle(),
new Nelmio\CorsBundle\NelmioCorsBundle(),
# bundle_resource_dir:
# - %%dir%%/views/themes/%%current_theme%%/%%bundle_name%%/%%template%%
# - %%dir%%/views/%%bundle_name%%/%%override_path%%
+
+fos_user:
+ db_driver: orm
+ firewall_name: main
+ user_class: Wallabag\CoreBundle\Entity\User
providers:
administrators:
entity: { class: WallabagCoreBundle:User, property: username }
+ fos_userbundle:
+ id: fos_user.user_provider.username
# the main part of the security, where you can set up firewalls
# for specific sections of your app
anonymous: ~
secured_area:
- pattern: ^/
- anonymous: ~
+ pattern: ^/
form_login:
- login_path: /login
-
- use_forward: false
-
- check_path: /login_check
-
- post_only: true
-
- always_use_default_target_path: false
- default_target_path: /
- target_path_parameter: _target_path
- use_referer: true
-
- failure_path: null
- failure_forward: false
-
- username_parameter: _username
- password_parameter: _password
-
- csrf_parameter: _csrf_token
- intention: authenticate
+ provider: fos_userbundle
+ csrf_provider: security.csrf.token_manager
+ anonymous: true
remember_me:
key: "%secret%"
lifetime: 31536000
+++ /dev/null
-../vendor/umpirsky/twig-gettext-extractor/twig-gettext-extractor
\ No newline at end of file
"liip/theme-bundle": "~1.1.3",
"pagerfanta/pagerfanta": "~1.0.3",
"lexik/form-filter-bundle": "~4.0",
- "j0k3r/graby": "~1.0"
+ "j0k3r/graby": "~1.0",
+ "friendsofsymfony/user-bundle": "dev-master"
},
"require-dev": {
"doctrine/doctrine-fixtures-bundle": "~2.2.0",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
- "hash": "f5520667cebcae76568ff448172854bd",
+ "hash": "d457fa385420eb29a177ac38eac977c3",
"packages": [
{
"name": "doctrine/annotations",
},
{
"name": "doctrine/orm",
- "version": "v2.5.1",
+ "version": "v2.5.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/doctrine2.git",
- "reference": "e6a83bedbe67579cb0bfb688e982e617943a2945"
+ "reference": "aa80c7d2c55a372f5f9f825f5c66dbda53a6e3fe"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/e6a83bedbe67579cb0bfb688e982e617943a2945",
- "reference": "e6a83bedbe67579cb0bfb688e982e617943a2945",
+ "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/aa80c7d2c55a372f5f9f825f5c66dbda53a6e3fe",
+ "reference": "aa80c7d2c55a372f5f9f825f5c66dbda53a6e3fe",
"shasum": ""
},
"require": {
"database",
"orm"
],
- "time": "2015-08-31 12:59:39"
+ "time": "2015-04-02 20:40:18"
},
{
"name": "ezyang/htmlpurifier",
],
"time": "2015-06-16 08:39:26"
},
+ {
+ "name": "friendsofsymfony/user-bundle",
+ "version": "dev-master",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/FriendsOfSymfony/FOSUserBundle.git",
+ "reference": "336d9cd8ba0c5a462b3e70be144a7bef5377b219"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/FriendsOfSymfony/FOSUserBundle/zipball/336d9cd8ba0c5a462b3e70be144a7bef5377b219",
+ "reference": "336d9cd8ba0c5a462b3e70be144a7bef5377b219",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2",
+ "symfony/form": "~2.3",
+ "symfony/framework-bundle": "~2.3",
+ "symfony/security-bundle": "~2.3",
+ "symfony/twig-bundle": "~2.3"
+ },
+ "require-dev": {
+ "doctrine/doctrine-bundle": "~1.3",
+ "swiftmailer/swiftmailer": "~4.3|~5",
+ "symfony/validator": "~2.3",
+ "symfony/yaml": "~2.3",
+ "willdurand/propel-typehintable-behavior": "~1.0"
+ },
+ "suggest": {
+ "willdurand/propel-typehintable-behavior": "Needed when using the propel implementation"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "FOS\\UserBundle\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christophe Coevoet",
+ "email": "stof@notk.org"
+ },
+ {
+ "name": "FriendsOfSymfony Community",
+ "homepage": "https://github.com/friendsofsymfony/FOSUserBundle/contributors"
+ },
+ {
+ "name": "Thibault Duplessis",
+ "email": "thibault.duplessis@gmail.com"
+ }
+ ],
+ "description": "Symfony FOSUserBundle",
+ "homepage": "http://friendsofsymfony.github.com",
+ "keywords": [
+ "User management"
+ ],
+ "time": "2015-08-14 09:45:59"
+ },
{
"name": "guzzlehttp/guzzle",
"version": "5.3.0",
},
{
"name": "symfony/assetic-bundle",
- "version": "v2.7.0",
+ "version": "v2.6.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/AsseticBundle.git",
- "reference": "3ae5c8ca3079b6e0033cc9fbfb6500e2bc964da5"
+ "reference": "422b0add2110f0cf9bc7a873a386ea053f4a89f0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/AsseticBundle/zipball/3ae5c8ca3079b6e0033cc9fbfb6500e2bc964da5",
- "reference": "3ae5c8ca3079b6e0033cc9fbfb6500e2bc964da5",
+ "url": "https://api.github.com/repos/symfony/AsseticBundle/zipball/422b0add2110f0cf9bc7a873a386ea053f4a89f0",
+ "reference": "422b0add2110f0cf9bc7a873a386ea053f4a89f0",
"shasum": ""
},
"require": {
- "kriswallsmith/assetic": "~1.3",
+ "kriswallsmith/assetic": "~1.2",
"php": ">=5.3.0",
"symfony/console": "~2.3",
"symfony/dependency-injection": "~2.3",
"symfony/framework-bundle": "~2.3",
"symfony/yaml": "~2.3"
},
- "conflict": {
- "kriswallsmith/spork": "<=0.2",
- "twig/twig": "<1.20"
- },
"require-dev": {
- "kriswallsmith/spork": "~0.3",
+ "kriswallsmith/spork": "~0.2",
"patchwork/jsqueeze": "~1.0",
"symfony/class-loader": "~2.3",
"symfony/css-selector": "~2.3",
"symfony/dom-crawler": "~2.3",
- "symfony/phpunit-bridge": "~2.7",
"symfony/twig-bundle": "~2.3"
},
"suggest": {
"type": "symfony-bundle",
"extra": {
"branch-alias": {
- "dev-master": "2.7-dev"
+ "dev-master": "2.5-dev"
}
},
"autoload": {
"compression",
"minification"
],
- "time": "2015-09-01 00:05:29"
+ "time": "2015-01-27 12:45:16"
},
{
"name": "symfony/monolog-bundle",
},
{
"name": "symfony/symfony",
- "version": "v2.7.4",
+ "version": "v2.7.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/symfony.git",
- "reference": "1fdf23fe28876844b887b0e1935c9adda43ee645"
+ "reference": "a9af4708b4bb650c4897e9b8dfbfbdb2ea5f0486"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/symfony/zipball/1fdf23fe28876844b887b0e1935c9adda43ee645",
- "reference": "1fdf23fe28876844b887b0e1935c9adda43ee645",
+ "url": "https://api.github.com/repos/symfony/symfony/zipball/a9af4708b4bb650c4897e9b8dfbfbdb2ea5f0486",
+ "reference": "a9af4708b4bb650c4897e9b8dfbfbdb2ea5f0486",
"shasum": ""
},
"require": {
"doctrine/common": "~2.3",
"php": ">=5.3.9",
"psr/log": "~1.0",
- "twig/twig": "~1.20|~2.0"
+ "twig/twig": "~1.18"
},
"replace": {
"symfony/asset": "self.version",
"keywords": [
"framework"
],
- "time": "2015-09-08 14:26:39"
+ "time": "2015-07-31 13:24:45"
},
{
"name": "tecnick.com/tcpdf",
},
{
"name": "twig/extensions",
- "version": "v1.3.0",
+ "version": "v1.2.0",
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig-extensions.git",
- "reference": "449e3c8a9ffad7c2479c7864557275a32b037499"
+ "reference": "8cf4b9fe04077bd54fc73f4fde83347040c3b8cd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/twigphp/Twig-extensions/zipball/449e3c8a9ffad7c2479c7864557275a32b037499",
- "reference": "449e3c8a9ffad7c2479c7864557275a32b037499",
+ "url": "https://api.github.com/repos/twigphp/Twig-extensions/zipball/8cf4b9fe04077bd54fc73f4fde83347040c3b8cd",
+ "reference": "8cf4b9fe04077bd54fc73f4fde83347040c3b8cd",
"shasum": ""
},
"require": {
- "twig/twig": "~1.20|~2.0"
+ "twig/twig": "~1.12"
},
"require-dev": {
"symfony/translation": "~2.3"
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.3-dev"
+ "dev-master": "1.2.x-dev"
}
},
"autoload": {
"i18n",
"text"
],
- "time": "2015-08-22 16:38:35"
+ "time": "2014-10-30 14:30:03"
},
{
"name": "twig/twig",
],
"authors": [
{
- "name": "William DURAND",
+ "name": "William Durand",
"email": "william.durand1@gmail.com"
}
],
],
"authors": [
{
- "name": "William DURAND",
+ "name": "William Durand",
"email": "william.durand1@gmail.com"
}
],
},
{
"name": "phpunit/phpunit",
- "version": "4.8.6",
+ "version": "4.8.5",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "2246830f4a1a551c67933e4171bf2126dc29d357"
+ "reference": "9b7417edaf28059ea63d86be941e6004dbfcc0cc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2246830f4a1a551c67933e4171bf2126dc29d357",
- "reference": "2246830f4a1a551c67933e4171bf2126dc29d357",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9b7417edaf28059ea63d86be941e6004dbfcc0cc",
+ "reference": "9b7417edaf28059ea63d86be941e6004dbfcc0cc",
"shasum": ""
},
"require": {
"testing",
"xunit"
],
- "time": "2015-08-24 04:09:38"
+ "time": "2015-08-19 09:20:57"
},
{
"name": "phpunit/phpunit-mock-objects",
],
"aliases": [],
"minimum-stability": "dev",
- "stability-flags": [],
+ "stability-flags": {
+ "friendsofsymfony/user-bundle": 20
+ },
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
$user->setUsername($dialog->ask($this->defaultOutput, '<question>Username</question> <comment>(default: wallabag)</comment> :', 'wallabag'));
$user->setPassword($dialog->ask($this->defaultOutput, '<question>Password</question> <comment>(default: wallabag)</comment> :', 'wallabag'));
$user->setEmail($dialog->ask($this->defaultOutput, '<question>Email:</question>', ''));
+ $user->setEnabled(true);
$em->persist($user);
*/
private function isDatabasePresent()
{
- $databaseName = $this->getContainer()->getParameter('database_name');
+ $connection = $this->getContainer()->get('doctrine')->getManager()->getConnection();
+ $databaseName = $connection->getDatabase();
try {
- $schemaManager = $this->getContainer()->get('doctrine')->getManager()->getConnection()->getSchemaManager();
+ $schemaManager = $connection->getSchemaManager();
} catch (\Exception $exception) {
if (false !== strpos($exception->getMessage(), sprintf("Unknown database '%s'", $databaseName))) {
return false;
}
// handle changing user information
- $userForm = $this->createForm(new UserInformationType(), $user);
+ $userForm = $this->createForm(new UserInformationType(), $user, array('validation_groups' => array('Profile')));
$userForm->handleRequest($request);
if ($userForm->isValid()) {
// handle adding new user
$newUser = new User();
- $newUserForm = $this->createForm(new NewUserType(), $newUser);
+ $newUserForm = $this->createForm(new NewUserType(), $newUser, array('validation_groups' => array('Profile')));
$newUserForm->handleRequest($request);
if ($newUserForm->isValid()) {
$userAdmin->setEmail('bigboss@wallabag.org');
$userAdmin->setUsername('admin');
$userAdmin->setPassword('mypassword');
+ $userAdmin->setEnabled(true);
$manager->persist($userAdmin);
$bobUser->setEmail('bobby@wallabag.org');
$bobUser->setUsername('bob');
$bobUser->setPassword('mypassword');
+ $bobUser->setEnabled(true);
$manager->persist($bobUser);
use Symfony\Component\Validator\Constraints as Assert;
use JMS\Serializer\Annotation\ExclusionPolicy;
use JMS\Serializer\Annotation\Expose;
+use FOS\UserBundle\Model\User as BaseUser;
/**
* User.
* @UniqueEntity("email")
* @UniqueEntity("username")
*/
-class User implements AdvancedUserInterface, \Serializable
+class User extends BaseUser implements AdvancedUserInterface, \Serializable
{
/**
* @var int
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
- private $id;
-
- /**
- * @var string
- *
- * @ORM\Column(name="username", type="text")
- * @Assert\NotBlank()
- * @Assert\Length(
- * min = "3",
- * max = "255"
- * )
- */
- private $username;
-
- /**
- * @var string
- *
- * @ORM\Column(type="string", length=32)
- */
- private $salt;
-
- /**
- * @var string
- *
- * @ORM\Column(name="password", type="text")
- */
- private $password;
+ protected $id;
/**
* @var string
*
* @ORM\Column(name="name", type="text", nullable=true)
*/
- private $name;
-
- /**
- * @var string
- *
- * @ORM\Column(name="email", type="text", nullable=false)
- * @Assert\Email()
- * @Assert\NotBlank()
- */
- private $email;
-
- /**
- * @ORM\Column(name="is_active", type="boolean", nullable=false)
- */
- private $isActive = true;
-
- /**
- * @ORM\Column(name="confirmation_token", type="string", nullable=true)
- */
- private $confirmationToken;
-
- /**
- * @ORM\Column(name="password_requested_at", type="datetime", nullable=true)
- */
- private $passwordRequestedAt;
+ protected $name;
/**
* @var date
*
* @ORM\Column(name="created_at", type="datetime")
*/
- private $createdAt;
+ protected $createdAt;
/**
* @var date
*
* @ORM\Column(name="updated_at", type="datetime")
*/
- private $updatedAt;
+ protected $updatedAt;
/**
* @ORM\OneToMany(targetEntity="Entry", mappedBy="user", cascade={"remove"})
*/
- private $entries;
+ protected $entries;
/**
* @ORM\OneToOne(targetEntity="Config", mappedBy="user")
*/
- private $config;
+ protected $config;
/**
* @ORM\OneToMany(targetEntity="Tag", mappedBy="user", cascade={"remove"})
*/
- private $tags;
+ protected $tags;
public function __construct()
{
- $this->isActive = true;
- $this->salt = md5(uniqid(null, true));
- $this->entries = new ArrayCollection();
- $this->tags = new ArrayCollection();
+ parent::__construct();
+ $this->entries = new ArrayCollection();
+ $this->tags = new ArrayCollection();
}
/**
$this->updatedAt = new \DateTime();
}
- /**
- * Get id.
- *
- * @return int
- */
- public function getId()
- {
- return $this->id;
- }
-
- /**
- * Set username.
- *
- * @param string $username
- *
- * @return User
- */
- public function setUsername($username)
- {
- $this->username = $username;
-
- return $this;
- }
-
- /**
- * Get username.
- *
- * @return string
- */
- public function getUsername()
- {
- return $this->username;
- }
-
- /**
- * {@inheritdoc}
- */
- public function getSalt()
- {
- return $this->salt;
- }
-
- /**
- * {@inheritdoc}
- */
- public function getRoles()
- {
- return array('ROLE_USER');
- }
-
/**
* Set password.
*
return $this;
}
- /**
- * Get password.
- *
- * @return string
- */
- public function getPassword()
- {
- return $this->password;
- }
-
/**
* Set name.
*
return $this->name;
}
- /**
- * Set email.
- *
- * @param string $email
- *
- * @return User
- */
- public function setEmail($email)
- {
- $this->email = $email;
-
- return $this;
- }
-
- /**
- * Get email.
- *
- * @return string
- */
- public function getEmail()
- {
- return $this->email;
- }
-
/**
* @return string
*/
{
return $this->tags;
}
- /**
- * {@inheritdoc}
- */
- public function eraseCredentials()
- {
- }
-
- /**
- * @see \Serializable::serialize()
- */
- public function serialize()
- {
- return serialize(array(
- $this->id,
- ));
- }
-
- /**
- * @see \Serializable::unserialize()
- */
- public function unserialize($serialized)
- {
- list(
- $this->id) = unserialize($serialized);
- }
public function isEqualTo(UserInterface $user)
{
return $this->username === $user->getUsername();
}
- public function isAccountNonExpired()
- {
- return true;
- }
-
- public function isAccountNonLocked()
- {
- return true;
- }
-
- public function isCredentialsNonExpired()
- {
- return true;
- }
-
- public function isEnabled()
- {
- return $this->isActive;
- }
/**
* Set config.
*
{
return $this->config;
}
-
- /**
- * Set confirmationToken.
- *
- * @param string $confirmationToken
- *
- * @return User
- */
- public function setConfirmationToken($confirmationToken)
- {
- $this->confirmationToken = $confirmationToken;
-
- return $this;
- }
-
- /**
- * Get confirmationToken.
- *
- * @return string
- */
- public function getConfirmationToken()
- {
- return $this->confirmationToken;
- }
-
- /**
- * Set passwordRequestedAt.
- *
- * @param \DateTime $passwordRequestedAt
- *
- * @return User
- */
- public function setPasswordRequestedAt($passwordRequestedAt)
- {
- $this->passwordRequestedAt = $passwordRequestedAt;
-
- return $this;
- }
-
- /**
- * Get passwordRequestedAt.
- *
- * @return \DateTime
- */
- public function getPasswordRequestedAt()
- {
- return $this->passwordRequestedAt;
- }
}
->add('name', 'text')
->add('email', 'email')
->add('save', 'submit')
+ ->remove('username')
+ ->remove('plainPassword')
;
}
+ public function getParent()
+ {
+ return 'fos_user_registration';
+ }
+
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
</div>
<div class="row mts txtcenter">
+ <input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}" />
<button type="submit">Login</button>
<a href="{{ path('forgot_password') }}" class="small">Forgot your password?</a>
</div>
{% endfor %}
</ul>
-
<!-- Filters -->
<div id="filters" class="side-nav fixed right-aligned">
<form action="{{ path('all') }}">
</div>
<div class="card-action">
+ <input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}" />
<button class="btn waves-effect waves-light" type="submit" name="send">
{% trans %}Login{% endtrans %}
<i class="mdi-content-send right"></i>
->getMock();
$dialog->expects($this->any())
->method('ask')
- ->will($this->returnValue('test'));
+ ->will($this->returnValue('test_'.uniqid('', true)));
$dialog->expects($this->any())
->method('askConfirmation')
->will($this->returnValue(true));
->getMock();
$dialog->expects($this->any())
->method('ask')
- ->will($this->returnValue('test'));
+ ->will($this->returnValue('test_'.uniqid('', true)));
$dialog->expects($this->any())
->method('askConfirmation')
->will($this->returnValue(true));
->getMock();
$dialog->expects($this->any())
->method('ask')
- ->will($this->returnValue('test'));
+ ->will($this->returnValue('test_'.uniqid('', true)));
$dialog->expects($this->any())
->method('askConfirmation')
->will($this->returnValue(true));
->getMock();
$dialog->expects($this->any())
->method('ask')
- ->will($this->returnValue('test'));
+ ->will($this->returnValue('test_'.uniqid('', true)));
$dialog->expects($this->any())
->method('askConfirmation')
->will($this->returnValue(true));
'update_user[name]' => '',
'update_user[email]' => '',
),
- 'This value should not be blank.',
+ 'Please enter an email',
),
array(
array(
'update_user[name]' => '',
'update_user[email]' => 'test',
),
- 'This value is not a valid email address.',
+ 'The email is not valid',
),
);
}
'new_user[password]' => '',
'new_user[email]' => '',
),
- 'This value should not be blank.',
+ 'Please enter a username',
),
array(
array(
- 'new_user[username]' => 'ad',
- 'new_user[password]' => '',
+ 'new_user[username]' => 'a',
+ 'new_user[password]' => 'mypassword',
'new_user[email]' => '',
),
- 'This value is too short.',
+ 'The username is too short',
),
array(
array(
'new_user[username]' => 'wallace',
- 'new_user[password]' => '',
+ 'new_user[password]' => 'mypassword',
'new_user[email]' => 'test',
),
- 'This value is not a valid email address.',
- ),
- array(
- array(
- 'new_user[username]' => 'wallace',
- 'new_user[password]' => 'admin',
- 'new_user[email]' => 'wallace@wallace.me',
- ),
- 'Password should by at least',
+ 'The email is not valid',
),
array(
array(
'new_user[password]' => 'wallacewallace',
'new_user[email]' => 'wallace@wallace.me',
),
- 'This value is already used',
+ 'The username is already used',
),
);
}
$content = $client->getContainer()
->get('doctrine.orm.entity_manager')
->getRepository('WallabagCoreBundle:Entry')
- ->findOneById(1);
+ ->findOneByIsStarred(false);
$client->request('GET', '/delete/'.$content->getId());
$form['entry_filter[isStarred]']->untick();
$crawler = $client->submit($form);
- $this->assertCount(1, $crawler->filter('div[class=entry]'));
+ $this->assertCount(2, $crawler->filter('div[class=entry]'));
$form = $crawler->filter('button[id=submit-filter]')->form();
$form['entry_filter[isArchived]']->untick();
$form['entry_filter[isStarred]']->tick();
$crawler = $client->submit($form);
- $this->assertCount(1, $crawler->filter('div[class=entry]'));
+ $this->assertCount(2, $crawler->filter('div[class=entry]'));
}
public function testPreviewPictureFilter()
$entry = $client->getContainer()
->get('doctrine.orm.entity_manager')
->getRepository('WallabagCoreBundle:Entry')
- ->findOneByIsArchived(false);
+ ->findOneBy(array());
$crawler = $client->request('GET', '/view/'.$entry->getId());