156 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
| <?php
 | |
| 
 | |
| namespace Grav\Plugin\GitSync;
 | |
| 
 | |
| use Defuse\Crypto\Crypto;
 | |
| use Grav\Common\Config\Config;
 | |
| use Grav\Common\Grav;
 | |
| use Grav\Common\Utils;
 | |
| use SebastianBergmann\Git\RuntimeException;
 | |
| 
 | |
| class Helper
 | |
| {
 | |
|     /** @var string */
 | |
|     private static $hash = '594ef69d-6c29-45f7-893a-f1b4342687d3';
 | |
| 
 | |
|     /**
 | |
|      * Checks if the user/ folder is already initialized
 | |
|      *
 | |
|      * @return bool
 | |
|      */
 | |
|     public static function isGitInitialized()
 | |
|     {
 | |
|         return file_exists(rtrim(USER_DIR, '/') . '/.git');
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param bool $version
 | |
|      * @return bool|string
 | |
|      */
 | |
|     public static function isGitInstalled($version = false)
 | |
|     {
 | |
|         $bin = Helper::getGitBinary();
 | |
| 
 | |
|         exec($bin . ' --version', $output, $returnValue);
 | |
| 
 | |
|         $installed = $returnValue === 0;
 | |
| 
 | |
|         if ($version && $output) {
 | |
|             $output = explode(' ', array_shift($output));
 | |
|             $versions = array_filter($output, static function($item) {
 | |
|                 return version_compare($item, '0.0.1', '>=');
 | |
|             });
 | |
| 
 | |
|             $installed = array_shift($versions);
 | |
|         }
 | |
| 
 | |
|         return $installed;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param bool $override
 | |
|      * @return string
 | |
|      */
 | |
|     public static function getGitBinary($override = false)
 | |
|     {
 | |
|         /** @var Config $grav */
 | |
|         $config = Grav::instance()['config'];
 | |
| 
 | |
|         return $override ?: $config->get('plugins.git-sync.git.bin', 'git');
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param string $user
 | |
|      * @param string $password
 | |
|      * @param string $repository
 | |
|      * @return string
 | |
|      */
 | |
|     public static function prepareRepository($user, $password, $repository)
 | |
|     {
 | |
|         $user = $user ? urlencode($user) . ':' : '';
 | |
|         $password = urlencode($password);
 | |
| 
 | |
|         if (Utils::startsWith($repository, 'ssh://')) {
 | |
|             return $repository;
 | |
|         }
 | |
| 
 | |
|         return str_replace('://', "://${user}${password}@", $repository);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param string $user
 | |
|      * @param string $password
 | |
|      * @param string $repository
 | |
|      * @return string[]
 | |
|      */
 | |
|     public static function testRepository($user, $password, $repository, $branch)
 | |
|     {
 | |
|         $git = new GitSync();
 | |
|         $repository = self::prepareRepository($user, $password, $repository);
 | |
| 
 | |
|         try {
 | |
|             return $git->testRepository($repository, $branch);
 | |
|         } catch (RuntimeException $e) {
 | |
|             return [$e->getMessage()];
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param string $password
 | |
|      * @return string
 | |
|      * @throws \Defuse\Crypto\Exception\EnvironmentIsBrokenException
 | |
|      */
 | |
|     public static function encrypt($password)
 | |
|     {
 | |
|         return 'gitsync-' . Crypto::encryptWithPassword($password, self::$hash);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param string $enc_password
 | |
|      * @return string
 | |
|      */
 | |
|     public static function decrypt($enc_password)
 | |
|     {
 | |
|         if (strpos($enc_password, 'gitsync-') === 0) {
 | |
|             $enc_password = substr($enc_password, 8);
 | |
| 
 | |
|             return Crypto::decryptWithPassword($enc_password, self::$hash);
 | |
|         }
 | |
| 
 | |
|         return $enc_password;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return bool
 | |
|      */
 | |
|     public static function synchronize()
 | |
|     {
 | |
|         if (!self::isGitInstalled() || !self::isGitInitialized()) {
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|         $git = new GitSync();
 | |
| 
 | |
|         if ($git->hasChangesToCommit()) {
 | |
|             $git->commit();
 | |
|         }
 | |
| 
 | |
|         // synchronize with remote
 | |
|         $git->sync();
 | |
| 
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param string $str
 | |
|      * @param string $password
 | |
|      * @return string
 | |
|      */
 | |
|     public static function preventReadablePassword($str, $password)
 | |
|     {
 | |
|         $encoded = urlencode(self::decrypt($password));
 | |
| 
 | |
|         return str_replace($encoded, '{password}', $str);
 | |
|     }
 | |
| }
 |