Jelajahi Sumber

Merge remote-tracking branch 'xaav/master'

Jordi Boggiano 14 tahun lalu
induk
melakukan
31e10171e0

+ 3 - 0
.gitignore

@@ -4,3 +4,6 @@ app/cache/*
 app/logs/*
 build/
 vendor/
+/.settings
+/.buildpath
+/.project

+ 2 - 0
app/.gitignore

@@ -0,0 +1,2 @@
+/cache
+/logs

+ 1 - 0
app/AppKernel.php

@@ -20,6 +20,7 @@ class AppKernel extends Kernel
             new Symfony\Bundle\AsseticBundle\AsseticBundle(),
             new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
             new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(),
+            new FOS\UserBundle\FOSUserBundle(),
             new Packagist\WebBundle\PackagistWebBundle(),
         );
 

+ 1 - 0
app/autoload.php

@@ -7,6 +7,7 @@ $loader->registerNamespaces(array(
     'Symfony'          => array(__DIR__.'/../vendor/symfony/src', __DIR__.'/../vendor/bundles'),
     'Sensio'           => __DIR__.'/../vendor/bundles',
     'JMS'              => __DIR__.'/../vendor/bundles',
+    'FOS'              => __DIR__.'/../vendor/bundles',
     'Doctrine\\Common' => __DIR__.'/../vendor/doctrine-common/lib',
     'Doctrine\\DBAL'   => __DIR__.'/../vendor/doctrine-dbal/lib',
     'Doctrine'         => __DIR__.'/../vendor/doctrine/lib',

+ 5 - 0
app/config/config.yml

@@ -54,3 +54,8 @@ swiftmailer:
 jms_security_extra:
     secure_controllers:  true
     secure_all_services: false
+
+fos_user:
+    db_driver:     orm
+    firewall_name: main
+    user_class:  Packagist\WebBundle\Entity\User

+ 19 - 0
app/config/routing.yml

@@ -1,3 +1,22 @@
 _packagist:
     resource: "@PackagistWebBundle/Controller"
     type:     annotation
+
+fos_user_security:
+    resource: "@FOSUserBundle/Resources/config/routing/security.xml"
+
+fos_user_profile:
+    resource: "@FOSUserBundle/Resources/config/routing/profile.xml"
+    prefix: /profile
+
+fos_user_register:
+    resource: "@FOSUserBundle/Resources/config/routing/registration.xml"
+    prefix: /register
+
+fos_user_resetting:
+    resource: "@FOSUserBundle/Resources/config/routing/resetting.xml"
+    prefix: /resetting
+
+fos_user_change_password:
+    resource: "@FOSUserBundle/Resources/config/routing/change_password.xml"
+    prefix: /change-password 

+ 38 - 34
app/config/security.yml

@@ -1,41 +1,45 @@
 security:
-    encoders:
-        Symfony\Component\Security\Core\User\User: plaintext
-
-    role_hierarchy:
-        ROLE_ADMIN:       ROLE_USER
-        ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
-
     providers:
-        in_memory:
-            users:
-                user:  { password: userpass, roles: [ 'ROLE_USER' ] }
-                admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
+        fos_userbundle:
+            id: fos_user.user_manager
 
     firewalls:
-        profiler:
-            pattern:  ^/_profiler
-            security: false
-
-        wdt:
-            pattern:  ^/_wdt
-            security: false
-
-        login:
-            pattern:  ^/demo/secured/login$
-            security: false
-
-        secured_area:
-            pattern:    ^/demo/secured/
+        main:
+            pattern:      .*
             form_login:
-                check_path: /demo/secured/login_check
-                login_path: /demo/secured/login
-            logout:
-                path:   /demo/secured/logout
-                target: /demo/
-            #anonymous: ~
-            #http_basic:
-            #    realm: "Secured Demo Area"
+                provider:       fos_userbundle
+                login_path:     /login
+                use_forward:    false
+                check_path:     /login_check
+                failure_path:   null
+            logout:       true
+            anonymous:    true
 
     access_control:
-        #- { path: /login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
+        # The WDT has to be allowed to anonymous users to avoid requiring the login with the AJAX request
+        - { path: ^/_wdt/, role: IS_AUTHENTICATED_ANONYMOUSLY }
+        - { path: ^/_profiler/, role: IS_AUTHENTICATED_ANONYMOUSLY }
+        # AsseticBundle paths used when using the controller for assets
+        - { path: ^/js/, role: IS_AUTHENTICATED_ANONYMOUSLY }
+        - { path: ^/css/, role: IS_AUTHENTICATED_ANONYMOUSLY }
+        # URL of FOSUserBundle which need to be available to anonymous users
+        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
+        - { path: ^/login_check$, role: IS_AUTHENTICATED_ANONYMOUSLY } # for the case of a failed login
+        - { path: ^/user/new$, role: IS_AUTHENTICATED_ANONYMOUSLY }
+        - { path: ^/user/check-confirmation-email$, role: IS_AUTHENTICATED_ANONYMOUSLY }
+        - { path: ^/user/confirm/, role: IS_AUTHENTICATED_ANONYMOUSLY }
+        - { path: ^/user/confirmed$, role: IS_AUTHENTICATED_ANONYMOUSLY }
+        - { path: ^/user/request-reset-password$, role: IS_AUTHENTICATED_ANONYMOUSLY }
+        - { path: ^/user/send-resetting-email$, role: IS_AUTHENTICATED_ANONYMOUSLY }
+        - { path: ^/user/check-resetting-email$, role: IS_AUTHENTICATED_ANONYMOUSLY }
+        - { path: ^/user/reset-password/, role: IS_AUTHENTICATED_ANONYMOUSLY }
+        # Secured part of the site
+        # This config requires being logged for the whole site and having the admin role for the admin part.
+        # Change these rules to adapt them to your needs
+        - { path: ^/submit/, role: ROLE_USER }
+        - { path: ^/submit$, role: ROLE_USER }
+        - { path: ^/admin/, role: ROLE_ADMIN }
+
+    role_hierarchy:
+        ROLE_ADMIN:       ROLE_USER
+        ROLE_SUPERADMIN:  ROLE_ADMIN

+ 5 - 1
deps

@@ -44,4 +44,8 @@
 
 [AsseticBundle]
     git=http://github.com/symfony/AsseticBundle.git
-    target=/bundles/Symfony/Bundle/AsseticBundle
+    target=/bundles/Symfony/Bundle/AsseticBundle
+    
+[FOSUserBundle]
+    git=git://github.com/FriendsOfSymfony/UserBundle.git
+    target=/bundles/FOS/UserBundle

+ 2 - 1
deps.lock

@@ -11,4 +11,5 @@ metadata aa04872c6f0e2b32128b62dd075e8cf97a8d93da
 SensioFrameworkExtraBundle e2da95a87d31ea4df5eadb687b97d3d7f0c528eb
 JMSSecurityExtraBundle 5676f8ddbc512713e101cb123baf5cd500edefbb
 SensioDistributionBundle 868d8db9ca3ae41d5d6e74f3db708eb5970bc478
-AsseticBundle 9215de810b64e14cecc4b4f1a9359b5fbd999358
+AsseticBundle 9215de810b64e14cecc4b4f1a9359b5fbd999358
+FOSUserBundle daa87485a90b7c835f4845d41f0da20c7b70cb60

+ 15 - 3
src/Packagist/WebBundle/Controller/WebController.php

@@ -21,12 +21,18 @@ use Symfony\Component\HttpFoundation\RedirectResponse;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
+use Symfony\Component\Security\Core\Exception\AccessDeniedException;
 
 /**
  * @author Jordi Boggiano <j.boggiano@seld.be>
  */
 class WebController extends Controller
 {
+    protected function getUser()
+    {
+        return $user = $this->get('security.context')->getToken()->getUser();
+    }
+
     /**
      * @Template()
      * @Route("/", name="home")
@@ -37,7 +43,7 @@ class WebController extends Controller
             ->getRepository('Packagist\WebBundle\Entity\Package')
             ->findAll();
 
-        return array('packages' => $packages, 'page' => 'home');
+        return array('packages' => $packages, 'page' => 'home', 'user' => $this->getUser());
     }
 
     /**
@@ -54,6 +60,8 @@ class WebController extends Controller
             $form->bindRequest($request);
             if ($form->isValid()) {
                 try {
+                    $user = $this->getUser();
+                    $package->addMaintainers($user);
                     $em = $this->get('doctrine')->getEntityManager();
                     $em->persist($package);
                     $em->flush();
@@ -66,7 +74,7 @@ class WebController extends Controller
             }
         }
 
-        return array('form' => $form->createView(), 'page' => 'submit');
+        return array('form' => $form->createView(), 'page' => 'submit', 'user' => $this->getUser());
     }
 
     /**
@@ -80,6 +88,10 @@ class WebController extends Controller
         $pkg = $this->get('doctrine')->getRepository('Packagist\WebBundle\Entity\Package')
             ->findOneByName($package);
 
+        if(!$pkg->getMaintainers()->contains($this->getUser())) {
+            throw new AccessDeniedException();
+        }
+
         if (!$pkg) {
             throw new NotFoundHttpException('Package '.$package.' not found.');
         }
@@ -111,7 +123,7 @@ class WebController extends Controller
             }
         }
 
-        return array('form' => $form->createView(), 'package' => $pkg, 'page' => 'submit');
+        return array('form' => $form->createView(), 'package' => $pkg, 'page' => 'submit', 'user' => $this->getUser());
     }
 
     /**

+ 25 - 4
src/Packagist/WebBundle/Entity/Package.php

@@ -50,10 +50,11 @@ class Package
      */
     private $versions;
 
-//    /**
-//     * @ORM\ManyToMany(targetEntity="User")
-//     */
-//    private $maintainers;
+    /**
+     * @ORM\ManyToMany(targetEntity="User", inversedBy="packages")
+     * @ORM\JoinTable(name="maintainers_packages")
+     */
+    private $maintainers;
 
     // dist-tags / rel or runtime?
 
@@ -198,4 +199,24 @@ class Package
     {
         return $this->updatedAt;
     }
+
+    /**
+     * Add maintainers
+     *
+     * @param Packagist\WebBundle\Entity\User $maintainers
+     */
+    public function addMaintainers(\Packagist\WebBundle\Entity\User $maintainers)
+    {
+        $this->maintainers[] = $maintainers;
+    }
+
+    /**
+     * Get maintainers
+     *
+     * @return Doctrine\Common\Collections\Collection $maintainers
+     */
+    public function getMaintainers()
+    {
+        return $this->maintainers;
+    }
 }

+ 59 - 0
src/Packagist/WebBundle/Entity/User.php

@@ -0,0 +1,59 @@
+<?php
+
+namespace Packagist\WebBundle\Entity;
+
+use FOS\UserBundle\Entity\User as BaseUser;
+use Doctrine\ORM\Mapping as ORM;
+
+/**
+ * @ORM\Entity
+ * @ORM\Table(name="fos_user")
+ */
+class User extends BaseUser
+{
+    /**
+     * @ORM\Id
+     * @ORM\Column(type="integer")
+     * @ORM\generatedValue(strategy="AUTO")
+     */
+    protected $id;
+
+    /**
+     * @ORM\ManyToMany(targetEntity="Package", mappedBy="maintainers")
+     */
+    private $packages;
+    public function __construct()
+    {
+        $this->packages = new \Doctrine\Common\Collections\ArrayCollection();
+    }
+    
+    /**
+     * Get id
+     *
+     * @return integer $id
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Add packages
+     *
+     * @param Packagist\WebBundle\Entity\Package $packages
+     */
+    public function addPackages(\Packagist\WebBundle\Entity\Package $packages)
+    {
+        $this->packages[] = $packages;
+    }
+
+    /**
+     * Get packages
+     *
+     * @return Doctrine\Common\Collections\Collection $packages
+     */
+    public function getPackages()
+    {
+        return $this->packages;
+    }
+}

+ 4 - 1
src/Packagist/WebBundle/Resources/views/Web/index.html.twig

@@ -4,7 +4,10 @@
     <h1>Packages</h1>
     {% for package in packages %}
         <section class="package">
-            <h2>{{ package.name }}</h2>
+            <h2>{{ package.name }}</h2> by
+            {% for maintainer in package.maintainers %}
+                {{ maintainer.username }}
+            {% endfor %}
             <p class="description">{{ package.description }}</p>
             {% if package.versions[0] is defined %}
                 <p class="license">License: {{ package.versions[0].license|default("Unknown") }}</p>

+ 7 - 0
src/Packagist/WebBundle/Resources/views/layout.html.twig

@@ -36,6 +36,13 @@
     </head>
     <body>
         <div class="container">
+            <div>
+                {% if user.username is defined %}
+                    {{ user.username }} | <a href="{{ url('fos_user_security_logout') }}">logout</a>
+                {% else %}
+                    <a href="{{ url('fos_user_security_login') }}">login</a>
+                {% endif %}
+            </div>
             <div class="betawarn">WARNING - This is an experimental site, packages may come and go, this is not ready yet.</div>
             <header>
                 {% if page is defined and page != 'submit' %}