Skip to content
system.inc.php 60.1 KiB
Newer Older
	
	//* ISPConfig mail function
	public function mail($to, $subject, $text, $from, $filepath = '', $filetype = 'application/pdf', $filename = '', $cc = '', $bcc = '', $from_name = '') {
		global $app, $conf;

		if($conf['demo_mode'] == true) $app->error("Mail sending disabled in demo mode.");

		$app->uses('getconf,ispcmail');
		$mail_config = $app->getconf->get_global_config('mail');
		if($mail_config['smtp_enabled'] == 'y') {
			$mail_config['use_smtp'] = true;
			$app->ispcmail->setOptions($mail_config);
		}
		$app->ispcmail->setSender($from, $from_name);
		$app->ispcmail->setSubject($subject);
		$app->ispcmail->setMailText($text);

		if($filepath != '') {
			if(!file_exists($filepath)) $app->error("Mail attachement does not exist ".$filepath);
			$app->ispcmail->readAttachFile($filepath);
		}

		if($cc != '') $app->ispcmail->setHeader('Cc', $cc);
		if($bcc != '') $app->ispcmail->setHeader('Bcc', $bcc);

		$app->ispcmail->send($to);
		$app->ispcmail->finish();
		
		return true;
	}
	
Marius Cramer's avatar
Marius Cramer committed
	public function is_allowed_user($username, $check_id = true, $restrict_names = false) {
		global $app;
		
Till Brehm's avatar
Till Brehm committed
		$name_blacklist = array('root','ispconfig','vmail','getmail');
		if(in_array($username,$name_blacklist)) return false;
		
		if(preg_match('/^[a-zA-Z0-9\.\-_]{1,32}$/', $username) == false) return false;
Marius Cramer's avatar
Marius Cramer committed
		if($check_id && intval($this->getuid($username)) < $this->min_uid) return false;
		
		if($restrict_names == true && preg_match('/^web\d+$/', $username) == false) return false;
		
		return true;
	}
	
	public function is_allowed_group($groupname, $check_id = true, $restrict_names = false) {
Marius Cramer's avatar
Marius Cramer committed
		global $app;
Till Brehm's avatar
Till Brehm committed
		$name_blacklist = array('root','ispconfig','vmail','getmail');
		if(in_array($groupname,$name_blacklist)) return false;
		if(preg_match('/^[a-zA-Z0-9\.\-_]{1,32}$/', $groupname) == false) return false;
		if($check_id && intval($this->getgid($groupname)) < $this->min_gid) return false;
Marius Cramer's avatar
Marius Cramer committed
		if($restrict_names == true && preg_match('/^client\d+$/', $groupname) == false) return false;
Marius Cramer's avatar
Marius Cramer committed
		return true;
	}
	
	public function last_exec_out() {
		return $this->_last_exec_out;
	}
	
	public function last_exec_retcode() {
		return $this->_last_exec_retcode;
	}
	
	public function exec_safe($cmd) {
		$arg_count = func_num_args();
		if($arg_count != substr_count($cmd, '?') + 1) {
			trigger_error('Placeholder count not matching argument list.', E_USER_WARNING);
			return false;
		}
		if($arg_count > 1) {
			$args = func_get_args();

			$pos = 0;
			$a = 0;
			foreach($args as $value) {
				$a++;
				
				$pos = strpos($cmd, '?', $pos);
				if($pos === false) {
					break;
				}
				$value = escapeshellarg($value);
				$cmd = substr_replace($cmd, $value, $pos, 1);
				$pos += strlen($value);
			}
		}
		
		$this->_last_exec_out = null;
		$this->_last_exec_retcode = null;
		$ret = exec($cmd, $this->_last_exec_out, $this->_last_exec_retcode);
		
		$this->app->log("safe_exec cmd: " . $cmd . " - return code: " . $this->_last_exec_retcode, LOGLEVEL_DEBUG);
		
		return $ret;
	}
	
	public function system_safe($cmd) {
		call_user_func_array(array($this, 'exec_safe'), func_get_args());
		return implode("\n", $this->_last_exec_out);
	}
	
	public function create_jailkit_user($username, $home_dir, $user_home_dir, $shell = '/bin/bash', $p_user = null, $p_user_home_dir = null) {
		// Check if USERHOMEDIR already exists
		if(!is_dir($home_dir . '/.' . $user_home_dir)) {
			$this->mkdirpath($home_dir . '/.' . $user_home_dir, 0755, $username);
		}

		// Reconfigure the chroot home directory for the user
		$cmd = 'usermod --home=? ? 2>/dev/null';
		$this->exec_safe($cmd, $home_dir . '/.' . $user_home_dir, $username);

		// Add the chroot user
		$cmd = 'jk_jailuser -n -s ? -j ? ?';
		$this->exec_safe($cmd, $shell, $home_dir, $username);

		//  We have to reconfigure the chroot home directory for the parent user
		if($p_user !== null) {
			$cmd = 'usermod --home=? ? 2>/dev/null';
			$this->exec_safe($cmd, $home_dir . '/.' . $p_user_home_dir, $p_user);
		}
		
		return true;
	}
	
	public function create_jailkit_programs($home_dir, $programs = array()) {
		if(empty($programs)) {
			return true;
		}
		$program_args = '';
		foreach($programs as $prog) {
			$program_args .= ' ' . escapeshellarg($prog);
		}
		
		$cmd = 'jk_cp -k ?' . $program_args;
		$this->exec_safe($cmd, $home_dir);
		
		return true;
	}
	
	public function create_jailkit_chroot($home_dir, $app_sections = array()) {
		if(empty($app_sections)) {
			return true;
		}
		
		// Change ownership of the chroot directory to root
		$this->chown($home_dir, 'root');
		$this->chgrp($home_dir, 'root');

		$app_args = '';
		foreach($app_sections as $app_section) {
			$app_args .= ' ' . escapeshellarg($app_section);
		}
		
		// Initialize the chroot into the specified directory with the specified applications
		$cmd = 'jk_init -f -k -c /etc/jailkit/jk_init.ini -j ?' . $app_args;
		$this->exec_safe($cmd, $home_dir);

		// Create the temp directory
		if(!is_dir($home_dir . '/tmp')) {
			$this->mkdirpath($home_dir . '/tmp', 0777);
		} else {
			$this->chmod($home_dir . '/tmp', 0777);
		}

		// Fix permissions of the root firectory
		$this->chmod($home_dir . '/bin', 0755);  // was chmod g-w $CHROOT_HOMEDIR/bin

		// mysql needs the socket in the chrooted environment
		$this->mkdirpath($home_dir . '/var/run/mysqld');
		
		// ln /var/run/mysqld/mysqld.sock $CHROOT_HOMEDIR/var/run/mysqld/mysqld.sock
		if(!file_exists("/var/run/mysqld/mysqld.sock")) {
			$this->exec_safe('ln ? ?', '/var/run/mysqld/mysqld.sock', $home_dir . '/var/run/mysqld/mysqld.sock');
		}
		
		return true;
	}
	
tbrehm's avatar
tbrehm committed
}