X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/b29ec86e06ace733fb565f8b56d797914987a055..2796e83d397f9351ee28ccaf9db28ef2e4ac2510:/update/get_file.c diff --git a/update/get_file.c b/update/get_file.c index 79baacc7..17a2f97b 100644 --- a/update/get_file.c +++ b/update/get_file.c @@ -14,17 +14,28 @@ static char *rcsid_get_file_c = "$Header$"; #include #include #include +#include #include #include -#include +#include +#include +#include +#include #include "update.h" +#ifndef MIN +#define MIN(a,b) (((a) < (b))?(a):(b)) +#endif /* MIN */ + extern CONNECTION conn; char buf[BUFSIZ]; -extern int code, errno; +extern int code, errno, uid; extern int have_authorization, have_file, done; +extern C_Block session; +static des_key_schedule sched; +static des_cblock ivec; int get_block(); @@ -61,30 +72,45 @@ int get_block(); */ int -get_file(pathname, file_size, checksum) +get_file(pathname, file_size, checksum, mode, encrypt) char *pathname; int file_size; int checksum; + int mode; + int encrypt; { int fd, n_written; int found_checksum; if (!have_authorization) { - reject_call(SMS_PERM); + reject_call(MR_PERM); return(1); } if (done) /* re-initialize data */ initialize(); +#ifdef POSIX + if (setuid(uid) < 0) { +#else + if (setreuid(0, uid) < 0) { +#endif + com_err(whoami, errno, "Unable to setuid to %d\n", uid); + exit(1); + } /* unlink old file */ - (void) unlink(pathname); + if (!config_lookup("noclobber")) + (void) unlink(pathname); /* open file descriptor */ - fd = open(pathname, O_CREAT|O_EXCL|O_WRONLY, 0700); + fd = open(pathname, O_CREAT|O_EXCL|O_WRONLY, mode); if (fd == -1) { code = errno; sprintf(buf, "%s: creating file %s (get_file)", error_message(code), pathname); - sms_log_error(buf); + mr_log_error(buf); report_error("reporting file creation error (get_file)"); + if (setuid(0) < 0) { + com_err(whoami, errno, "Unable to setuid back to %d\n", 0); + exit(1); + } return(1); } /* check to see if we've got the disk space */ @@ -96,12 +122,16 @@ get_file(pathname, file_size, checksum) code = errno; sprintf(buf, "%s: verifying free disk space for %s (get_file)", error_message(code), pathname); - sms_log_error(buf); + mr_log_error(buf); /* do all we can to free the space */ (void) unlink(pathname); (void) ftruncate(fd, 0); (void) close(fd); report_error("reporting test-write error (get_file)"); + if (setuid(0) < 0) { + com_err(whoami, errno, "Unable to setuid back to %d\n", 0); + exit(1); + } return(1); } n_written += n_wrote; @@ -109,12 +139,25 @@ get_file(pathname, file_size, checksum) lseek(fd, 0, L_SET); if (send_ok()) lose("sending okay for file transfer (get_file)"); + if (encrypt) { +#ifdef DEBUG + com_err(whoami, 0, "Session %02x %02x %02x %02x %02x %02x %02x %02x", + session[0], session[1], session[2], session[3], + session[4], session[5], session[6], session[7]); +#endif /* DEBUG */ + des_key_sched(session, sched); + memcpy(ivec, session, sizeof(ivec)); + } n_written = 0; while (n_written < file_size && code == 0) { - int n_got = get_block(fd, file_size - n_written); + int n_got = get_block(fd, file_size - n_written, encrypt); if (n_got == -1) { /* get_block has already printed a message */ unlink(pathname); + if (setuid(0) < 0) { + com_err(whoami, errno, "Unable to setuid back to %d\n", 0); + exit(1); + } return(1); } n_written += n_got; @@ -125,16 +168,24 @@ get_file(pathname, file_size, checksum) if (code) { code = connection_errno(conn); report_error("reading file (get_file)"); + if (setuid(0) < 0) { + com_err(whoami, errno, "Unable to setuid back to %d\n", 0); + exit(1); + } return(1); } fsync(fd); ftruncate(fd, file_size); fsync(fd); close(fd); + if (setuid(0) < 0) { + com_err(whoami, errno, "Unable to setuid back to %d\n", 0); + exit(1); + } /* validate checksum */ found_checksum = checksum_file(pathname); if (checksum != found_checksum) { - code = SMS_MISSINGFILE; + code = MR_MISSINGFILE; com_err(whoami, code, ": expected = %d, found = %d", checksum, found_checksum); report_error("checksum error"); @@ -152,18 +203,30 @@ get_file(pathname, file_size, checksum) } static int -get_block(fd, max_size) +get_block(fd, max_size, encrypt) int fd; int max_size; + int encrypt; { STRING data; - int n_read, n; + unsigned char dst[UPDATE_BUFSIZ + 8], *src; + int n_read, n, i; code = receive_object(conn, (char *)&data, STRING_T); if (code) { code = connection_errno(conn); lose("receiving data file (get_file)"); } + + if (encrypt) { + src = (unsigned char *)STRING_DATA(data); + n = MAX_STRING_SIZE(data); + des_pcbc_encrypt(src, dst, n, sched, ivec, 1); + for (i = 0; i < 8; i++) + ivec[i] = src[n - 8 + i] ^ dst[n - 8 + i]; + memcpy(STRING_DATA(data), dst, n); + } + n_read = MIN(MAX_STRING_SIZE(data), max_size); n = 0; while (n < n_read) { @@ -173,7 +236,7 @@ get_block(fd, max_size) if (n_wrote == -1) { code = errno; sprintf(buf, "%s: writing file (get_file)", error_message(code)); - sms_log_error(buf); + mr_log_error(buf); string_free(&data); report_error("reporting write error (get_file)"); close(fd);