diff --git a/src/Jackett/Indexers/CardigannIndexer.cs b/src/Jackett/Indexers/CardigannIndexer.cs index fc7761ad5..5d5eb02d1 100644 --- a/src/Jackett/Indexers/CardigannIndexer.cs +++ b/src/Jackett/Indexers/CardigannIndexer.cs @@ -271,6 +271,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 DoLogin() @@ -293,26 +319,62 @@ namespace Jackett.Indexers configData.CookieHeader.Value = null; 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(); + + 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") {