emanuele bizzarri wrote:
> Hi Arno,
> thankyou for your response.
>
>> I agree with you that OverbyteIcsNtlmMsgs.pas only supports Unicode
>> NTLM messages. However I recently implemented proxy support in
>> TWSocket and tested that stuff against Squid proxy, it did work with
>> current OverbyteIcsNtlmMsgs.pas fine. So at least that version of
>> Squid I used for testing must have supported Unicode.
>
> I'm using IPCOP 1.4.21 (latest available).
>
> Maybe you have tested a newer version (3.1?)
> I've checked the squid release note, here:
> http://www.squid-cache.org/Versions/v3/3.1/RELEASENOTES.html
I used the Windows port version 2.7stable8, that might be the difference?
Here's my squid.conf:
auth_param ntlm program C:/Squid/libexec/mswin_ntlm_auth.exe -A Users
auth_param ntlm children 5
auth_param ntlm keep_alive on
[..]
Authentication is delegated to external helper apps.
I found that Squid required a domain name and made a comment
in the source code:
{code}
function TCustomHttpTunnelWSocket.HttpTunnelGetNtlmMessage3: String;
var
Hostname : String;
NtlmInfo : TNTLM_Msg2_Info;
LDomain, LUser: String;
begin
{ get local hostname }
try
Hostname := String(LocalHostName);
except
Hostname := '';
end;
NtlmInfo := NtlmGetMessage2(String(FHttpTunnelAuthChallenge));
NtlmParseUserCode(HttpTunnelUsercode, LDomain, LUser, FALSE);
{ With Squid proxy LDomain may not be empty (at the time of writing), }
{ a user code of <DOMAIN>\<UserName> works with Squid. Fix below }
{ works with Squid, however I'm not 100% sure whether to include it }
{ by default. }
if (LDomain = '') and (Pos('@', LUser) = 0) then
LDomain := NtlmInfo.Domain;
{ hostname is the local hostname }
Result := NtlmGetMessage3(LDomain,
Hostname,
LUser,
FHttpTunnelPassword,
NtlmInfo.Challenge);
end;
{code}
>>
>> If this actually requires a fix there should be a solution that can
>> be used in all components not just a separate fix for the HTTP client
>> IMO.
>
> You're right: the fix should be applied also where necessary
> (OverbyteIcsNTLMSSP, OverbyteIcsPOP3Prot, OverbyteIcsPp3ProtOld,
> OverbyteIcsSMTPProt).
> Up to now I've never used these units, so I have not changed them.
>
>
>> Whether Unicode or OEM strings are used in the NTLM communication
>> should be an implementation detail hidden to the component user.
>> Your fix doesn't fix for instance the NtlmGetMessage2 result,
>> I wonder what the TNTLM_Msg2_Info result looks like with your proxy?
>>
>
> If I debug NtlmGetMessage2 function, I see:
>
> function NtlmGetMessage2(const AServerReply: String): TNTLM_Msg2_Info;
>
> AServerReply='TlRMTVNTUAACAAAACwALACgAAACCgkEATo49y/toC4kAAAAAAAAAAEUtV09SS1MuTEFO'
>
> NTLMReply='NTLMSSP'#0#2#0#0#0#$B#0#$B#0'('#0#0#0'‚‚A'#0'C'#8'Êlÿô”Ü'#0#0#0#0#0#0#0#0'E-WORKS.LAN'
So that's obviously ANSI and the message is currently not parsed correctly.
Have you tried to remove "Flags_Negotiate_OEM" from the flags in:
{code}
function NtlmGetMessage1(const AHost, ADomain: String): String; ?
[..]
// prepare flags
Msg.Flags := Flags_Negotiate_Unicode or
// Flags_Negotiate_OEM or // <= Makes no sense when we support
Unicode only
Flags_Request_Target or
Flags_Negotiate_NTLM or
Flags_Negotiate_Allways_Sign { or
Flags_Negotiate_NTLM2_Key};
{code}
This might enforce Unicode (if the server supports it) otherwise
the server may use either OEM or Unicode, perhaps a simple fix?
--
Arno Garrels
--
To unsubscribe or change your settings for TWSocket mailing list
please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be