Cardigann: Implement form based login (#701)

This commit is contained in:
kaso17
2016-11-19 12:46:31 +01:00
committed by GitHub
parent ddb94e3f92
commit 27627aa79e

View File

@@ -273,6 +273,32 @@ namespace Jackett.Indexers
return template; return template;
} }
protected bool checkForLoginError(WebClientStringResult loginResult)
{
var ErrorBlocks = Definition.Login.Error;
if (ErrorBlocks == null)
return true; // no error
var loginResultParser = new HtmlParser();
var loginResultDocument = loginResultParser.Parse(loginResult.Content);
foreach (errorBlock error in ErrorBlocks)
{
var selection = loginResultDocument.QuerySelector(error.Selector);
if (selection != null)
{
string errorMessage = selection.TextContent;
if (error.Message != null)
{
var errorSubMessage = loginResultDocument.QuerySelector(error.Message.Selector);
errorMessage = errorSubMessage.TextContent;
}
throw new ExceptionWithConfigData(string.Format("Login failed: {0}", errorMessage.Trim()), configData);
}
}
return true; // no error
}
protected async Task<bool> DoLogin() protected async Task<bool> DoLogin()
{ {
var Login = Definition.Login; var Login = Definition.Login;
@@ -294,25 +320,61 @@ namespace Jackett.Indexers
var loginResult = await RequestLoginAndFollowRedirect(LoginUrl, pairs, null, true, null, SiteLink, true); var loginResult = await RequestLoginAndFollowRedirect(LoginUrl, pairs, null, true, null, SiteLink, true);
configData.CookieHeader.Value = loginResult.Cookies; configData.CookieHeader.Value = loginResult.Cookies;
if (Login.Error != null) checkForLoginError(loginResult);
}
else if (Login.Method == "form")
{
var LoginUrl = SiteLink + Login.Path;
var FormSelector = Login.Form;
if (FormSelector == null)
FormSelector = "form";
var pairs = new Dictionary<string, string>();
configData.CookieHeader.Value = null;
var landingResult = await RequestLoginAndFollowRedirect(LoginUrl, pairs, null, false, null, SiteLink, true);
var htmlParser = new HtmlParser();
var landingResultDocument = htmlParser.Parse(landingResult.Content);
var form = landingResultDocument.QuerySelector(FormSelector);
if (form == null)
{ {
var loginResultParser = new HtmlParser(); throw new ExceptionWithConfigData(string.Format("Login failed: No form found on {0} using form selector {1}", LoginUrl, FormSelector), configData);
var loginResultDocument = loginResultParser.Parse(loginResult.Content);
foreach (errorBlock error in Login.Error)
{
var selection = loginResultDocument.QuerySelector(error.Selector);
if (selection != null)
{
string errorMessage = selection.TextContent;
if (error.Message != null)
{
var errorSubMessage = loginResultDocument.QuerySelector(error.Message.Selector);
errorMessage = errorSubMessage.TextContent;
}
throw new ExceptionWithConfigData(string.Format("Login failed: {0}", errorMessage.Trim()), configData);
}
}
} }
var inputs = form.QuerySelectorAll("input");
if (inputs == null)
{
throw new ExceptionWithConfigData(string.Format("Login failed: No inputs found on {0} using form selector {1}", LoginUrl, FormSelector), configData);
}
var submitUrl = resolvePath(form.GetAttribute("action"));
foreach (var input in inputs)
{
var name = input.GetAttribute("name");
if (name == null)
continue;
var value = input.GetAttribute("value");
if (value == null)
value = "";
pairs[name] = value;
}
foreach (var Input in Definition.Login.Inputs)
{
var value = applyGoTemplateText(Input.Value);
pairs[Input.Key] = value;
}
var loginResult = await RequestLoginAndFollowRedirect(submitUrl.ToString(), pairs, landingResult.Cookies, true, null, SiteLink, true);
configData.CookieHeader.Value = loginResult.Cookies;
checkForLoginError(loginResult);
} }
else if (Login.Method == "cookie") else if (Login.Method == "cookie")
{ {