-
Notifications
You must be signed in to change notification settings - Fork 8
/
CurlSFTP.m
170 lines (128 loc) · 4 KB
/
CurlSFTP.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
//
// CurlSFTP.m
// objective-curl
//
// Copyright 2010 Nick Jensen <http://goto11.net>
//
#import "CurlSFTP.h"
#import "Upload.h"
#import "SSHUploadOperation.h"
#import "NSString+PathExtras.h"
NSString * const DEFAULT_KNOWN_HOSTS = @"~/.ssh/known_hosts";
@implementation CurlSFTP
@synthesize knownHostsFile;
/*
* Initializes the class instance for performing FTP uploads. If you don't use this method then you will have to manually set some or all
* of these options before doing any uploads
*/
- (id)init
{
if (self = [super init])
{
[self setProtocol:kSecProtocolTypeSSH];
[self setKnownHostsFile:[DEFAULT_KNOWN_HOSTS stringByExpandingTildeInPath]];
}
return self;
}
/*
* Cleanup
*/
- (void)dealloc
{
[knownHostsFile release], knownHostsFile = nil;
[super dealloc];
}
/*
* Generates a new curl_easy_handle with SFTP-specific options set.
*
* See http://curl.haxx.se/libcurl/c/libcurl-easy.html
*/
- (CURL *)newHandle
{
CURL *handle = [super newHandle];
curl_easy_setopt(handle, CURLOPT_SSH_KNOWNHOSTS, [knownHostsFile UTF8String]);
return handle;
}
- (NSString *)protocolPrefix
{
return @"sftp";
}
- (int)defaultPort
{
return 22;
}
- (Upload *)uploadFilesAndDirectories:(NSArray *)filesAndDirectories toHost:(NSString *)hostname username:(NSString *)username
{
return [self uploadFilesAndDirectories:filesAndDirectories
toHost:hostname
username:username
password:@""
directory:@"~/"
port:[self defaultPort]];
}
- (Upload *)uploadFilesAndDirectories:(NSArray *)filesAndDirectories toHost:(NSString *)hostname username:(NSString *)username password:(NSString *)password
{
return [self uploadFilesAndDirectories:filesAndDirectories
toHost:hostname
username:username
password:password
directory:@""
port:[self defaultPort]];
}
- (Upload *)uploadFilesAndDirectories:(NSArray *)filesAndDirectories toHost:(NSString *)hostname username:(NSString *)username password:(NSString *)password directory:(NSString *)directory
{
return [self uploadFilesAndDirectories:filesAndDirectories
toHost:hostname
username:username
password:password
directory:directory
port:[self defaultPort]];
}
- (Upload *)uploadFilesAndDirectories:(NSArray *)filesAndDirectories toHost:(NSString *)hostname username:(NSString *)username password:(NSString *)password directory:(NSString *)directory port:(int)port
{
Upload *upload = [[[Upload alloc] init] autorelease];
[upload setProtocol:[self protocol]];
[upload setProtocolPrefix:[self protocolPrefix]];
[upload setLocalFiles:filesAndDirectories];
[upload setHostname:hostname];
[upload setUsername:username];
[upload setPassword:password];
[upload setPath:[directory pathForFTP]];
[upload setPort:port];
[self upload:upload];
return upload;
}
- (void)upload:(Upload *)record
{
SSHUploadOperation *op = [[SSHUploadOperation alloc] initWithHandle:[self newHandle] delegate:delegate];
[record setProgress:0];
[record setStatus:TRANSFER_STATUS_QUEUED];
[record setConnected:NO];
[record setCancelled:NO];
[op setUpload:record];
[operationQueue addOperation:op];
[op release];
}
/*
* Returns an array of files that exist in a remote directory. Will use items in the directoryListCache if they exist. Uses
* the default SFTP port.
*/
- (RemoteFolder *)listRemoteDirectory:(NSString *)directory onHost:(NSString *)host
{
return [self listRemoteDirectory:directory
onHost:host
forceReload:NO
port:[self defaultPort]];
}
/*
* Returns an array of files that exist in a remote directory. The forceReload flag will bypass using the directoryListCache and
* always return a fresh listing from the specified server. Uses the default SFTP port.
*/
- (RemoteFolder *)listRemoteDirectory:(NSString *)directory onHost:(NSString *)host forceReload:(BOOL)reload
{
return [self listRemoteDirectory:directory
onHost:host
forceReload:reload
port:[self defaultPort]];
}
@end