/**
	 * @param  $formData
	 * @param string $entryPoint
	 * @return bool
	 */
	function tryCreateSubmit( $formData, $entryPoint = 'internal' ) {
		if ( $formData['users'] ) {
			$users = explode( ',', $formData['users'] );
		} else {
			$users = array();
		}
		if ( $formData['hosts'] ) {
			$hosts = explode( ',', $formData['hosts'] );
		} else {
			$hosts = array();
		}
		if ( $formData['commands'] ) {
			$commands = explode( ',', $formData['commands'] );
		} else {
			$commands = array();
		}
		if ( $formData['options'] ) {
			$options = explode( ',', $formData['options'] );
		} else {
			$options = array();
		}
		$success = OpenStackNovaSudoer::createSudoer( $formData['sudoername'], $users, $hosts, $commands, $options );
		if ( ! $success ) {
			$this->getOutput()->addWikiMsg( 'openstackmanager-createsudoerfailed' );
			return false;
		}
		$this->getOutput()->addWikiMsg( 'openstackmanager-createdsudoer' );

		$out = '<br />';
		$out .= Linker::link( $this->getTitle(), wfMsgHtml( 'openstackmanager-addadditionalsudoer' ) );
		$this->getOutput()->addHTML( $out );

		return true;
	}
 /**
  * @param  $formData
  * @param string $entryPoint
  * @return bool
  */
 function tryCreateSubmit($formData, $entryPoint = 'internal')
 {
     if ($formData['commands']) {
         $commands = explode("\n", $formData['commands']);
     } else {
         $commands = array();
     }
     if ($formData['options']) {
         $options = explode("\n", $formData['options']);
     } else {
         $options = array();
     }
     if ($formData['requirepassword']) {
         $options[] = 'authenticate';
     } else {
         $options[] = '!authenticate';
     }
     $runasusers = $this->removeALLFromRunAsUserKeys($formData['runas']);
     $success = OpenStackNovaSudoer::createSudoer($formData['sudoername'], $formData['project'], $this->removeALLFromUserKeys($formData['users']), $runasusers, $commands, $options);
     if (!$success) {
         $this->getOutput()->addWikiMsg('openstackmanager-createsudoerfailed');
         return false;
     }
     $this->getOutput()->addWikiMsg('openstackmanager-createdsudoer');
     $out = '<br />';
     $out .= Linker::link($this->getPageTitle(), $this->msg('openstackmanager-backsudoerlist')->escaped());
     $this->getOutput()->addHTML($out);
     return true;
 }
 /**
  * @static
  * @param  $groupName
  * @param  $project OpenStackNovaProject
  * @param  $initialUser
  * @return null|OpenStackNovaServiceGroup
  */
 static function createServiceGroup($inGroupName, $project, $initialUser)
 {
     global $wgAuth;
     global $wgOpenStackManagerLDAPUser;
     global $wgOpenStackManagerLDAPDefaultShell;
     global $wgOpenStackManagerLDAPServiceGroupBaseDN;
     global $wgMemc;
     OpenStackNovaLdapConnection::connect();
     $projectPrefix = $project->getProjectName() . '.';
     # We don't want naming collisions between service groups and actual groups
     # or users.  So, prepend $projectPrefix to the requested group name.
     if (strpos($inGroupName, $projectPrefix, 0) === 0) {
         # The user was clever and already added the prefix.
         $groupName = $inGroupName;
         $simpleGroupName = substr($inGroupName, strlen($projectPrefix));
     } else {
         $groupName = $projectPrefix . $inGroupName;
         $simpleGroupName = $inGroupName;
     }
     if ($initialUser) {
         $user = new OpenStackNovaUser($initialUser);
         if (!$user->userDN) {
             $wgAuth->printDebug("Unable to find initial user {$initialUser} for new group {$groupName}", NONSENSITIVE);
             return null;
         }
         $initialUserDN = $user->userDN;
     }
     $key = wfMemcKey('openstackmanager', 'servicegroup', $groupName);
     $wgMemc->delete($key);
     $group = array();
     $group['objectclass'][] = 'posixgroup';
     $group['objectclass'][] = 'groupofnames';
     $group['cn'] = $groupName;
     $groupdn = 'cn=' . $groupName . ',' . $wgOpenStackManagerLDAPServiceGroupBaseDN;
     $group['gidnumber'] = OpenStackNovaUser::getNextIdNumber($wgAuth, 'gidnumber');
     $group['member'] = array();
     if ($initialUser) {
         $group['member'][] = $initialUserDN;
     }
     $success = LdapAuthenticationPlugin::ldap_add($wgAuth->ldapconn, $groupdn, $group);
     if ($success) {
         $wgAuth->printDebug("Successfully added service group {$groupdn}", NONSENSITIVE);
     } else {
         $wgAuth->printDebug("Failed to add service group {$groupdn}", NONSENSITIVE);
         return null;
     }
     # stamp out regular expressions!
     $homeDir = $project->getServiceGroupHomedirPattern();
     $homeDir = str_ireplace('%u', $simpleGroupName, $homeDir);
     $homeDir = str_ireplace('%p', $projectPrefix, $homeDir);
     # Now create the special SG member
     $newGroup = self::getServiceGroupByName($groupName, $project);
     $userdn = $newGroup->getSpecialUserDN();
     $user = array();
     $user['objectclass'][] = 'shadowaccount';
     $user['objectclass'][] = 'posixaccount';
     $user['objectclass'][] = 'person';
     $user['objectclass'][] = 'top';
     $user['loginshell'] = $wgOpenStackManagerLDAPDefaultShell;
     $user['homedirectory'] = $homeDir;
     $user['uidnumber'] = $group['gidnumber'];
     $user['gidnumber'] = $group['gidnumber'];
     $user['uid'] = $groupName;
     $user['sn'] = $groupName;
     $user['cn'] = $groupName;
     $success = LdapAuthenticationPlugin::ldap_add($wgAuth->ldapconn, $userdn, $user);
     if ($success) {
         $wgAuth->printDebug("Successfully created service user {$userdn}", NONSENSITIVE);
     } else {
         $wgAuth->printDebug("Failed to create service user {$userdn}", NONSENSITIVE);
         return null;
     }
     # Create Sudo policy so that the service user can chown files in its homedir
     if (OpenStackNovaSudoer::createSudoer($groupName . '-chmod', $project->getProjectName(), array($groupName), array(), array('/bin/chown -R ' . $groupName . '\\:' . $groupName . ' ' . $homeDir), array('!authenticate'))) {
         $wgAuth->printDebug("Successfully created chmod sudo policy for {$groupName}", NONSENSITIVE);
     } else {
         $wgAuth->printDebug("Failed to  creat chmod sudo policy for {$groupName}", NONSENSITIVE);
     }
     # Create Sudo policy so that members of the group can sudo as the service user
     if (OpenStackNovaSudoer::createSudoer('runas-' . $groupName, $project->getProjectName(), array("%" . $groupName), array($groupName), array('ALL'), array('!authenticate'))) {
         $wgAuth->printDebug("Successfully created run-as sudo policy for {$groupName}", NONSENSITIVE);
     } else {
         $wgAuth->printDebug("Failed to  creat run-as sudo policy for {$groupName}", NONSENSITIVE);
     }
     return $newGroup;
 }
 /**
  * Create a new project based on project name. This function will also create
  * all roles needed by the project.
  *
  * @static
  * @param  $projectname
  * @return bool
  */
 static function createProject($projectname)
 {
     global $wgAuth;
     global $wgOpenStackManagerLDAPUser;
     global $wgOpenStackManagerLDAPProjectBaseDN;
     OpenStackNovaLdapConnection::connect();
     $project = array();
     $project['objectclass'][] = 'extensibleobject';
     $project['objectclass'][] = 'groupofnames';
     $project['cn'] = $projectname;
     $project['member'] = $wgOpenStackManagerLDAPUser;
     $projectdn = 'cn=' . $projectname . ',' . $wgOpenStackManagerLDAPProjectBaseDN;
     // if we're not going to use project groups,
     // then create this project as a posixgroup
     if (!OpenStackNovaProject::useProjectGroup()) {
         $project['gidnumber'] = OpenStackNovaUser::getNextIdNumber($wgAuth, 'gidnumber');
         $project['objectclass'][] = 'posixgroup';
     }
     $success = LdapAuthenticationPlugin::ldap_add($wgAuth->ldapconn, $projectdn, $project);
     $project = new OpenStackNovaProject($projectname);
     if ($success) {
         foreach (self::$rolenames as $rolename) {
             OpenStackNovaRole::createRole($rolename, $project);
             # TODO: If role addition fails, find a way to fail gracefully
             # Though, if the project was added successfully, it is unlikely
             # that role addition will fail.
         }
         $sudoerOU = array();
         $sudoerOU['objectclass'][] = 'organizationalunit';
         $sudoerOU['ou'] = 'sudooers';
         $sudoerOUdn = 'ou=sudoers,' . $projectdn;
         LdapAuthenticationPlugin::ldap_add($wgAuth->ldapconn, $sudoerOUdn, $sudoerOU);
         # TODO: If sudoerOU creation fails we need to be able to fail gracefully
         $wgAuth->printDebug("Successfully added project {$projectname}", NONSENSITIVE);
         // Now that we've created the Project, if we
         // are supposed to use a corresponding Project Group
         // to manage posix group permissions, do so now.
         if (OpenStackNovaProject::useProjectGroup()) {
             OpenStackNovaProjectGroup::createProjectGroup($projectname);
             # TODO: If project group creation fails we need to be able to fail gracefully
         }
         // Create two default, permissive sudo policies.  First,
         //  allow sudo (as root) for all members...
         $projectGroup = "%" . $project->getProjectGroup()->getProjectGroupName();
         if (OpenStackNovaSudoer::createSudoer('default-sudo', $projectname, array($projectGroup), array(), array('ALL'), array('!authenticate'))) {
             $wgAuth->printDebug("Successfully created default sudo policy for {$projectname}", NONSENSITIVE);
         }
         // Now, allow all project members to sudo to all other users.
         $projectGroup = "%" . $project->getProjectGroup()->getProjectGroupName();
         if (OpenStackNovaSudoer::createSudoer('default-sudo-as', $projectname, array($projectGroup), array("{$projectGroup}"), array('ALL'), array('!authenticate'))) {
             $wgAuth->printDebug("Successfully created default sudo-as policy for {$projectname}", NONSENSITIVE);
         }
     } else {
         $wgAuth->printDebug("Failed to add project {$projectname}", NONSENSITIVE);
         return false;
     }
     OpenStackNovaProject::createServiceGroupOUs($projectname);
     return true;
 }