 8798083ad9
			
		
	
	8798083ad9
	
	
	
		
			
			Summary: Fixes T7034. Like HTTP, proxy requests to the correct host if a repository has an Almanac service host. Test Plan: Ran VCS requests through the proxy. Reviewers: btrahan Reviewed By: btrahan Subscribers: epriestley Maniphest Tasks: T7034 Differential Revision: https://secure.phabricator.com/D11543
		
			
				
	
	
		
			77 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env php
 | |
| <?php
 | |
| 
 | |
| $root = dirname(dirname(dirname(__FILE__)));
 | |
| require_once $root.'/scripts/__init_script__.php';
 | |
| 
 | |
| $keys = id(new PhabricatorAuthSSHKeyQuery())
 | |
|   ->setViewer(PhabricatorUser::getOmnipotentUser())
 | |
|   ->execute();
 | |
| 
 | |
| if (!$keys) {
 | |
|   echo pht('No keys found.')."\n";
 | |
|   exit(1);
 | |
| }
 | |
| 
 | |
| $bin = $root.'/bin/ssh-exec';
 | |
| foreach ($keys as $ssh_key) {
 | |
|   $key_argv = array();
 | |
|   $object = $ssh_key->getObject();
 | |
|   if ($object instanceof PhabricatorUser) {
 | |
|     $key_argv[] = '--phabricator-ssh-user';
 | |
|     $key_argv[] = $object->getUsername();
 | |
|   } else if ($object instanceof AlmanacDevice) {
 | |
|     if (!$ssh_key->getIsTrusted()) {
 | |
|       // If this key is not a trusted device key, don't allow SSH
 | |
|       // authentication.
 | |
|       continue;
 | |
|     }
 | |
|     $key_argv[] = '--phabricator-ssh-device';
 | |
|     $key_argv[] = $object->getName();
 | |
|   } else {
 | |
|     // We don't know what sort of key this is; don't permit SSH auth.
 | |
|     continue;
 | |
|   }
 | |
| 
 | |
|   $key_argv[] = '--phabricator-ssh-key';
 | |
|   $key_argv[] = $ssh_key->getID();
 | |
| 
 | |
|   $cmd = csprintf('%s %Ls', $bin, $key_argv);
 | |
| 
 | |
|   $instance = PhabricatorEnv::getEnvConfig('cluster.instance');
 | |
|   if (strlen($instance)) {
 | |
|     $cmd = csprintf('PHABRICATOR_INSTANCE=%s %C', $instance, $cmd);
 | |
|   }
 | |
| 
 | |
|   // This is additional escaping for the SSH 'command="..."' string.
 | |
|   $cmd = addcslashes($cmd, '"\\');
 | |
| 
 | |
|   // Strip out newlines and other nonsense from the key type and key body.
 | |
| 
 | |
|   $type = $ssh_key->getKeyType();
 | |
|   $type = preg_replace('@[\x00-\x20]+@', '', $type);
 | |
|   if (!strlen($type)) {
 | |
|     continue;
 | |
|   }
 | |
| 
 | |
|   $key = $ssh_key->getKeyBody();
 | |
|   $key = preg_replace('@[\x00-\x20]+@', '', $key);
 | |
|   if (!strlen($key)) {
 | |
|     continue;
 | |
|   }
 | |
| 
 | |
|   $options = array(
 | |
|     'command="'.$cmd.'"',
 | |
|     'no-port-forwarding',
 | |
|     'no-X11-forwarding',
 | |
|     'no-agent-forwarding',
 | |
|     'no-pty',
 | |
|   );
 | |
|   $options = implode(',', $options);
 | |
| 
 | |
|   $lines[] = $options.' '.$type.' '.$key."\n";
 | |
| }
 | |
| 
 | |
| echo implode('', $lines);
 | |
| exit(0);
 |