studieren-ohne-grenzen /
dashboard
This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
| 1 | <?php |
||
| 2 | use Symfony\Component\HttpFoundation\Request; |
||
| 3 | use Symfony\Component\Routing\Generator\UrlGenerator; |
||
| 4 | use Zend\Ldap\Exception\LdapException; |
||
| 5 | |||
| 6 | require_once __DIR__ . '/../vendor/autoload.php'; |
||
| 7 | |||
| 8 | $app = new Silex\Application(); |
||
| 9 | |||
| 10 | require_once __DIR__ . '/../app/config.php'; |
||
| 11 | $app['debug'] = $dashboard_config['debug']; |
||
| 12 | require_once __DIR__ . '/../app/services.php'; |
||
| 13 | |||
| 14 | // now, let's set up the routes |
||
| 15 | // TODO: organize in controllers? |
||
| 16 | |||
| 17 | // (unprotected) index route |
||
| 18 | $app->get('/', function () use ($app) { |
||
| 19 | return $app->redirect($app['url_generator']->generate('/members/manage-account')); |
||
| 20 | }); |
||
| 21 | |||
| 22 | $app->match('/members/Benutzerdaten', function (Request $request) use ($app) { |
||
| 23 | /** @var \Symfony\Component\Security\Core\Authentication\Token\TokenInterface $token */ |
||
| 24 | $token = $app['security.token_storage']->getToken(); |
||
| 25 | if (null !== $token) { |
||
| 26 | $user = $token->getUser(); |
||
| 27 | |||
| 28 | if ($request->request->has('change-password')) { |
||
| 29 | $newpwd = $request->request->get('new-password'); |
||
| 30 | if ($app['check_password_policy']($newpwd)) { |
||
| 31 | try { |
||
| 32 | $app['ldap']->updatePassword($user->getAttributes()['dn'], $request->request->get('old-password'), $request->request->get('new-password')); |
||
| 33 | $app['session']->getFlashBag() |
||
| 34 | ->add('success', 'Passwort erfolgreich geändert!'); |
||
| 35 | return $app->redirect('/members/Benutzerdaten'); |
||
| 36 | } catch (LdapException $ex) { |
||
| 37 | $app['session']->getFlashBag() |
||
| 38 | ->add('error', 'Fehler beim Ändern des Passworts: ' . $ex->getMessage()); |
||
| 39 | } |
||
| 40 | } else { |
||
| 41 | $app['session']->getFlashBag() |
||
| 42 | ->add('warning', 'Das Passwort muss 8 Zeichen lang sein und mindestens eine Zahl, einen Buchstaben und ein Sonderzeichen enthalten'); |
||
| 43 | } |
||
| 44 | } |
||
| 45 | } |
||
| 46 | |||
| 47 | return $app['twig']->render('manage_account.twig', []); |
||
| 48 | }) |
||
| 49 | ->method('GET|POST') |
||
| 50 | ->bind('/members/manage-account'); |
||
| 51 | |||
| 52 | $app->match('/members/meine-Gruppen', function (Request $request) use ($app) { |
||
| 53 | /** @var \Symfony\Component\Security\Core\Authentication\Token\TokenInterface $token */ |
||
| 54 | $token = $app['security.token_storage']->getToken(); |
||
| 55 | |||
| 56 | if (null !== $token) { |
||
| 57 | $user = $token->getUser(); |
||
| 58 | $userDN = $user->getAttributes()['dn']; |
||
| 59 | $action = $request->request->get('action'); |
||
| 60 | |||
| 61 | if (isset($action)) { |
||
| 62 | $userUID = $user->getAttributes()['uid'][0]; |
||
| 63 | |||
| 64 | $groupOU = $request->request->get('ou'); |
||
| 65 | $groupDN = sprintf('ou=%s,ou=groups,o=sog-de,dc=sog', $groupOU); |
||
| 66 | $groupAttr = $app['ldap']->getEntry($groupDN, ['cn', 'owner']); |
||
| 67 | |||
| 68 | switch ($action) { |
||
| 69 | case 'quit': |
||
| 70 | try { |
||
| 71 | if (in_array($userDN, $groupAttr['owner'])) { |
||
| 72 | $app['session']->getFlashBag()->add('error', 'Nicht möglich! Du bist Koordinator der Gruppe "' . $groupAttr['cn'][0] . '". Zum Beenden deiner Mitgliedschaft wende dich bitte an das Ressort IT.'); |
||
| 73 | } else { |
||
| 74 | $app['ldap']->removeFromGroup($userDN, $groupDN); |
||
| 75 | $app['session']->getFlashBag()->add('success', 'Deine Mitgliedschaft in der Gruppe "' . $groupAttr['cn'][0] . '" wurde beendet.'); |
||
| 76 | } |
||
| 77 | } catch (LdapException $ex) { |
||
| 78 | $app['session']->getFlashBag()->add('error', 'Fehler beim Beenden der Mitgliedschaft in der Gruppe ' . $groupAttr['cn'][0] . '": ' . $ex->getMessage()); |
||
| 79 | } |
||
| 80 | break; |
||
| 81 | case 'drop-request': |
||
| 82 | try { |
||
| 83 | $app['ldap']->dropMembershipRequest($userUID, $groupOU); |
||
| 84 | $app['session']->getFlashBag()->add('success', 'Deine Mitgliedschaftsanfrage für die Gruppe "' . $groupAttr['cn'][0] . '" wurde abgebrochen.'); |
||
| 85 | } catch (LdapException $ex) { |
||
| 86 | $app['session']->getFlashBag()->add('error', 'Fehler beim Abbrechen der Mitgliedschaftsanfrage für die Gruppe "' . $groupAttr['cn'][0] . '": ' . $ex->getMessage()); |
||
| 87 | } |
||
| 88 | break; |
||
| 89 | case 'start-request': |
||
| 90 | try { |
||
| 91 | $app['ldap']->requestGroupMembership($userUID, $groupOU); |
||
| 92 | $text = "<p>Hallo,</p>\n |
||
| 93 | <a>%s hat eine neue Anfrage für die Mitgliedschaft in deiner Gruppe %s beantragt. Du kannst die Anfrage <a href='%s'>im Dashboard unter 'Neue Anfragen'</a> beantworten.</p>\n |
||
| 94 | <p>Mit freundlichen Grüßen, dein SOG IT-Ressort</p>\n"; |
||
| 95 | $text = sprintf($text, |
||
| 96 | $userUID, |
||
| 97 | $groupAttr['cn'][0], |
||
| 98 | $app['url_generator']->generate('/members/manage-groups', [], UrlGenerator::ABSOLUTE_URL) |
||
| 99 | ); |
||
| 100 | $app['notify_owners']($groupOU, sprintf('[Studieren Ohne Grenzen] Anfrage zur Mitgliedschaft in deiner Gruppe %s', $groupAttr['cn'][0]), $text); |
||
| 101 | $app['session']->getFlashBag()->add('success', 'Es wurde eine neue Mitgliedschaftsanfrage für die Gruppe "' . $groupAttr['cn'][0] . '" erstellt.'); |
||
| 102 | } catch (LdapException $ex) { |
||
| 103 | $app['session']->getFlashBag()->add('error', 'Fehler beim Erstellen einer Mitgliedschaftsanfrage für die Gruppe "' . $groupAttr['cn'][0] . '": ' . $ex->getMessage()); |
||
| 104 | } |
||
| 105 | break; |
||
| 106 | default: |
||
| 107 | $app['session']->getFlashBag()->add('error', 'Fehler: Der gesendete Befehl wird nicht unterstützt.'); |
||
| 108 | } |
||
| 109 | } |
||
| 110 | |||
| 111 | $groups = $app['ldap']->getGroups(['cn', 'mailinglistId', 'ou', 'owner', 'member', 'pending'])->toArray(); |
||
| 112 | $groupList = []; |
||
| 113 | foreach ($groups as $g) { |
||
| 114 | $roles = []; |
||
| 115 | View Code Duplication | if (isset($g['owner']) && in_array($userDN, $g['owner'])) $roles[] = 'owner'; |
|
| 116 | View Code Duplication | if (isset($g['member']) && in_array($userDN, $g['member'])) $roles[] = 'member'; |
|
| 117 | View Code Duplication | if (isset($g['pending']) && in_array($userDN, $g['pending'])) $roles[] = 'pending'; |
|
| 118 | |||
| 119 | $owners = []; |
||
| 120 | if (isset($g['owner'])) { |
||
| 121 | for ($j = 0; $j < count($g['owner']); $j++) { |
||
|
0 ignored issues
–
show
|
|||
| 122 | $o = $app['ldap']->getEntry($g['owner'][$j], ['cn', 'mail']); |
||
| 123 | if (isset($o)) $owners[] = $o; |
||
| 124 | } |
||
| 125 | } |
||
| 126 | |||
| 127 | $listentry = array( |
||
| 128 | 'name' => $g['cn'][0], |
||
| 129 | 'ou' => $g['ou'][0], |
||
| 130 | 'mailinglistId' => $g['mailinglistid'][0], |
||
| 131 | 'userRoles' => $roles, |
||
| 132 | 'owners' => $owners |
||
| 133 | ); |
||
| 134 | |||
| 135 | $groupList[] = $listentry; |
||
| 136 | } |
||
| 137 | |||
| 138 | return $app['twig']->render('manage_groups.twig', ['groupList' => $groupList]); |
||
| 139 | } |
||
| 140 | }) |
||
| 141 | ->method('GET|POST') |
||
| 142 | ->bind('/members/manage-groups'); |
||
| 143 | |||
| 144 | $app->match('/members/Mitglieder-verwalten', function (Request $request) use ($app) { |
||
| 145 | /** @var \Symfony\Component\Security\Core\Authentication\Token\TokenInterface $token */ |
||
| 146 | $token = $app['security.token_storage']->getToken(); |
||
| 147 | |||
| 148 | if (null !== $token) { |
||
| 149 | $user = $token->getUser(); |
||
| 150 | $ownedGroups = $app['ldap']->getOwnedGroups($user->getAttributes()['dn'])->toArray(); |
||
| 151 | $selGroup = $request->query->get('ou'); |
||
| 152 | |||
| 153 | if (count($ownedGroups) === 0) { |
||
| 154 | $app['session']->getFlashBag()->add('error', 'Keine Berechtigung.'); |
||
| 155 | return new \Symfony\Component\HttpFoundation\RedirectResponse('/members/Benutzerdaten'); |
||
| 156 | } |
||
| 157 | |||
| 158 | if (!isset($selGroup)) $selGroup = $ownedGroups[0]['ou'][0]; |
||
| 159 | $selGroupDN = sprintf('ou=%s,ou=groups,o=sog-de,dc=sog', $selGroup); |
||
| 160 | |||
| 161 | $action = $request->request->get('manage-action'); |
||
| 162 | |||
| 163 | if (isset($action)) { |
||
| 164 | $ownerPermission = false; |
||
| 165 | $selGroupName = ''; |
||
| 166 | foreach ($ownedGroups as $og) { |
||
| 167 | if ($og['dn'] == $selGroupDN) { |
||
| 168 | $ownerPermission = true; |
||
| 169 | $selGroupName = $og['cn'][0]; |
||
| 170 | break; |
||
| 171 | } |
||
| 172 | } |
||
| 173 | |||
| 174 | if ($ownerPermission) { |
||
| 175 | $userID = $request->request->get('uid'); |
||
| 176 | $userDN = $app['ldap']->findUserDN($userID); |
||
| 177 | $userAttr = $app['ldap']->getEntry($userDN, ['cn']); |
||
| 178 | |||
| 179 | $groupAttr = $app['ldap']->getEntry($selGroupDN, ['owner']); |
||
| 180 | |||
| 181 | switch ($action) { |
||
| 182 | case 'activate': |
||
| 183 | try { |
||
| 184 | $app['ldap']->activateMember($userID); |
||
| 185 | $app['ldap']->approveGroupMembership($userID, 'allgemein'); // TODO: Make 'allgemein' configurable |
||
| 186 | $app['session']->getFlashBag()->add('success', $userAttr['cn'][0] . ' wurde freigeschaltet, du kannst ihn/sie nun zu deiner Gruppe "' . $selGroupName . '" hinzufügen!'); |
||
| 187 | } catch (LdapException $ex) { |
||
| 188 | $app['session']->getFlashBag()->add('error', 'Fehler beim Freischalten von ' . $userAttr['cn'][0] . ': ' . $ex->getMessage()); |
||
| 189 | } |
||
| 190 | break; |
||
| 191 | case 'add': |
||
| 192 | try { |
||
| 193 | $app['ldap']->addToGroup($userDN, $selGroupDN); |
||
| 194 | $app['ldap']->dropMembershipRequest($userID, $selGroup); |
||
| 195 | $app['session']->getFlashBag()->add('success', $userAttr['cn'][0] . ' wurde zu der Gruppe "' . $selGroupName . '" hinzugefügt!'); |
||
| 196 | } catch (LdapException $ex) { |
||
| 197 | $app['session']->getFlashBag()->add('error', 'Fehler beim Hinzufügen von ' . $userAttr['cn'][0] . ' zu der Gruppe "' . $selGroupName . '": ' . $ex->getMessage()); |
||
| 198 | } |
||
| 199 | break; |
||
| 200 | case 'rm': |
||
| 201 | try { |
||
| 202 | if (in_array($userDN, $groupAttr['owner'])) { |
||
| 203 | $app['session']->getFlashBag()->add('error', 'Nicht möglich! "' . $userAttr['cn'][0] . '" ist Koordinator der Gruppe "' . $selGroupName . '". Bitte entferne ihn zuerst als Koordinator.'); |
||
| 204 | } else { |
||
| 205 | $app['ldap']->removeFromGroup($userDN, $selGroupDN); |
||
| 206 | $app['session']->getFlashBag()->add('success', $userAttr['cn'][0] . ' wurde von der Gruppe "' . $selGroupName . '" entfernt!'); |
||
| 207 | } |
||
| 208 | } catch (LdapException $ex) { |
||
| 209 | $app['session']->getFlashBag()->add('error', 'Fehler beim Entfernen von ' . $userAttr['cn'][0] . ' aus der Gruppe "' . $selGroupName . '": ' . $ex->getMessage()); |
||
| 210 | } |
||
| 211 | break; |
||
| 212 | case 'rm-request': |
||
| 213 | try { |
||
| 214 | $app['ldap']->dropMembershipRequest($userID, $selGroup); |
||
| 215 | $app['session']->getFlashBag()->add('success', 'Die Mitgliedschaftsanfrage von ' . $userAttr['cn'][0] . ' für die Gruppe "' . $selGroupName . '" wurde gelöscht!'); |
||
| 216 | } catch (LdapException $ex) { |
||
| 217 | $app['session']->getFlashBag()->add('error', 'Fehler beim Löschen der Mitgliedschaftsanfrage von ' . $userAttr['cn'][0] . ' für die Gruppe "' . $selGroupName . '": ' . $ex->getMessage()); |
||
| 218 | } |
||
| 219 | break; |
||
| 220 | default: |
||
| 221 | $app['session']->getFlashBag()->add('error', 'Fehler: Der gesendete Befehl wird nicht unterstützt.'); |
||
| 222 | } |
||
| 223 | |||
| 224 | } else { |
||
| 225 | $app['session']->getFlashBag()->add('error', 'Keine Berechtigung für die gewählte Gruppe'); |
||
| 226 | } |
||
| 227 | } |
||
| 228 | |||
| 229 | $allUsers = $app['ldap']->getAllUsers()->toArray(); |
||
| 230 | $groupAttr = $app['ldap']->getEntry($selGroupDN, ['owner', 'member', 'pending']); |
||
| 231 | |||
| 232 | $memberList = []; |
||
| 233 | foreach ($allUsers as $u) { |
||
| 234 | $roles = []; |
||
| 235 | View Code Duplication | if (isset($groupAttr['owner']) && in_array($u['dn'], $groupAttr['owner'])) $roles[] = 'owner'; |
|
| 236 | View Code Duplication | if (isset($groupAttr['member']) && in_array($u['dn'], $groupAttr['member'])) $roles[] = 'member'; |
|
| 237 | View Code Duplication | if (isset($groupAttr['pending']) && in_array($u['dn'], $groupAttr['pending'])) $roles[] = 'pending'; |
|
| 238 | // we handle inactive members like the other cases, the UI is just so similar |
||
| 239 | if (strstr($u['dn'], 'ou=inactive')) $roles[] = 'inactive'; |
||
| 240 | |||
| 241 | $listentry = array( |
||
| 242 | 'name' => $u['cn'][0], |
||
| 243 | 'uid' => $u['uid'][0], |
||
| 244 | 'email' => $u['mail'][0], |
||
| 245 | 'userRoles' => $roles |
||
| 246 | ); |
||
| 247 | |||
| 248 | $memberList[] = $listentry; |
||
| 249 | } |
||
| 250 | |||
| 251 | return $app['twig']->render('manage_members.twig', [ |
||
| 252 | 'memberList' => $memberList, |
||
| 253 | 'ownedGroups' => $ownedGroups, |
||
| 254 | 'selectedGroup' => $selGroup |
||
| 255 | ]); |
||
| 256 | } |
||
| 257 | }) |
||
| 258 | ->method('GET|POST') |
||
| 259 | ->bind('/members/manage-members'); |
||
| 260 | |||
| 261 | $app->get('/members/Hilfe', function () use ($app) { |
||
| 262 | return $app['twig']->render('help.twig'); |
||
| 263 | }) |
||
| 264 | ->bind('/members/help'); |
||
| 265 | |||
| 266 | $app->get('/login', function (Request $request) use ($app) { |
||
| 267 | return $app['twig']->render('login.twig', [ |
||
| 268 | 'error' => $app['security.last_error']($request), |
||
| 269 | 'last_username' => $app['session']->get('_security.last_username') |
||
| 270 | ]); |
||
| 271 | }); |
||
| 272 | |||
| 273 | $app->run(); |
||
| 274 |
If the size of the collection does not change during the iteration, it is generally a good practice to compute it beforehand, and not on each iteration: