- call FTP-LOGIN from FTP-CONNECT
- don't store login and password in connection record - don't try to use password if USER succeeds already - allow port (instead of file) for logging - fix protocol bugs between FTP-LS/FTP-DIR and FTP-BUILD-COMMAND-STRING
This commit is contained in:
		
							parent
							
								
									c9c7eb0a90
								
							
						
					
					
						commit
						bb84449320
					
				|  | @ -85,15 +85,19 @@ | |||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
| 
 | ||||
| ;; beware, the log file contains password information! | ||||
| ;;: string [ x string x port] -> connection | ||||
| (define (ftp-connect host . args) | ||||
| 
 | ||||
| (define (ftp-connect host login password passive? . args) | ||||
|   (let-optionals* args ((logfile #f)) | ||||
|     (let* ((LOG (and logfile | ||||
|     (let* ((log (cond | ||||
| 		 ((output-port? logfile) | ||||
| 		  logfile) | ||||
| 		 ((string? logfile) | ||||
| 		  (open-output-file logfile | ||||
| 				    (if (file-exists? logfile) | ||||
| 					(bitwise-ior open/write open/append) | ||||
| 					(bitwise-ior open/write open/create)) | ||||
| 				       #o600))) | ||||
| 				    #o600)) | ||||
| 		 (else #f))) | ||||
| 	   (hst-info (host-info host)) | ||||
| 	   (hostname (host-info:name hst-info)) | ||||
| 	   (srvc-info (service-info "ftp" "tcp")) | ||||
|  | @ -103,32 +107,38 @@ | |||
| 				 (service-info:port srvc-info))) | ||||
| 	   (connection (make-ftp-connection hostname | ||||
| 					    sock | ||||
| 					    LOG "" ""))) | ||||
| 					    passive? | ||||
| 					    log))) | ||||
|       (ftp-log connection | ||||
| 	       (format #f "~%-- ~a: opened ftp connection to ~a" | ||||
| 		       (date->string (date)) | ||||
| 		       hostname)) | ||||
|       (ftp-read-reply connection (exactly-code "220")) ; the initial welcome banner | ||||
|       (ftp-login connection login password) | ||||
|       connection))) | ||||
| 
 | ||||
| ;; Send user information to the remote host. Args are optional login | ||||
| ;; Send user information to the remote host. Args are login | ||||
| ;; and password. If they are not provided, the Netrc module is used to | ||||
| ;; try to determine a login and password for the server. If not found we | ||||
| ;; default to login "anonymous" with password user@host. | ||||
| ;;: connection [ x string x password ] -> status | ||||
| (define (ftp-login connection . args) | ||||
|   (let ((netrc-record (netrc-parse))) | ||||
|     (let-optionals* args   | ||||
| 		    ((login  | ||||
| ;; try to determine a login and password for the server. | ||||
| 
 | ||||
| (define (ftp-login connection login password) | ||||
|   (let* ((netrc-record (netrc-parse)) | ||||
| 	 (login (or login | ||||
| 		    (netrc-lookup-login netrc-record  | ||||
| 					  (ftp-connection-host-name connection))) | ||||
| 		     (password  | ||||
| 		      (netrc-lookup-password netrc-record  | ||||
| 					(ftp-connection-host-name connection)))) | ||||
|     (set-ftp-connection-login! connection login) | ||||
|     (set-ftp-connection-password! connection password) | ||||
|     (ftp-send-command connection (format #f "USER ~a" login) any-code)  ; "331" | ||||
|     (ftp-send-command connection (format #f "PASS ~a" password))))) ; "230" | ||||
| 	 (password (or password | ||||
| 		       (netrc-lookup-password netrc-record  | ||||
| 					      (ftp-connection-host-name connection))))) | ||||
|     (let ((reply | ||||
| 	   (ftp-send-command connection (ftp-build-command-string "USER" login) | ||||
| 			     (lambda (code) | ||||
| 			       (or (string=? code "331") ; "User name okay, need password." | ||||
| 				   (string=? code "230")))))) ; "User logged in, proceed." | ||||
| 					      | ||||
|       (if (string-prefix? "331" reply)	; "User name okay, need password." | ||||
| 	  (ftp-send-command connection | ||||
| 			    (ftp-build-command-string "PASS" password) | ||||
| 			    (exactly-code "230")))))) | ||||
| 
 | ||||
| ;; Type must be one of 'binary or 'text or 'ascii, or a string which will be | ||||
| ;; sent verbatim | ||||
|  | @ -241,7 +251,7 @@ | |||
| (define (ftp-ls connection . maybe-dir) | ||||
|   (let* ((sock (ftp-open-data-connection connection))) | ||||
|     (ftp-send-command connection | ||||
|                       (ftp-build-command-string "NLST" maybe-dir) | ||||
|                       (apply ftp-build-command-string "NLST" maybe-dir) | ||||
|                       (code-with-prefix "1")) | ||||
|     (receive (newsock newsockaddr) | ||||
| 	(accept-connection sock) | ||||
|  | @ -255,7 +265,7 @@ | |||
| (define (ftp-dir connection . maybe-dir) | ||||
|   (let* ((sock (ftp-open-data-connection connection))) | ||||
|     (ftp-send-command connection | ||||
|                       (ftp-build-command-string "LIST" maybe-dir) | ||||
|                       (apply ftp-build-command-string "LIST" maybe-dir) | ||||
|                       (code-with-prefix "1")) | ||||
|     (receive (newsock newsockaddr) | ||||
| 	(accept-connection sock) | ||||
|  | @ -347,13 +357,12 @@ | |||
| ;; We cache the login and password to be able to relogin automatically | ||||
| ;; if we lose the connection (a la ange-ftp). Not implemented. | ||||
| (define-record-type ftp-connection :ftp-connection | ||||
|   (make-ftp-connection host-name command-socket logfd login password) | ||||
|   (make-ftp-connection host-name command-socket passive-mode? logfd) | ||||
|   ftp-connection? | ||||
|   (host-name ftp-connection-host-name) | ||||
|   (command-socket ftp-connection-command-socket) | ||||
|   (logfd ftp-connection-logfd) | ||||
|   (login ftp-connection-login set-ftp-connection-login!) | ||||
|   (password ftp-connection-password set-ftp-connection-password!)) | ||||
|   (passive-mode? ftp-connection-passive-mode?) | ||||
|   (logfd ftp-connection-logfd)) | ||||
| 
 | ||||
| (define-condition-type 'ftp-error '(error)) | ||||
| (define ftp-error? (condition-predicate 'ftp-error)) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 sperber
						sperber