#include "rsync.h"
extern char *password_file;
-extern int am_root;
/***************************************************************************
encode a buffer using base64 - simple and slow algorithm. null terminates
the result.
***************************************************************************/
-void base64_encode(char *buf, int len, char *out)
+void base64_encode(char *buf, int len, char *out, int pad)
{
char *b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int bit_offset, byte_offset, idx, i;
unsigned char *d = (unsigned char *)buf;
int bytes = (len*8 + 5)/6;
- memset(out, 0, bytes+1);
-
for (i = 0; i < bytes; i++) {
byte_offset = (i*6)/8;
bit_offset = (i*6)%8;
}
out[i] = b64[idx];
}
+
+ while (pad && (i % 4))
+ out[i++] = '=';
+
+ out[i] = '\0';
}
/* Generate a challenge buffer and return it base64-encoded. */
sum_update(input, sizeof input);
sum_end(md4_out);
- base64_encode(md4_out, MD4_SUM_LENGTH, challenge);
+ base64_encode(md4_out, MD4_SUM_LENGTH, challenge, 0);
}
if ((st.st_mode & 06) != 0) {
rprintf(FLOG, "secrets file must not be other-accessible (see strict modes option)\n");
ok = 0;
- } else if (am_root && (st.st_uid != 0)) {
+ } else if (MY_UID() == 0 && st.st_uid != 0) {
rprintf(FLOG, "secrets file must be owned by root when running as root (see strict modes)\n");
ok = 0;
}
} else if ((st.st_mode & 06) != 0) {
rprintf(FERROR,"password file must not be other-accessible\n");
ok = 0;
- } else if (am_root && st.st_uid != 0) {
+ } else if (MY_UID() == 0 && st.st_uid != 0) {
rprintf(FERROR,"password file must be owned by root when running as root\n");
ok = 0;
}
sum_update(challenge, strlen(challenge));
sum_end(buf);
- base64_encode(buf, MD4_SUM_LENGTH, out);
+ base64_encode(buf, MD4_SUM_LENGTH, out, 0);
}
/* Possibly negotiate authentication with the client. Use "leader" to