mirror of
https://github.com/Jackett/Jackett.git
synced 2025-09-17 17:34:09 +02:00
Cardigann: Implement form based login (#701)
This commit is contained in:
@@ -273,6 +273,32 @@ namespace Jackett.Indexers
|
||||
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()
|
||||
{
|
||||
var Login = Definition.Login;
|
||||
@@ -294,25 +320,61 @@ namespace Jackett.Indexers
|
||||
var loginResult = await RequestLoginAndFollowRedirect(LoginUrl, pairs, null, true, null, SiteLink, true);
|
||||
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();
|
||||
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);
|
||||
}
|
||||
}
|
||||
throw new ExceptionWithConfigData(string.Format("Login failed: No form found on {0} using form selector {1}", LoginUrl, FormSelector), 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")
|
||||
{
|
||||
|
Reference in New Issue
Block a user