2012-02-17 7 views
0

Некоторое время назад я пытался найти способ для доступа к сайту с помощью NTLM для jython. У меня есть только базовые знания о python, а рядом нет ни одного в java, поэтому я мог бы использовать некоторую помощь (или пример), как заставить запрос использовать NTLM в этой части скрипта, которую я нашел. Я использую это с помощью программы с открытым исходным кодом.Использование jcifs в jython для доступа к сайту с использованием безопасности NTLM

Сначала я начинаю с импортом JCIFS в сценарии наряду с другими используемыми мясорубки:

from net.grinder.script import Test 
from net.grinder.script.Grinder import grinder 
from net.grinder.plugin.http import HTTPPluginControl, HTTPRequest 
from HTTPClient import NVPair 

from jcifs.ntlmssp import Type1Message 
from jcifs.ntlmssp import Type2Message, Type3Message 
from jcifs.util import Base64 

Это часть кода была представлена ​​в примере я нашел. Это была закрытая вещь, которую я мог найти, которая соответствовала бы моим потребностям, так как мне просто нужно получить полный ответ на запрос.

def NTLMAuthentication1(url, request, info, NTLMfield): 
    token_type1 = info.token_type1() 

    params = (NVPair("Authorization", "NTLM "+token_type1),) 
    result = request.GET(url, None, params) 
    NTLMfield = result.getHeader("WWW-Authenticate") 
    return NTLMAuthentication2(url, request, info, NTLMfield) 

def NTLMAuthentication2(url, request, info, NTLMfield): 
    if NTLMfield.startswith("Negotiate"): 
     token_type2 = NTLMfield[len("Negotiate "):] 
    else: 
     token_type2 = NTLMfield[5:] 

    token_type3 = info.token_type3(token_type2) 
    params = (NVPair("Cookie", "WSS_KeepSessionAuthenticated=80"), 
       NVPair("Authorization", "NTLM " + token_type3),) 
    result = request.GET(url, None, params) 
    return result 

# this function validate request and its result to see if the NTLM authentication is required 
def NTLMAuthentication(lastResult, request, info): 
    # get last http request's url 
    url = lastResult.getEffectiveURI().toString()[len(request.getUrl()):] 

    # The result is ask for authentication 
    if lastResult.statusCode != 401 and lastResult.statusCode != 407: 
     return lastResult 

    NTLMfield = lastResult.getHeader("WWW-Authenticate") 
    if NTLMfield == None: 
     return lastResult 

    # check it is the first shakehands 
    if NTLMfield == "Negotiate, NTLM" or NTLMfield == "NTLM": 
     return NTLMAuthentication1(url, request, info, NTLMfield) 

    # check it is the second shakehands 
    elif len(NTLMfield) > 4 and NTLMfield[:4] == "NTLM": 
     return NTLMAuthentication2(url, request, info, NTLMfield) 

    else: 
     return lastResult 

class NTLMAuthenticationInfo: 
    def __init__(self, domain, host, user, passwd): 
     self.domain = 'domain' 
     self.host = 'host' 
     self.user = 'user' 
     self.passwd = 'password' 

    def token_type1(self): 
     msg = Type1Message(Type1Message.getDefaultFlags(), self.domain, self.host) 
     return Base64.encode(msg.toByteArray()) 

    def token_type3(self, token_type2): 
     msg2 = Type2Message(Base64.decode(token_type2)) 

#if jcifs 1.3.7 using msg3 = Type3Message(msg2, self.passwd, self.domain, self.user, self.host) 
     msg3 = Type3Message(msg2, self.passwd, self.domain, self.user, self.host) 
     return Base64.encode(msg3.toByteArray()) 

В основной части запроса выглядит примерно так:

result = request101.GET('/') 

где request101 был предопределен с URL и заголовок. Так, в принципе, я не имею ни малейшего понятия, как реализовать

Я попробовал этот

result = request101.GET('/') 
print str(NTLMAuthentication(result, request101, NTLMAuthenticationInfo)) 

, а также только в этом

NTLMAuthentication(request101.GET('/'), request101, NTLMAuthenticationInfo) 

, но ни один из них работал. Любые советы о том, как запустить это?

ответ

1

попробовать это

ai = NTLMAuthenticationInfo("domain", "your host", "user", "password") 
result = request101.GET('/') 
result = NTLMAuthentication(result, request101, ai)