1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 25 // MARKER(update_precomp.py): autogen include statement, do not remove 26 #include "precompiled_ucb.hxx" 27 #include <com/sun/star/ucb/OpenMode.hpp> 28 #include "ftpurl.hxx" 29 #include "ftploaderthread.hxx" 30 #include "ftphandleprovider.hxx" 31 #include "debughelper.hxx" 32 #include <rtl/memory.h> 33 #include <vector> 34 35 #define TESTEVAL \ 36 if(number_of_errors) \ 37 fprintf(stderr,"errors in %s: %d\n",name,number_of_errors); \ 38 return number_of_errors 39 40 41 namespace ccsu = com::sun::star::ucb; 42 43 44 struct ServerInfo { 45 rtl::OUString host; 46 rtl::OUString port; 47 rtl::OUString username; 48 rtl::OUString password; 49 rtl::OUString account; 50 }; 51 52 53 class FTPHandleProviderI 54 : public ftp::FTPHandleProvider { 55 56 public: 57 58 FTPHandleProviderI() 59 : p(new ftp::FTPLoaderThread) { 60 } 61 62 ~FTPHandleProviderI() { 63 delete p; 64 } 65 66 virtual CURL* handle() { 67 return p->handle(); 68 } 69 70 bool forHost(const rtl::OUString& host, 71 const rtl::OUString& port, 72 const rtl::OUString& username, 73 rtl::OUString& password, 74 rtl::OUString& account) 75 { 76 for(unsigned int i = 0; i < m_ServerInfo.size(); ++i) 77 if(host == m_ServerInfo[i].host && 78 port == m_ServerInfo[i].port && 79 username == m_ServerInfo[i].username ) { 80 password = m_ServerInfo[i].password; 81 account = m_ServerInfo[i].account; 82 return true; 83 } 84 85 return false; 86 } 87 88 virtual bool setHost(const rtl::OUString& host, 89 const rtl::OUString& port, 90 const rtl::OUString& username, 91 const rtl::OUString& password, 92 const rtl::OUString& account) 93 { 94 ServerInfo inf; 95 inf.host = host; 96 inf.port = port; 97 inf.username = username; 98 inf.password = password; 99 inf.account = account; 100 101 bool present(false); 102 for(unsigned int i = 0; i < m_ServerInfo.size(); ++i) 103 if(host == m_ServerInfo[i].host && 104 port == m_ServerInfo[i].port) { 105 m_ServerInfo[i] = inf; 106 present = true; 107 } 108 109 if(!present) 110 m_ServerInfo.push_back(inf); 111 112 return !present; 113 114 } 115 116 117 private: 118 119 std::vector<ServerInfo> m_ServerInfo; 120 ftp::FTPLoaderThread *p; 121 }; 122 123 124 125 // Here are some test for the parsing of an url. 126 127 #define TESTURL \ 128 { \ 129 ftp::FTPURL url(rtl::OUString::createFromAscii(ascii),&prov); \ 130 if(!url.username().equalsAscii(n)) {\ 131 ++number_of_errors; \ 132 err_msg("wrong username: ",url.username()); \ 133 }} 134 135 int test_ftpurl(void) { 136 const char* name = "test_ftpurl"; 137 int number_of_errors = 0; 138 139 FTPHandleProviderI prov; 140 char* ascii,*n,*p; 141 142 ascii = "ftp://abi:psswd@host/eins/../drei", n = "abi", p = "psswd"; 143 TESTURL; 144 145 ascii = "ftp://:psswd@host:22/eins/../drei", n = "anonymous", p = "psswd"; 146 TESTURL; 147 148 ascii = "ftp://host/bla/../../test/", n = "anonymous", p = ""; 149 TESTURL; 150 151 TESTEVAL; 152 } 153 154 155 int test_ftplist(void) { 156 int number_of_errors = 0; 157 const char* name = "test_ftplist"; 158 159 FTPHandleProviderI provider; 160 161 ftp::FTPURL url( 162 rtl::OUString::createFromAscii( 163 "ftp://abi:psswd@abi-1/dir"), 164 &provider); 165 166 std::vector<ftp::FTPDirentry> vec = 167 url.list(com::sun::star::ucb::OpenMode::ALL); 168 169 if(vec.size() != 3) 170 ++number_of_errors; 171 172 if(!(vec[0].m_aName.equalsAscii("dir1") && 173 vec[1].m_aName.equalsAscii("dir2") && 174 vec[2].m_aName.equalsAscii("file1"))) 175 ++number_of_errors; 176 177 TESTEVAL; 178 } 179 180 181 #define TESTPARENT \ 182 { \ 183 ftp::FTPURL url(rtl::OUString::createFromAscii(ascii),&prov); \ 184 urlStr = url.parent(); \ 185 if(!urlStr.equalsAscii(expect)) \ 186 ++number_of_errors; \ 187 } 188 189 190 int test_ftpparent(void) { 191 int number_of_errors = 0; 192 const char* name = "test_ftpparent"; 193 FTPHandleProviderI prov; 194 195 rtl::OUString urlStr; 196 char *ascii,*expect; 197 198 ascii = "ftp://abi:psswd@abi-1/file"; 199 expect = "ftp://abi:psswd@abi-1/"; 200 TESTPARENT; 201 202 ascii = "ftp://abi:psswd@abi-1/dir/../file"; 203 expect = "ftp://abi:psswd@abi-1/"; 204 TESTPARENT; 205 206 ascii = "ftp://abi:psswd@abi-1/.."; 207 expect = "ftp://abi:psswd@abi-1/../.."; 208 TESTPARENT; 209 210 ascii = "ftp://abi:psswd@abi-1/../../dir"; 211 expect = "ftp://abi:psswd@abi-1/../.."; 212 TESTPARENT; 213 214 ascii = "ftp://abi:psswd@abi-1/"; 215 expect = "ftp://abi:psswd@abi-1/.."; 216 TESTPARENT; 217 218 TESTEVAL; 219 } 220 221 222 int test_ftpproperties(void) { 223 int number_of_errors = 0; 224 const char* name = "test_ftpproperties"; 225 FTPHandleProviderI provider; 226 227 ftp::FTPURL url( 228 rtl::OUString::createFromAscii( 229 "ftp://abi:psswd@abi-1/file"), 230 &provider); 231 232 ftp::FTPDirentry ade(url.direntry()); 233 234 if(!(ade.m_aName.equalsAscii("file") && 235 ade.isFile())) 236 ++number_of_errors; 237 238 TESTEVAL; 239 } 240 241 242 int test_ftpopen(void) 243 { 244 int number_of_errors = 0; 245 const char* name = "test_ftpopen"; 246 247 FTPHandleProviderI provider; 248 ftp::FTPURL url( 249 rtl::OUString::createFromAscii( 250 "ftp://abi:psswd@abi-1/file"), 251 &provider); 252 253 FILE* file = url.open(); 254 if(file) { 255 int nbuf,ndest; 256 const int bffsz = 256; 257 char buff[bffsz]; 258 char *dest = (char*) malloc(sizeof(char)); 259 dest[0] = 0; 260 do { 261 rtl_zeroMemory((void*)buff,bffsz); 262 fread(buff,bffsz-1,1,file); 263 nbuf = strlen(buff); 264 ndest = strlen(dest); 265 dest = (char*)realloc(dest,ndest + nbuf + 1); 266 strncat(dest,buff,nbuf); 267 } while(nbuf == bffsz-1); 268 fclose(file); 269 270 const char* expected = "You are now looking at the filecontent.\n"; 271 if(strcmp(expected,dest)) 272 ++number_of_errors; 273 free(dest); 274 } else 275 ++number_of_errors; 276 277 TESTEVAL; 278 } 279 280 281