mirror of https://github.com/OpenVPN/openvpn-gui
				
				
				
			Fix passing username for CRV1 response
Escape the username string before passing to management interface. For other dialogs this is already done. Move string-escape to a function and process the username through it. Also escape space, single quote in addition to double quote and backslash. Reported by: Jakob Curdes <jc@info-systems.de> Signed-off-by: Selva Nair <selva.nair@gmail.com>pull/484/head
							parent
							
								
									9d2e79dc6a
								
							
						
					
					
						commit
						6271d2f674
					
				
							
								
								
									
										60
									
								
								misc.c
								
								
								
								
							
							
						
						
									
										60
									
								
								misc.c
								
								
								
								
							| 
						 | 
				
			
			@ -161,6 +161,46 @@ out:
 | 
			
		|||
    return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Escape \ space ' and " in a string
 | 
			
		||||
 * @param input  Pointer to the string to escape
 | 
			
		||||
 * @returns      A newly allocated string containing the result or NULL
 | 
			
		||||
 *               on error. Caller must free it after use.
 | 
			
		||||
 */
 | 
			
		||||
char *
 | 
			
		||||
escape_string(const char *input)
 | 
			
		||||
{
 | 
			
		||||
    char *out = strdup(input);
 | 
			
		||||
    int len = strlen(out);
 | 
			
		||||
    const char *esc = "\'\"\\ ";
 | 
			
		||||
 | 
			
		||||
    if (!out)
 | 
			
		||||
    {
 | 
			
		||||
        MsgToEventLog(EVENTLOG_ERROR_TYPE, L"Error in escape_string: out of memory");
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (int pos = 0; pos < len; ++pos)
 | 
			
		||||
    {
 | 
			
		||||
        if (strchr(esc, out[pos]))
 | 
			
		||||
        {
 | 
			
		||||
            char *buf = realloc(out, ++len + 1);
 | 
			
		||||
            if (buf == NULL)
 | 
			
		||||
            {
 | 
			
		||||
                free(out);
 | 
			
		||||
                MsgToEventLog(EVENTLOG_ERROR_TYPE, L"Error in escape_string: out of memory");
 | 
			
		||||
                return NULL;
 | 
			
		||||
            }
 | 
			
		||||
            out = buf;
 | 
			
		||||
            memmove(out + pos + 1, out + pos, len - pos + 1);
 | 
			
		||||
            out[pos] = '\\';
 | 
			
		||||
            pos += 1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    PrintDebug(L"escape_string: in: '%hs' out: '%hs' len = %d", input, out, len);
 | 
			
		||||
    return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Generate a management command from user input and send it
 | 
			
		||||
| 
						 | 
				
			
			@ -170,25 +210,19 @@ ManagementCommandFromInput(connection_t *c, LPCSTR fmt, HWND hDlg, int id)
 | 
			
		|||
{
 | 
			
		||||
    BOOL retval = FALSE;
 | 
			
		||||
    LPSTR input, cmd;
 | 
			
		||||
    int input_len, cmd_len, pos;
 | 
			
		||||
    int input_len, cmd_len;
 | 
			
		||||
 | 
			
		||||
    GetDlgItemTextUtf8(hDlg, id, &input, &input_len);
 | 
			
		||||
 | 
			
		||||
    /* Escape input if needed */
 | 
			
		||||
    for (pos = 0; pos < input_len; ++pos)
 | 
			
		||||
    char *input_e = escape_string(input);
 | 
			
		||||
    if (!input_e)
 | 
			
		||||
    {
 | 
			
		||||
        if (input[pos] == '\\' || input[pos] == '"')
 | 
			
		||||
        {
 | 
			
		||||
            LPSTR buf = realloc(input, ++input_len + 1);
 | 
			
		||||
            if (buf == NULL)
 | 
			
		||||
                goto out;
 | 
			
		||||
 | 
			
		||||
            input = buf;
 | 
			
		||||
            memmove(input + pos + 1, input + pos, input_len - pos + 1);
 | 
			
		||||
            input[pos] = '\\';
 | 
			
		||||
            pos += 1;
 | 
			
		||||
        }
 | 
			
		||||
        goto out;
 | 
			
		||||
    }
 | 
			
		||||
    free(input);
 | 
			
		||||
    input = input_e;
 | 
			
		||||
    input_len = strlen(input);
 | 
			
		||||
 | 
			
		||||
    cmd_len = input_len + strlen(fmt);
 | 
			
		||||
    cmd = malloc(cmd_len);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										3
									
								
								misc.h
								
								
								
								
							
							
						
						
									
										3
									
								
								misc.h
								
								
								
								
							| 
						 | 
				
			
			@ -86,4 +86,7 @@ GetDlgItemTextUtf8(HWND hDlg, int id, LPSTR* str, int* len);
 | 
			
		|||
 */
 | 
			
		||||
void set_openssl_env_vars(void);
 | 
			
		||||
 | 
			
		||||
/* Return escaped copy of a string */
 | 
			
		||||
char *escape_string(const char *str);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										10
									
								
								openvpn.c
								
								
								
								
							
							
						
						
									
										10
									
								
								openvpn.c
								
								
								
								
							| 
						 | 
				
			
			@ -733,13 +733,13 @@ GenericPassDialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
 | 
			
		|||
            {
 | 
			
		||||
                /* send username */
 | 
			
		||||
                template = "username \"Auth\" \"%s\"";
 | 
			
		||||
                fmt = malloc(strlen(template) + strlen(param->user));
 | 
			
		||||
                char *username = escape_string(param->user);
 | 
			
		||||
                fmt = malloc(strlen(template) + strlen(username));
 | 
			
		||||
 | 
			
		||||
                if (fmt)
 | 
			
		||||
                if (fmt && username)
 | 
			
		||||
                {
 | 
			
		||||
                    sprintf(fmt, template, param->user);
 | 
			
		||||
                    sprintf(fmt, template, username);
 | 
			
		||||
                    ManagementCommand(param->c, fmt, NULL, regular);
 | 
			
		||||
                    free(fmt);
 | 
			
		||||
                }
 | 
			
		||||
                else /* no memory? send an emty username and let it error out */
 | 
			
		||||
                {
 | 
			
		||||
| 
						 | 
				
			
			@ -747,6 +747,8 @@ GenericPassDialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
 | 
			
		|||
                        L"Out of memory: sending a generic username for dynamic CR", false);
 | 
			
		||||
                    ManagementCommand(param->c, "username \"Auth\" \"user\"", NULL, regular);
 | 
			
		||||
                }
 | 
			
		||||
                free(fmt);
 | 
			
		||||
                free(username);
 | 
			
		||||
 | 
			
		||||
                /* password template */
 | 
			
		||||
                template = "password \"Auth\" \"CRV1::%s::%%s\"";
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue