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;
|
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);
|
||||||
{
|
|
||||||
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);
|
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)
|
||||||
|
{
|
||||||
|
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")
|
else if (Login.Method == "cookie")
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user