1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-27 01:02:42 +01:00

Fix repository interactions for SVN repositories using the SVN protocol with SASL

Summary: also makes the UI more general for this username + password business.

Test Plan:
- configure a phabricator repository from the svn server @asherwin provided which is configured for svn protocol with SASL
- observed phabricator failing without my patch
- upgraded my SVN client to support SASL (protip for mac users - http://www.wandisco.com/subversion/download#osx)
- applied patch to phabricator
- restarted daemons
- noted daemon success - diffusion populating nicely

Reviewers: epriestley

Reviewed By: epriestley

CC: aran, Koolvin

Maniphest Tasks: T1260

Differential Revision: https://secure.phabricator.com/D2549
This commit is contained in:
Bob Trahan 2012-05-23 12:37:43 -07:00
parent a438c87c52
commit 65710ee2d2
2 changed files with 45 additions and 8 deletions

View file

@ -231,7 +231,7 @@ final class PhabricatorRepositoryEditController
$has_branches = ($is_git || $is_mercurial); $has_branches = ($is_git || $is_mercurial);
$has_local = ($is_git || $is_mercurial); $has_local = ($is_git || $is_mercurial);
$has_branch_filter = ($is_git); $has_branch_filter = ($is_git);
$has_http_support = $is_svn; $has_auth_support = $is_svn;
if ($request->isFormPost()) { if ($request->isFormPost()) {
$tracking = ($request->getStr('tracking') == 'enabled' ? true : false); $tracking = ($request->getStr('tracking') == 'enabled' ? true : false);
@ -442,8 +442,9 @@ final class PhabricatorRepositoryEditController
'Enter the <strong>Repository Root</strong> for this SVN repository. '. 'Enter the <strong>Repository Root</strong> for this SVN repository. '.
'You can figure this out by running <tt>svn info</tt> and looking at '. 'You can figure this out by running <tt>svn info</tt> and looking at '.
'the value in the <tt>Repository Root</tt> field. It should be a URI '. 'the value in the <tt>Repository Root</tt> field. It should be a URI '.
'and look like <tt>http://svn.example.org/svn/</tt> or '. 'and look like <tt>http://svn.example.org/svn/</tt>, '.
'<tt>svn+ssh://svn.example.com/svnroot/</tt>'; '<tt>svn+ssh://svn.example.com/svnroot/</tt>, or '.
'<tt>svn://svn.example.net/svn/</tt>';
$inset->appendChild( $inset->appendChild(
'<p class="aphront-form-instructions">'.$instructions.'</p>'); '<p class="aphront-form-instructions">'.$instructions.'</p>');
$uri_label = 'Repository Root'; $uri_label = 'Repository Root';
@ -489,23 +490,25 @@ final class PhabricatorRepositoryEditController
'...specify a path on disk where the daemon should '. '...specify a path on disk where the daemon should '.
'look for a private key.')); 'look for a private key.'));
if ($has_http_support) { if ($has_auth_support) {
$inset $inset
->appendChild( ->appendChild(
'<div class="aphront-form-instructions">'. '<div class="aphront-form-instructions">'.
'If you want to connect to this repository over HTTP Basic Auth, '. 'If you want to connect to this repository with a username and '.
'password, such as over HTTP Basic Auth or SVN with SASL, '.
'enter the username and password to use. You can leave these '. 'enter the username and password to use. You can leave these '.
'fields blank if the repository does not use HTTP Basic Auth.'. 'fields blank if the repository does not use a username and '.
'password for authentication.'.
'</div>') '</div>')
->appendChild( ->appendChild(
id(new AphrontFormTextControl()) id(new AphrontFormTextControl())
->setName('http-login') ->setName('http-login')
->setLabel('HTTP Basic Login') ->setLabel('Username')
->setValue($repository->getDetail('http-login'))) ->setValue($repository->getDetail('http-login')))
->appendChild( ->appendChild(
id(new AphrontFormPasswordControl()) id(new AphrontFormPasswordControl())
->setName('http-pass') ->setName('http-pass')
->setLabel('HTTP Basic Password') ->setLabel('Password')
->setValue($repository->getDetail('http-pass'))); ->setValue($repository->getDetail('http-pass')));
} }

View file

@ -228,6 +228,25 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO {
throw new Exception( throw new Exception(
"No support for HTTP Basic Auth in this version control system."); "No support for HTTP Basic Auth in this version control system.");
} }
} else if ($this->shouldUseSVNProtocol()) {
switch ($this->getVersionControlSystem()) {
case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
$pattern =
"svn ".
"--non-interactive ".
"--no-auth-cache ".
"--username %s ".
"--password %s ".
$pattern;
array_unshift(
$args,
$this->getDetail('http-login'),
$this->getDetail('http-pass'));
break;
default:
throw new Exception(
"SVN protocol is SVN only.");
}
} else { } else {
switch ($this->getVersionControlSystem()) { switch ($this->getVersionControlSystem()) {
case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN: case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
@ -320,6 +339,17 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO {
} }
} }
public function shouldUseSVNProtocol() {
$uri = new PhutilURI($this->getRemoteURI());
$protocol = $uri->getProtocol();
if ($this->isSVNProtocol($protocol)) {
return (bool)$this->getDetail('http-login');
} else {
return false;
}
}
public function getPublicRemoteURI() { public function getPublicRemoteURI() {
$uri = new PhutilURI($this->getRemoteURI()); $uri = new PhutilURI($this->getRemoteURI());
@ -343,6 +373,10 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO {
return ($protocol == 'http' || $protocol == 'https'); return ($protocol == 'http' || $protocol == 'https');
} }
private function isSVNProtocol($protocol) {
return ($protocol == 'svn');
}
public function isTracked() { public function isTracked() {
return $this->getDetail('tracking-enabled', false); return $this->getDetail('tracking-enabled', false);
} }