src/Security/Voter/AccountVoter.php line 11

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter;
  3. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  4. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  5. use Symfony\Component\Security\Core\User\UserInterface;
  6. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  7. use Symfony\Component\Security\Core\Security;
  8. class AccountVoter extends Voter
  9. {    
  10.     private $security;
  11.     
  12.     public function __construct(Security $security)
  13.     {
  14.         $this->security $security;
  15.     }
  16.     
  17.     protected function supports($attribute$subject) : bool
  18.     {
  19.         // NEW actions don't yet have objects
  20.         if(in_array($attribute, ['NEW_ACCOUNT']))
  21.             return true;
  22.         return in_array($attribute, ['EDIT''LOCK''DELETE''UNLOCK''PASSWORD_CHANGE''FORWARD',
  23.             'AUTORESPONDER''SPAMASSASSIN''SPAMASSASSIN_DOMAIN''PROCMAIL''IMAP''NOTICESMS''STATS',
  24.             'MASS_SEND''SETTINGS''OPERATION_HISTORY''LOGIN_HISTORY',
  25.             'ADMIN_DOMAINS_SHOW''ADMIN_DOMAINS_NEW''ADMIN_ALIASES_SHOW''ADMIN_ALIASES_NEW',
  26.             'ADMIN_ROLES_SHOW''ADMIN_ROLES_NEW''ADMIN_ROLES_DELETE',
  27.             'ADMIN_LOGS''ADMIN_SYSTEM_STATUS''ADMIN_SYSTEM_SETTINGS',
  28.             'ADMIN_CHARTS''LOGIN_MESSAGES''MASS_CHANGE_QUOTA'
  29.             ])
  30.             && $subject instanceof \App\Model\Account;
  31.     }
  32.     protected function voteOnAttribute($attribute$subjectTokenInterface $token) : bool
  33.     {
  34.         $user $token->getUser();
  35.         // if the user is anonymous, do not grant access
  36.         if (!$user instanceof UserInterface) {
  37.             return false;
  38.         }
  39.         if($subject != null && $subject->isInProgress()) {
  40.             return false;
  41.         }
  42.         
  43.         switch ($attribute) {
  44.             case 'EDIT':
  45.                 if($this->security->isGranted('ROLE_ADMIN')) {
  46.                     return true;
  47.                 }
  48.                     
  49.                 if($this->security->isGranted('ROLE_POSTMASTER')) {
  50.                     if(in_array($subject->getUserDomain(), $user->getDomains())) {
  51.                         return true;
  52.                     }
  53.                     
  54.                 }
  55.                 
  56.                 if($this->security->isGranted('ROLE_GROUPMASTER')) {
  57.                     if(in_array($subject->getUserDomain(), $user->getDomains())) {
  58.                         if(in_array($subject->userAddress(), $user->getAccounts()))
  59.                         return true;
  60.                     }
  61.                     
  62.                 }
  63.                 
  64.                 if($this->security->isGranted('ROLE_USER')) {
  65.                     // only possible to edit his own account
  66.                     if($subject->userAddress() == $user->getUsername()) {
  67.                         return true;
  68.                     }
  69.                 }
  70.                 break;
  71.                 
  72.             case 'LOCK':
  73.                 if($this->security->isGranted('ROLE_POSTMASTER')) {
  74.                     if(in_array($subject->getUserDomain(), $user->getDomains())) {
  75.                         return true;
  76.                     }
  77.                 }
  78.                 
  79.                 if($this->security->isGranted('ROLE_GROUPMASTER')) {
  80.                     if(in_array($subject->getUserDomain(), $user->getDomains())) {
  81.                         if(in_array($subject->userAddress(), $user->getAccounts()))
  82.                             return true;
  83.                     }
  84.                     
  85.                 }
  86.                 break;
  87.                 
  88.             case 'UNLOCK':
  89.                 if($this->security->isGranted('ROLE_POSTMASTER')) {
  90.                     if(in_array($subject->getUserDomain(), $user->getDomains())) {
  91.                         return true;
  92.                     }
  93.                 }
  94.                 
  95.                 if($this->security->isGranted('ROLE_GROUPMASTER')) {
  96.                     if(in_array($subject->getUserDomain(), $user->getDomains())) {
  97.                         if(in_array($subject->userAddress(), $user->getAccounts()))
  98.                             return true;
  99.                     }
  100.                     
  101.                 }
  102.                 break;
  103.                     
  104.             case 'DELETE':
  105.                 // don't allow deleting your own account
  106.                 if($subject->userAddress() == $user->getUsername()) {
  107.                     return false;
  108.                 }
  109.                 
  110.                 // don't delete any postmaster account
  111.                 if($subject->getUserName() == 'postmaster') {
  112.                     return false;
  113.                 }
  114.                 
  115.                 if($this->security->isGranted('ROLE_POSTMASTER')) {
  116.                     if(in_array($subject->getUserDomain(), $user->getDomains())) {
  117.                         return true;
  118.                     }
  119.                 }
  120.                 break;
  121.                 
  122.             case 'NEW_ACCOUNT':
  123.                 if($this->security->isGranted('ROLE_POSTMASTER')) {
  124.                     return true;
  125.                 }
  126.                 break;
  127.                 
  128.             case 'FORWARD':
  129.                 if(isset($_SERVER['APP_QU_FORWARDING_ALLOWED'])) {
  130.                     if($_SERVER['APP_QU_FORWARDING_ALLOWED'] == 'false') {
  131.                         return false;
  132.                     }
  133.                 }
  134.                 
  135.                 if($this->security->isGranted('ROLE_USER')) {
  136.                     foreach($user->getAccount()->getAllowedModules() as $s) {
  137.                         if($s == 'Forward')
  138.                             return true;
  139.                     }
  140.                     
  141.                     return false;
  142.                 }
  143.                 break;
  144.                 
  145.             case 'PASSWORD_CHANGE':
  146.                 if(isset($_SERVER['APP_QU_PASSWORD_ALLOWED'])) {
  147.                     if($_SERVER['APP_QU_PASSWORD_ALLOWED'] == 'false') {
  148.                         return false;
  149.                     }
  150.                 }
  151.                 
  152.                 if($this->security->isGranted('ROLE_USER')) {
  153.                     foreach($user->getAccount()->getAllowedModules() as $s) {
  154.                         if($s == 'PasswordChange')
  155.                             return true;
  156.                     }
  157.                     
  158.                     return false;
  159.                 }
  160.                 break;
  161.                 
  162.             case 'AUTORESPONDER':
  163.                 if(isset($_SERVER['APP_QU_AUTORESPONDER_ALLOWED'])) {
  164.                     if($_SERVER['APP_QU_AUTORESPONDER_ALLOWED'] == 'false') {
  165.                         return false;
  166.                     }
  167.                 }
  168.                 
  169.                 if($this->security->isGranted('ROLE_USER')) {
  170.                     foreach($user->getAccount()->getAllowedModules() as $s) {
  171.                         if($s == 'Autoresponder')
  172.                             return true;
  173.                     }
  174.                     
  175.                     return false;
  176.                 }
  177.                 break;
  178.                 
  179.             case 'SPAMASSASSIN':
  180.                 if(isset($_SERVER['APP_QU_SA_ALLOWED'])) {
  181.                     if($_SERVER['APP_QU_SA_ALLOWED'] == 'false') {
  182.                         return false;
  183.                     }
  184.                 }
  185.                 
  186.                 if($this->security->isGranted('ROLE_USER')) {
  187.                     foreach($user->getAccount()->getAllowedModules() as $s) {
  188.                         if($s == 'SpamAssassin')
  189.                             return true;
  190.                     }
  191.                     
  192.                     return false;
  193.                 }
  194.                 break;
  195.                 
  196.             case 'SPAMASSASSIN_DOMAIN':
  197.                 if($this->security->isGranted('ROLE_POSTMASTER')) {
  198.                     return true;
  199.                 }
  200.                 else {
  201.                     return false;
  202.                 }
  203.                 break;
  204.                 
  205.             case 'PROCMAIL':
  206.                 if(isset($_SERVER['APP_QU_PROCMAIL_ALLOWED'])) {
  207.                     if($_SERVER['APP_QU_PROCMAIL_ALLOWED'] == 'false') {
  208.                         return false;
  209.                     }
  210.                 }
  211.                 
  212.                 if($this->security->isGranted('ROLE_USER')) {
  213.                     foreach($user->getAccount()->getAllowedModules() as $s) {
  214.                         if($s == 'ProcMail')
  215.                             return true;
  216.                     }
  217.                     
  218.                     return false;
  219.                 }
  220.                 break;
  221.                 
  222.             case 'IMAP':
  223.                 if(isset($_SERVER['APP_QU_IMAP_ALLOWED'])) {
  224.                     if($_SERVER['APP_QU_IMAP_ALLOWED'] == 'false') {
  225.                         return false;
  226.                     }
  227.                 }
  228.                 
  229.                 if($this->security->isGranted('ROLE_USER')) {
  230.                     foreach($user->getAccount()->getAllowedModules() as $s) {
  231.                         if($s == 'ImapDirs')
  232.                             return true;
  233.                     }
  234.                     
  235.                     return false;
  236.                 }
  237.                 break;
  238.                 
  239.             case 'NOTICESMS':
  240.                 if(isset($_SERVER['APP_QU_NOTICE_SMS_ALLOWED'])) {
  241.                     if($_SERVER['APP_QU_NOTICE_SMS_ALLOWED'] == 'false') {
  242.                         return false;
  243.                     }
  244.                 }
  245.                 
  246.                 if($this->security->isGranted('ROLE_USER')) {
  247.                     foreach($user->getAccount()->getAllowedModules() as $s) {
  248.                         if($s == 'NoticeSms')
  249.                             return true;
  250.                     }
  251.                     
  252.                     return false;
  253.                 }
  254.                 break;
  255.                 
  256.             case 'STATS':
  257.                 return true;
  258.                 
  259.             case 'LOGIN_MESSAGES':
  260.                 if(!isset($_SERVER['APP_QP_LOGIN_MSG_ALLOWED'])) {
  261.                     return false;
  262.                 }
  263.                 
  264.                 if(isset($_SERVER['APP_QP_LOGIN_MSG_ALLOWED'])) {
  265.                     if($_SERVER['APP_QP_LOGIN_MSG_ALLOWED'] == 'false') {
  266.                         return false;
  267.                     }
  268.                 }
  269.                 
  270.                 if($this->security->isGranted('ROLE_POSTMASTER')) {
  271.                     return true;
  272.                 }
  273.                 
  274.                 return false;
  275.                 break;
  276.                 
  277.             case 'SETTINGS':
  278.                 if(isset($_SERVER['APP_QU_SETTINGS_ALLOWED'])) {
  279.                     if($_SERVER['APP_QU_SETTINGS_ALLOWED'] == 'false') {
  280.                         return false;
  281.                     }
  282.                 }
  283.                 
  284.                 return true;
  285.                 
  286.             case 'OPERATION_HISTORY':
  287.                 if(isset($_SERVER['APP_QU_OPERATION_HISTORY_ALLOWED'])) {
  288.                     if($_SERVER['APP_QU_OPERATION_HISTORY_ALLOWED'] == 'false') {
  289.                         return false;
  290.                     }
  291.                 }
  292.                 
  293.                 return true;
  294.                 
  295.             case 'LOGIN_HISTORY':
  296.                 if(isset($_SERVER['APP_QU_LOGIN_HISTORY_ALLOWED'])) {
  297.                     if($_SERVER['APP_QU_LOGIN_HISTORY_ALLOWED'] == 'false') {
  298.                         return false;
  299.                     }
  300.                 }
  301.                 
  302.                 return true;
  303.                 
  304.             case 'MASS_SEND':
  305.                 if($this->security->isGranted('ROLE_ADMIN')) {
  306.                     return true;
  307.                 }
  308.                 
  309.                 if($this->security->isGranted('ROLE_POSTMASTER')) {
  310.                     if(in_array($subject->getUserDomain(), $user->getDomains())) {
  311.                         return true;
  312.                     }
  313.                 }
  314.                 if($this->security->isGranted('ROLE_POSTMASTER_MIN')) {
  315.                     if(in_array($subject->getUserDomain(), $user->getDomains())) {
  316.                         return true;
  317.                     }
  318.                 }
  319.                 
  320.                 if($this->security->isGranted('ROLE_GROUPMASTER')) {
  321.                     if(in_array($subject->getUserDomain(), $user->getDomains())) {
  322.                         if(in_array($subject->userAddress(), $user->getAccounts()))
  323.                             return true;
  324.                     }
  325.                 }
  326.                 
  327.                 if($this->security->isGranted('ROLE_USER')) {
  328.                     // only possible to "mass send" to his own account
  329.                     if($subject->userAddress() == $user->getUsername()) {
  330.                         return true;
  331.                     }
  332.                 }
  333.                 break;
  334.             case 'MASS_CHANGE_QUOTA':
  335.                 if($this->security->isGranted('ROLE_ADMIN')) {
  336.                     return true;
  337.                 }
  338.                 
  339.                 if($this->security->isGranted('ROLE_POSTMASTER')) {
  340.                     if(in_array($subject->getUserDomain(), $user->getDomains())) {
  341.                         return true;
  342.                     }
  343.                 }
  344.                 if($this->security->isGranted('ROLE_POSTMASTER_MIN')) {
  345.                     return false;
  346.                 }
  347.                     
  348.                 if($this->security->isGranted('ROLE_GROUPMASTER')) {
  349.                     if(in_array($subject->getUserDomain(), $user->getDomains())) {
  350.                         if(in_array($subject->userAddress(), $user->getAccounts()))
  351.                             return true;
  352.                     }
  353.                 }
  354.                 
  355.                 if($this->security->isGranted('ROLE_USER')) {
  356.                     // only possible to "mass send" to his own account
  357.                     if($subject->userAddress() == $user->getUsername()) {
  358.                         return true;
  359.                     }
  360.                 }
  361.                 break;
  362.             
  363.                 
  364.             case 'DOMAIN_SETTINGS':
  365.                 if($this->security->isGranted('ROLE_ADMIN')) {
  366.                     return true;
  367.                 }
  368.                 
  369.                 if($this->security->isGranted('ROLE_POSTMASTER')) {
  370.                     if(in_array($subject->getUserDomain(), $user->getDomains())) {
  371.                         return true;
  372.                     }
  373.                 }
  374.                 
  375.                 if($this->security->isGranted('ROLE_GROUPMASTER')) {
  376.                     return false;
  377.                 }
  378.                 
  379.                 if($this->security->isGranted('ROLE_USER')) {
  380.                     return false;
  381.                 }
  382.                 break;
  383.                 
  384.             // admin modules
  385.             case 'ADMIN_DOMAINS_SHOW':
  386.                 if(isset($_SERVER['APP_QA_DOMAINS_SHOW_ALLOWED'])) {
  387.                     if($_SERVER['APP_QA_DOMAINS_SHOW_ALLOWED'] == 'false') {
  388.                         return false;
  389.                     }
  390.                 }
  391.                 return true;                
  392.                 break;
  393.                 
  394.             case 'ADMIN_DOMAINS_NEW':
  395.                 if(isset($_SERVER['APP_QA_DOMAINS_ADD_ALLOWED'])) {
  396.                     if($_SERVER['APP_QA_DOMAINS_ADD_ALLOWED'] == 'false') {
  397.                         return false;
  398.                     }
  399.                 }
  400.                 
  401.                 return true;
  402.                 break;
  403.                 
  404.             case 'ADMIN_ALIASES_SHOW':
  405.                 if(isset($_SERVER['APP_QA_ALIASES_SHOW_ALLOWED'])) {
  406.                     if($_SERVER['APP_QA_ALIASES_SHOW_ALLOWED'] == 'false') {
  407.                         return false;
  408.                     }
  409.                 }
  410.                 
  411.                 return true;
  412.                 break;
  413.                 
  414.             case 'ADMIN_ALIASES_NEW':
  415.                 if(isset($_SERVER['APP_QA_ALIASES_ADD_ALLOWED'])) {
  416.                     if($_SERVER['APP_QA_ALIASES_ADD_ALLOWED'] == 'false') {
  417.                         return false;
  418.                     }
  419.                 }
  420.                 
  421.                 return true;
  422.                 break;
  423.                 
  424.             case 'ADMIN_ROLES_SHOW':
  425.                 if(isset($_SERVER['APP_QA_ROLES_SHOW_ALLOWED'])) {
  426.                     if($_SERVER['APP_QA_ROLES_SHOW_ALLOWED'] == 'false') {
  427.                         return false;
  428.                     }
  429.                 }
  430.                 
  431.                 return true;
  432.                 break;
  433.                 
  434.             case 'ADMIN_ROLES_NEW':
  435.                 if(isset($_SERVER['APP_QA_ROLES_NEW_ALLOWED'])) {
  436.                     if($_SERVER['APP_QA_ROLES_NEW_ALLOWED'] == 'false') {
  437.                         return false;
  438.                     }
  439.                 }
  440.                 
  441.                 return true;
  442.                 break;
  443.                 
  444.             case 'ADMIN_ROLES_DELETE':
  445.                 if(isset($_SERVER['APP_QA_ROLES_DELETE_ALLOWED'])) {
  446.                     if($_SERVER['APP_QA_ROLES_DELETE_ALLOWED'] == 'false') {
  447.                         return false;
  448.                     }
  449.                 }
  450.                 
  451.                 return true;
  452.                 break;
  453.                 
  454.             case 'ADMIN_LOGS':
  455.                 if(isset($_SERVER['APP_QA_LOGS_ALLOWED'])) {
  456.                     if($_SERVER['APP_QA_LOGS_ALLOWED'] == 'false') {
  457.                         return false;
  458.                     }
  459.                 }
  460.                 
  461.                 return true;
  462.                 break;
  463.                 
  464.             case 'ADMIN_SYSTEM_STATUS':
  465.                 if(isset($_SERVER['APP_QA_SYSTEM_STATUS_ALLOWED'])) {
  466.                     if($_SERVER['APP_QA_SYSTEM_STATUS_ALLOWED'] == 'false') {
  467.                         return false;
  468.                     }
  469.                 }
  470.                 
  471.                 return true;
  472.                 break;
  473.                 
  474.             case 'ADMIN_SYSTEM_SETTINGS':
  475.                 if(isset($_SERVER['APP_QA_SYSTEM_SETTINGS_ALLOWED'])) {
  476.                     if($_SERVER['APP_QA_SYSTEM_SETTINGS_ALLOWED'] == 'false') {
  477.                         return false;
  478.                     }
  479.                 }
  480.                 
  481.                 return true;
  482.                 break;
  483.                 
  484.             case 'ADMIN_CHARTS':
  485.                 if(isset($_SERVER['APP_QA_CHARTS_ALLOWED'])) {
  486.                     if($_SERVER['APP_QA_CHARTS_ALLOWED'] == 'false') {
  487.                         return false;
  488.                     }
  489.                 }
  490.                 
  491.                 return true;
  492.                 break;
  493.                 
  494.         }
  495.         return false;
  496.     }
  497. }