Mercurial > hg4j
annotate src/org/tmatesoft/hg/internal/remote/SshAuthMethod.java @ 699:a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Thu, 08 Aug 2013 19:18:50 +0200 | 
| parents | |
| children | 
| rev | line source | 
|---|---|
| 
699
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
1 /* | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
2 * Copyright (c) 2013 TMate Software Ltd | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
3 * | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
4 * This program is free software; you can redistribute it and/or modify | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
5 * it under the terms of the GNU General Public License as published by | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
6 * the Free Software Foundation; version 2 of the License. | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
7 * | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
8 * This program is distributed in the hope that it will be useful, | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
11 * GNU General Public License for more details. | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
12 * | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
13 * For information on how to redistribute this software under | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
14 * the terms of a license other than GNU General Public License | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
15 * contact TMate Software at support@hg4j.com | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
16 */ | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
17 package org.tmatesoft.hg.internal.remote; | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
18 | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
19 import java.io.CharArrayWriter; | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
20 import java.io.IOException; | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
21 import java.io.InputStream; | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
22 import java.security.cert.X509Certificate; | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
23 import java.util.Arrays; | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
24 | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
25 import org.tmatesoft.hg.auth.HgAuthFailedException; | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
26 import org.tmatesoft.hg.auth.HgAuthMethod; | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
27 | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
28 import com.trilead.ssh2.Connection; | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
29 | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
30 /** | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
31 * | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
32 * @author Artem Tikhomirov | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
33 * @author TMate Software Ltd. | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
34 */ | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
35 public final class SshAuthMethod implements HgAuthMethod { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
36 | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
37 private final Connection conn; | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
38 | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
39 public SshAuthMethod(Connection connection) { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
40 conn = connection; | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
41 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
42 | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
43 public void tryWithUserInfo(String uriUserInfo) throws HgAuthFailedException { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
44 assert uriUserInfo != null && uriUserInfo.trim().length() > 0; | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
45 int colon = uriUserInfo.indexOf(':'); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
46 if (colon == -1) { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
47 String username = uriUserInfo; | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
48 withPassword(username, null); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
49 } else { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
50 String username = uriUserInfo.substring(0, colon); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
51 String password = uriUserInfo.substring(colon+1); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
52 withPassword(username, password); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
53 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
54 return; | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
55 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
56 | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
57 public void noCredentials() throws HgAuthFailedException { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
58 try { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
59 String username = System.getProperty("user.name"); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
60 if (!conn.authenticateWithNone(username)) { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
61 throw authFailed(username); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
62 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
63 } catch (IOException ex) { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
64 throw commFailed(ex); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
65 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
66 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
67 | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
68 public void withPublicKey(String username, InputStream privateKey, String passphrase) throws HgAuthFailedException { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
69 if (username == null) { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
70 // FIXME AuthFailure and AuthFailed or similar distinct exceptions to tell true authentication issues from | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
71 // failures around it. | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
72 throw new HgAuthFailedException("Need username", null); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
73 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
74 if (privateKey == null) { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
75 throw new HgAuthFailedException("Need private key", null); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
76 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
77 CharArrayWriter a = new CharArrayWriter(2048); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
78 int r; | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
79 try { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
80 while((r = privateKey.read()) != -1) { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
81 a.append((char) r); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
82 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
83 } catch (IOException ex) { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
84 throw new HgAuthFailedException("Failed to read private key", ex); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
85 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
86 try { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
87 boolean success = conn.authenticateWithPublicKey(username, a.toCharArray(), passphrase); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
88 if (!success) { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
89 throw authFailed(username); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
90 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
91 } catch (IOException ex) { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
92 throw commFailed(ex); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
93 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
94 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
95 | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
96 public void withPassword(String username, String password) throws HgAuthFailedException { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
97 if (username == null) { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
98 throw new HgAuthFailedException("Need username", null); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
99 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
100 try { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
101 boolean success; | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
102 if (password == null) { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
103 success = conn.authenticateWithNone(username); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
104 } else { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
105 success = conn.authenticateWithPassword(username, password); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
106 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
107 if (!success) { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
108 throw authFailed(username); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
109 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
110 } catch (IOException ex) { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
111 throw commFailed(ex); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
112 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
113 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
114 | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
115 public void withCertificate(X509Certificate[] clientCert) throws HgAuthFailedException { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
116 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
117 | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
118 public boolean supportsPublicKey() { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
119 return true; | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
120 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
121 | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
122 public boolean supportsPassword() { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
123 return true; | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
124 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
125 | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
126 public boolean supportsCertificate() { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
127 return true; | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
128 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
129 | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
130 private HgAuthFailedException commFailed(IOException ex) { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
131 return new HgAuthFailedException("Communication failure while authenticating", ex); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
132 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
133 | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
134 private HgAuthFailedException authFailed(String username) throws IOException { | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
135 final String[] authMethodsLeft = conn.getRemainingAuthMethods(username); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
136 return new HgAuthFailedException(String.format("Failed to authenticate, other methods to try: %s", Arrays.toString(authMethodsLeft)), null); | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
137 } | 
| 
 
a483b2b68a2e
Provisional APIs and respective implementation for http, https and ssh remote repositories
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
138 } | 
