Exemple #1
0
/*
 * This is for creating ntlm header output
 */
CURLcode Curl_output_ntlm(struct connectdata *conn,
                          bool proxy)
{
    char *base64 = NULL;
    CURLcode error;

    /* point to the address of the pointer that holds the string to send to the
       server, which is for a plain host or for a HTTP proxy */
    char **allocuserpwd;

    /* point to the name and password for this */
    const char *userp;
    const char *passwdp;

    /* point to the correct struct with this */
    struct ntlmdata *ntlm;
    struct auth *authp;

    DEBUGASSERT(conn);
    DEBUGASSERT(conn->data);

#ifdef USE_NSS
    if(CURLE_OK != Curl_nss_force_init(conn->data))
        return CURLE_OUT_OF_MEMORY;
#endif

    if(proxy) {
        allocuserpwd = &conn->allocptr.proxyuserpwd;
        userp = conn->proxyuser;
        passwdp = conn->proxypasswd;
        ntlm = &conn->proxyntlm;
        authp = &conn->data->state.authproxy;
    }
    else {
        allocuserpwd = &conn->allocptr.userpwd;
        userp = conn->user;
        passwdp = conn->passwd;
        ntlm = &conn->ntlm;
        authp = &conn->data->state.authhost;
    }
    authp->done = FALSE;

    /* not set means empty */
    if(!userp)
        userp = "";

    if(!passwdp)
        passwdp = "";

#ifdef USE_WINDOWS_SSPI
    if(s_hSecDll == NULL) {
        /* not thread safe and leaks - use curl_global_init() to avoid */
        CURLcode err = Curl_sspi_global_init();
        if(s_hSecDll == NULL)
            return err;
    }
#endif

    switch(ntlm->state) {
    case NTLMSTATE_TYPE1:
    default: /* for the weird cases we (re)start here */
        /* Create a type-1 message */
        error = Curl_ntlm_create_type1_message(userp, passwdp, ntlm, &base64);
        if(error)
            return error;

        if(base64) {
            Curl_safefree(*allocuserpwd);
            *allocuserpwd = aprintf("%sAuthorization: NTLM %s\r\n",
                                    proxy ? "Proxy-" : "",
                                    base64);
            DEBUG_OUT(fprintf(stderr, "**** Header %s\n ", *allocuserpwd));
            free(base64);
        }
        break;

    case NTLMSTATE_TYPE2:
        /* We already received the type-2 message, create a type-3 message */
        error = Curl_ntlm_create_type3_message(conn->data, userp, passwdp,
                                               ntlm, &base64);
        if(error)
            return error;

        if(base64) {
            Curl_safefree(*allocuserpwd);
            *allocuserpwd = aprintf("%sAuthorization: NTLM %s\r\n",
                                    proxy ? "Proxy-" : "",
                                    base64);
            DEBUG_OUT(fprintf(stderr, "**** %s\n ", *allocuserpwd));
            free(base64);

            ntlm->state = NTLMSTATE_TYPE3; /* we send a type-3 */
            authp->done = TRUE;
        }
        break;

    case NTLMSTATE_TYPE3:
        /* connection is already authenticated,
         * don't send a header in future requests */
        if(*allocuserpwd) {
            free(*allocuserpwd);
            *allocuserpwd = NULL;
        }
        authp->done = TRUE;
        break;
    }

    return CURLE_OK;
}
Exemple #2
0
int Curl_schannel_init(void)
{
  return (Curl_sspi_global_init() == CURLE_OK ? 1 : 0);
}