handin server/client fixup

svn: r601
This commit is contained in:
Matthew Flatt 2005-08-16 20:17:55 +00:00
parent 1ba0546d2f
commit 697043dbc1
6 changed files with 70 additions and 59 deletions

View File

@ -15,11 +15,12 @@
(ssl-load-verify-root-certificates! ctx pem)
(let-values ([(r w) (ssl-connect server port ctx)])
;; Sanity check: server sends "handin", first:
(let ([s (read-string 6 r)])
(unless (equal? "handin" s)
(let ([s (read-bytes 6 r)])
(unless (equal? #"handin" s)
(error 'handin-connect "bad handshake from server: ~e" s)))
;; Tell server protocol = 'original:
(fprintf w "original\n")
(flush-output w)
;; One more sanity check: server recognizes protocol:
(let ([s (read r)])
(unless (eq? s 'original)
@ -36,20 +37,24 @@
(let ([r (handin-r h)]
[w (handin-w h)])
(fprintf w "~s ~s ~s\n" username passwd assignment)
(flush-output w)
(let ([v (read r)])
(unless (eq? v 'ok)
(error 'handin-connect "login error: ~a" v)))
(fprintf w "~s\n" (string-length content))
(fprintf w "~s\n" (bytes-length content))
(flush-output w)
(let ([v (read r)])
(unless (eq? v 'go)
(error 'handin-connect "upload error: ~a" v)))
(fprintf w "$")
(display content w)
(flush-output w)
(let ([v (read r)])
(unless (eq? v 'confirm)
(error 'handin-connect "submit error: ~a" v)))
(on-commit)
(fprintf w "check\n")
(flush-output w)
(let ([v (read r)])
(unless (eq? v 'done)
(error 'handin-connect "commit probably unsucccesful: ~e" v)))

View File

@ -3,7 +3,7 @@
;; Also replace the "icon.png" and "server-cert.pem" files.
(define name "Course Handin")
(define collection "handin-client")
;; (define server:port "localhost:7979")
;(define server:port "localhost:7979")
;; --> server:port should be defined here, if it is not defined, not tool
;; will appear. To try things, you can set the PLT_HANDIN_SERVER_PORT
;; environment variable when this is undefined.
@ -15,7 +15,7 @@
;(define web-menu-name "Course Homepage")
;(define web-address "http://www.university.edu/course/")
#;(define tool-icons (list (list "icon.png" collection)))
#;(define tools '(("tool.ss")))
#;(define tool-names (list name))
(define tool-icons (list (list "icon.png" collection)))
(define tools '(("tool.ss")))
(define tool-names (list name))
(define requires '(("mred") ("openssl"))))

View File

@ -1,23 +1,20 @@
-----BEGIN CERTIFICATE-----
MIIDwDCCAymgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBojELMAkGA1UEBhMCVVMx
DTALBgNVBAgTBFV0YWgxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MRkwFwYDVQQK
ExBQTFQgU2NoZW1lLCBJbmMuMQ0wCwYDVQQLEwREZW1vMRswGQYDVQQDExJ3d3cu
cGx0LXNjaGVtZS5vcmcxJDAiBgkqhkiG9w0BCQEWFXNjaGVtZUBwbHQtc2NoZW1l
Lm9yZzAeFw0wMzA3MjIxNTA0MTdaFw0wNDA3MjExNTA0MTdaMIGiMQswCQYDVQQG
EwJVUzENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxGTAX
BgNVBAoTEFBMVCBTY2hlbWUsIEluYy4xDTALBgNVBAsTBERlbW8xGzAZBgNVBAMT
End3dy5wbHQtc2NoZW1lLm9yZzEkMCIGCSqGSIb3DQEJARYVc2NoZW1lQHBsdC1z
Y2hlbWUub3JnMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4/XjGBcwJU/jD
4cZRe8LcjrJaWh9F8Nh0j97nGv2JgeLYCJp6oClWBvWLfAs/YBDIMogsN48jjA6n
QExslJ6Dk+oriK92EPLlIuiqrHcTif9lHu2H0BarIme4COTVVPmfETXTrDBNxp/D
93kzGvXsbxdnO2lSsU3u6hZoj1ZEGwIDAQABo4IBAjCB/zAdBgNVHQ4EFgQU0X7d
ycn57T16KLOXUwMM35kdhKEwgc8GA1UdIwSBxzCBxIAU0X7dycn57T16KLOXUwMM
35kdhKGhgaikgaUwgaIxCzAJBgNVBAYTAlVTMQ0wCwYDVQQIEwRVdGFoMRcwFQYD
VQQHEw5TYWx0IExha2UgQ2l0eTEZMBcGA1UEChMQUExUIFNjaGVtZSwgSW5jLjEN
MAsGA1UECxMERGVtbzEbMBkGA1UEAxMSd3d3LnBsdC1zY2hlbWUub3JnMSQwIgYJ
KoZIhvcNAQkBFhVzY2hlbWVAcGx0LXNjaGVtZS5vcmeCAQAwDAYDVR0TBAUwAwEB
/zANBgkqhkiG9w0BAQQFAAOBgQAJEtqvFtCPszpdUg273+hMC0NMSIINToTqv8+T
Knl3yfTJtzdcvFBuTRaYVzPz4YyREx8Y46e5dKSk5Qr2dNogn00yOn6nzzumbkqN
hu9gFV5/J9fJtvaQV/hF4ynhpD0M5TSCILdMJIc1Ls70xEtVFHPT51iZev3zDUuN
4Xintg==
MIIDQjCCAqugAwIBAgIBADANBgkqhkiG9w0BAQQFADB6MQswCQYDVQQGEwJVUzEN
MAsGA1UECBMEVXRhaDEMMAoGA1UEBxMDU0xDMRgwFgYDVQQKEw9QTFQgU2NoZW1l
IEluYy4xDDAKBgNVBAMTA1BMVDEmMCQGCSqGSIb3DQEJARYXcGx0QHBsc2NoZW1l
LXNjaGVtZS5vcmcwHhcNMDUwODE2MTk0ODAzWhcNMTUwODE0MTk0ODAzWjB6MQsw
CQYDVQQGEwJVUzENMAsGA1UECBMEVXRhaDEMMAoGA1UEBxMDU0xDMRgwFgYDVQQK
Ew9QTFQgU2NoZW1lIEluYy4xDDAKBgNVBAMTA1BMVDEmMCQGCSqGSIb3DQEJARYX
cGx0QHBsc2NoZW1lLXNjaGVtZS5vcmcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ
AoGBAMdLMny/wvHYNxyQZAjI8wwyRzRQalJLgbelm2FU3Iwo2rm+QIw/GEhjXAZP
cNT7jQINFX9tWDrcONJJQw6fkGBsawcLdEiojEgRYem8cdq7yLSHR84+qqFDUb3v
QvP9oHpsObUqxKCTaeAH8B0818IQfPd/oAHaGHMBB0/csp5vAgMBAAGjgdcwgdQw
HQYDVR0OBBYEFMuCBFBMnAfhGRTn5gEODVz0+LVpMIGkBgNVHSMEgZwwgZmAFMuC
BFBMnAfhGRTn5gEODVz0+LVpoX6kfDB6MQswCQYDVQQGEwJVUzENMAsGA1UECBME
VXRhaDEMMAoGA1UEBxMDU0xDMRgwFgYDVQQKEw9QTFQgU2NoZW1lIEluYy4xDDAK
BgNVBAMTA1BMVDEmMCQGCSqGSIb3DQEJARYXcGx0QHBsc2NoZW1lLXNjaGVtZS5v
cmeCAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAhywbndr1xp2Gy
jrTiDToZzQCnmhoqJpxb2e71zM3jpQLfdOAF86W196HoIRlwBaKQKzS1rL3ezjqu
JALq992K/Bi68LWaA7dekB2EiagNfvtR9vIjBD7Q4Qtp0yjpRV9uLTEfYRff6ecm
rSywn1Wmca+PBdVY79TbaeEsgCxt6Q==
-----END CERTIFICATE-----

View File

@ -466,7 +466,7 @@
(send ed write-to-file stream))
editors)
(write-editor-global-footer stream)
(send base get-string)))
(send base get-bytes)))
(add-test-suite-extension
"Handin"

View File

@ -23,7 +23,8 @@
(parameterize ([date-display-format 'iso-8601])
(date->string (seconds->date (current-seconds)) #t))
(apply format str args))])
(display line log-port)))
(display line log-port)
(flush-output log-port)))
(define (get-config which default)
(get-preference which
@ -65,20 +66,21 @@
(define backup-dir-re (regexp (format "^~a[0-9]+$" backup-prefix)))
(define (backup n) (format "~a~a" backup-prefix n))
(define (files+backups)
(let* ([files (directory-list)]
(let* ([files (map path->string (directory-list))]
[backups (filter (lambda (f)
(and (directory-exists? f)
(regexp-match backup-dir-re f)))
files)])
(and (directory-exists? f)
(regexp-match backup-dir-re f)))
files)])
(values (remove* backups files) backups)))
(define (do-backups)
(let-values ([(files backups) (files+backups)])
(define (make-backup-available n)
(when (member (backup n) backups)
(if (< n MAX-UPLOAD-KEEP)
(begin (make-backup-available (add1 n))
(rename-file-or-directory (backup n) (backup (add1 n))))
(delete-directory/files (backup n)))))
(begin
(make-backup-available (add1 n))
(rename-file-or-directory (backup n) (backup (add1 n))))
(delete-directory/files (backup n)))))
(unless (null? files)
(LOG "backing up ~a" files)
(make-backup-available 0)
@ -117,14 +119,15 @@
"max handin file size is ~s bytes, file to handin is too big (~s bytes)"
MAX-UPLOAD len))
(fprintf w "go\n")
(flush-output w)
(unless (regexp-match #rx"[$]" r-safe)
(error 'handin
"did not find start-of-content marker"))
(let ([s (read-string len r)])
(unless (and (string? s) (= (string-length s) len))
(let ([s (read-bytes len r)])
(unless (and (bytes? s) (= (bytes-length s) len))
(error 'handin
"error uploading (got ~s, expected ~s bytes)"
(if (string? s) (string-length s) s)
"error uploading (got ~e, expected ~s bytes)"
(if (bytes? s) (bytes-length s) s)
len))
(do-backups)
(LOG "checking ~a for ~a" assignment user)
@ -136,12 +139,14 @@
user s)
DEFAULT-FILE-NAME))])
(fprintf w "confirm\n")
(flush-output w)
(let ([v (read (make-limited-input-port r 50))])
(if (eq? v 'check)
(begin
(LOG "saving ~a for ~a" assignment user)
(save-submission s part)
(fprintf w "done\n"))
(fprintf w "done\n")
(flush-output w))
(error 'handin "upload not confirmed: ~s" v))))))))))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -234,7 +239,7 @@
(error 'handin "bad username or password for ~a" username)]))))
(define assignment-list
(quicksort (directory-list "active") string<?))
(quicksort (map path->string (directory-list "active")) string<?))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -322,6 +327,7 @@
(lambda (kill-watcher)
(let ([r-safe (make-limited-input-port r 1024)])
(fprintf w "handin\n")
(flush-output w)
;; Check protocol:
(with-handlers ([exn:fail?
(lambda (exn)
@ -331,11 +337,14 @@
(kill-watcher)
(LOG "ERROR: ~a" msg)
(fprintf w "~s\n" msg)
(flush-output w)
;; see note on close-output-port below
(close-output-port w)))])
(let ([protocol (read r-safe)])
(if (eq? protocol 'original)
(fprintf w "original\n")
(begin
(fprintf w "original\n")
(flush-output w))
(error 'handin "unknown protocol: ~s" protocol)))
(accept-submission-or-update assignment-list r r-safe w)
(LOG "normal exit")
@ -352,8 +361,8 @@
(printf "~a~n" (if (exn? exn)
(exn-message exn)
exn)))
(lambda (port-k)
(let ([l (ssl-listen port-k 5 #t)])
(lambda (port-k cnt reuse?)
(let ([l (ssl-listen port-k cnt #t)])
(ssl-load-certificate-chain! l "server-cert.pem")
(ssl-load-private-key! l "private-key.pem")
l))

View File

@ -1,15 +1,15 @@
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC4/XjGBcwJU/jD4cZRe8LcjrJaWh9F8Nh0j97nGv2JgeLYCJp6
oClWBvWLfAs/YBDIMogsN48jjA6nQExslJ6Dk+oriK92EPLlIuiqrHcTif9lHu2H
0BarIme4COTVVPmfETXTrDBNxp/D93kzGvXsbxdnO2lSsU3u6hZoj1ZEGwIDAQAB
AoGBAIAkLIXXPCf1/+sIOQz2ktufCRKnPOSA2h+cDUa/HoMi8tS82O06hoet2Gcf
rNbgn59dyY//iGqSORBH7OiF5mqG1NBid8VQ7G84NB3/mqf/Ex7XUu9ROFJsELN3
KDAyIEez5529FGUsCprsYE+WTAv0rZSyMYIxnPpe4/vVrzDRAkEA4hrYzzDkpJRV
ZI3XIC3ZIOx7J1tezAahn6TZVTfPd15R0yIP6YdOElwR82MbIcuzWGd2cT7qfGcT
hTH4zoNjyQJBANFy+yQ7LQl+fsFAXFl08Hub7EVeqPSuXReIQ9cy4f+7ZpKMueqK
FWsDZep3ZD0+ILNuBFYTwhI/kP9oi9OkMsMCQG90DmVrU3lxCPrNFDrvfrVE/Jv0
5TCrICZiiyL/pMvReYIaqz9RDAHu0oZn1ur8z0YHkhHWkp2J7cxdSqj5iUkCQBsz
Qng3Eyc7fTydniCj9iMnYay0mV6FUmOe96h33C+45546ll5mJlfqbg7gCG2HpvmG
XRvMnxR9mtgAfMA0f78CQQCGH8TQySWUkzkIoEKgdExDp/2p28j5Zv90XgcplI3H
17MyFm0XUzCfCFIKeuSgLfk/Y2YNhyRr1Oxddd+qPj6/
MIICXQIBAAKBgQDHSzJ8v8Lx2DcckGQIyPMMMkc0UGpSS4G3pZthVNyMKNq5vkCM
PxhIY1wGT3DU+40CDRV/bVg63DjSSUMOn5BgbGsHC3RIqIxIEWHpvHHau8i0h0fO
PqqhQ1G970Lz/aB6bDm1KsSgk2ngB/AdPNfCEHz3f6AB2hhzAQdP3LKebwIDAQAB
AoGBAKJ8e+BcFJxL1bszOmwzMn5aK9XKTrVkHJHXsxSrNNoNoS9Zn5T5CFpUsD3w
3SS5J6Fpe4KWax4qWSWSV9r/W5zgrYeXA+K8pCdPgmk9ujPUCvxNymdKS+yJncTa
bwDMNEWKPpd4MApQbw+Dfj+GGEClMK+mBFUSPMAEwaazHkHZAkEA9ITgFslmdLhc
8I7J/lfc3Fm4ytGFk/QC/X5lfNy5/miHjWqH/20R7neimss2GyhdzYtCVyxhzWKz
3+q+oQ+R/QJBANCmtm91swqp5XxpZD6K5k3wninPO+od9kDBUvl6kXdR9x9Qt9eo
vm7IG5Rpp4ADJ559alP87TTsDA6HWRU/F9sCQCAv+ZumSWFl/33/HeHoSP+MpAG2
0QGn5ljeMZfdKnKt6eIYuuxJvEmK4BHGXEn451guU75L7lft/UWljhB/jzUCQQCR
DAPxEfpIJHly9nUIgVi+v9HDsNuu0etZcstywQEU2LcZXuyekCDqNFPv5U7az9af
+AGNp1tjGeD7zJ1iBr1XAkBJCu8NfQ+6FgmpozFNZTOLXOMXePZ/At6fG7Se+wd3
NKIUNg3qG7yeoz5IoK4NqPIQL8xdb/JyfAuBneyFRiQX
-----END RSA PRIVATE KEY-----