704
704
service = camel_sasl_get_service (sasl);
706
settings = camel_service_get_settings (service);
706
settings = camel_service_ref_settings (service);
707
707
g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), NULL);
709
709
network_settings = CAMEL_NETWORK_SETTINGS (settings);
710
710
user = camel_network_settings_dup_user (network_settings);
712
g_object_unref (settings);
711
714
g_return_val_if_fail (user != NULL, NULL);
713
716
password = camel_service_get_password (service);
740
743
string = g_strdup_printf ("TT %s\n", type2);
741
744
if (camel_stream_write_string (
742
745
priv->helper_stream, string, NULL, NULL) >= 0 &&
743
(s = camel_stream_read (priv->helper_stream, buf,
744
sizeof (buf), cancellable, NULL)) > 4 &&
745
buf[0] == 'K' && buf[1] == 'K' && buf[2] == ' ' &&
746
buf[s - 1] == '\n') {
746
(s = camel_stream_read (
747
priv->helper_stream, buf,
748
sizeof (buf), cancellable, NULL)) > 4 &&
752
buf[s - 1] == '\n') {
748
754
data = g_base64_decode (buf + 3, &length);
749
755
g_byte_array_append (ret, data, length);
829
836
/* Don't jump to 'fail' label after this point. */
830
837
g_byte_array_set_size (ret, NTLM_RESPONSE_BASE_SIZE);
831
838
memset (ret->data, 0, NTLM_RESPONSE_BASE_SIZE);
832
memcpy (ret->data, NTLM_RESPONSE_HEADER,
840
ret->data, NTLM_RESPONSE_HEADER,
833
841
sizeof (NTLM_RESPONSE_HEADER) - 1);
834
memcpy (ret->data + NTLM_RESPONSE_FLAGS_OFFSET,
843
ret->data + NTLM_RESPONSE_FLAGS_OFFSET,
835
844
NTLM_RESPONSE_FLAGS, sizeof (NTLM_RESPONSE_FLAGS) - 1);
836
845
/* Mask in the NTLM2SESSION flag */
837
846
ret->data[NTLM_RESPONSE_FLAGS_OFFSET + 2] |=
838
847
token->data[NTLM_CHALLENGE_FLAGS_OFFSET + 2] & 8;
840
ntlm_set_string (ret, NTLM_RESPONSE_DOMAIN_OFFSET,
841
domain->str, domain->len);
842
ntlm_set_string (ret, NTLM_RESPONSE_USER_OFFSET,
843
real_user, strlen (real_user));
844
ntlm_set_string (ret, NTLM_RESPONSE_HOST_OFFSET,
845
"UNKNOWN", sizeof ("UNKNOWN") - 1);
846
ntlm_set_string (ret, NTLM_RESPONSE_LM_RESP_OFFSET,
847
(const gchar *) lm_resp, sizeof (lm_resp));
848
ntlm_set_string (ret, NTLM_RESPONSE_NT_RESP_OFFSET,
849
(const gchar *) nt_resp, sizeof (nt_resp));
850
ret, NTLM_RESPONSE_DOMAIN_OFFSET,
851
domain->str, domain->len);
853
ret, NTLM_RESPONSE_USER_OFFSET,
854
real_user, strlen (real_user));
856
ret, NTLM_RESPONSE_HOST_OFFSET,
857
"UNKNOWN", sizeof ("UNKNOWN") - 1);
859
ret, NTLM_RESPONSE_LM_RESP_OFFSET,
860
(const gchar *) lm_resp, sizeof (lm_resp));
862
ret, NTLM_RESPONSE_NT_RESP_OFFSET,
863
(const gchar *) nt_resp, sizeof (nt_resp));
851
865
camel_sasl_set_authenticated (sasl, TRUE);
858
872
/* If the challenge is malformed, restart authentication.
859
873
* XXX A malicious server could make this loop indefinitely. */
860
g_byte_array_append (ret, (guint8 *) NTLM_REQUEST,
861
sizeof (NTLM_REQUEST) - 1);
874
g_byte_array_append (
875
ret, (guint8 *) NTLM_REQUEST,
876
sizeof (NTLM_REQUEST) - 1);
891
906
service = camel_sasl_get_service (sasl);
893
settings = camel_service_get_settings (service);
908
settings = camel_service_ref_settings (service);
894
909
g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), FALSE);
896
911
network_settings = CAMEL_NETWORK_SETTINGS (settings);
897
912
user = camel_network_settings_dup_user (network_settings);
914
g_object_unref (settings);
898
916
g_return_val_if_fail (user != NULL, FALSE);
900
918
cp = strchr (user, '\\');