-
-#define BUFFER_SIZE (64*1024)
-#define EXTRA_SIZE 16
-
-static bool initial_nul = false;
-static bool auth_over = false;
-
-static void format_uid(char *buf, size_t l) {
- char text[20 + 1]; /* enough space for a 64bit integer plus NUL */
- unsigned j;
-
- assert(l > 0);
-
- snprintf(text, sizeof(text)-1, "%llu", (unsigned long long) geteuid());
- char_array_0(text);
-
- memset(buf, 0, l);
-
- for (j = 0; text[j] && j*2+2 < l; j++) {
- buf[j*2] = hexchar(text[j] >> 4);
- buf[j*2+1] = hexchar(text[j] & 0xF);
- }
-
- buf[j*2] = 0;
-}
-
-static size_t patch_in_line(char *line, size_t l, size_t left) {
- size_t r;
-
- if (line[0] == 0 && !initial_nul) {
- initial_nul = true;
- line += 1;
- l -= 1;
- r = 1;
- } else
- r = 0;
-
- if (l == 5 && strneq(line, "BEGIN", 5)) {
- r += l;
- auth_over = true;
-
- } else if (l == 17 && strneq(line, "NEGOTIATE_UNIX_FD", 17)) {
- memmove(line + 13, line + 17, left);
- memcpy(line, "NEGOTIATE_NOP", 13);
- r += 13;
-
- } else if (l >= 14 && strneq(line, "AUTH EXTERNAL ", 14)) {
- char uid[20*2 + 1];
- size_t len;
-
- format_uid(uid, sizeof(uid));
- len = strlen(uid);
- assert(len <= EXTRA_SIZE);
-
- memmove(line + 14 + len, line + l, left);
- memcpy(line + 14, uid, len);
-
- r += 14 + len;
- } else
- r += l;
-
- return r;
-}
-
-static size_t patch_in_buffer(char* in_buffer, size_t *in_buffer_full) {
- size_t i, good = 0;
-
- if (*in_buffer_full <= 0)
- return *in_buffer_full;
-
- /* If authentication is done, we don't touch anything anymore */
- if (auth_over)
- return *in_buffer_full;
-
- if (*in_buffer_full < 2)
- return 0;
-
- for (i = 0; i <= *in_buffer_full - 2; i ++) {
-
- /* Fully lines can be send on */
- if (in_buffer[i] == '\r' && in_buffer[i+1] == '\n') {
- if (i > good) {
- size_t old_length, new_length;
-
- old_length = i - good;
- new_length = patch_in_line(in_buffer+good, old_length, *in_buffer_full - i);
- *in_buffer_full = *in_buffer_full + new_length - old_length;
-
- good += new_length + 2;
-
- } else
- good = i+2;
- }
-
- if (auth_over)
- break;
- }
-
- return good;
-}