Implement not local/recaptcha login for torrentday

This commit is contained in:
KZ
2015-08-08 10:26:29 +01:00
parent d1ff05ac13
commit ac0842f786
5 changed files with 90 additions and 15 deletions

View File

@@ -243,4 +243,18 @@ hr {
.downloadcolumn { .downloadcolumn {
text-align:center; text-align:center;
}
pre {
display: block;
padding: 3px;
margin: 0 0 0px;
font-size: 13px;
line-height: 1.42857143;
color: #333;
word-break: break-all;
word-wrap: break-word;
background-color: transparent;
border: 0px;
border-radius: 0px;
} }

View File

@@ -3,6 +3,9 @@
reloadIndexers(); reloadIndexers();
loadJackettSettings(); loadJackettSettings();
window.jackettIsLocal = window.location.hostname === 'localhost' ||
window.location.hostname === '127.0.0.1';
$('body').on('click', '.downloadlink', function (e, b) { $('body').on('click', '.downloadlink', function (e, b) {
$(e.target).addClass('jackettdownloaded'); $(e.target).addClass('jackettdownloaded');
}); });
@@ -81,7 +84,7 @@ $("#jackett-show-releases").click(function () {
var count = 0; var count = 0;
this.api().columns().every(function () { this.api().columns().every(function () {
count++; count++;
if (count === 5 || count ===7) { if (count === 5 || count === 7) {
var column = this; var column = this;
var select = $('<select><option value=""></option></select>') var select = $('<select><option value=""></option></select>')
.appendTo($(column.footer()).empty()) .appendTo($(column.footer()).empty())
@@ -131,7 +134,7 @@ $("#change-jackett-port").click(function () {
var jsonObject = { var jsonObject = {
port: jackett_port, port: jackett_port,
external: jackett_external, external: jackett_external,
blackholedir: $("#jackett-savedir").val() blackholedir: $("#jackett-savedir").val()
}; };
var jqxhr = $.post("/admin/set_config", JSON.stringify(jsonObject), function (data) { var jqxhr = $.post("/admin/set_config", JSON.stringify(jsonObject), function (data) {
if (data.result == "error") { if (data.result == "error") {
@@ -293,21 +296,37 @@ function populateConfigItems(configForm, config) {
} }
var $formItemContainer = configForm.find(".config-setup-form"); var $formItemContainer = configForm.find(".config-setup-form");
$formItemContainer.empty(); $formItemContainer.empty();
var setupItemTemplate = Handlebars.compile($("#setup-item").html());
$('.jackettrecaptcha').remove();
var hasReacaptcha = false;
var captchaItem = null;
for (var i = 0; i < config.length; i++) { for (var i = 0; i < config.length; i++) {
var item = config[i]; if (config[i].type === 'recaptcha') {
var setupValueTemplate = Handlebars.compile($("#setup-item-" + item.type).html()); hasReacaptcha = true;
captchaItem = config[i];
}
item.value_element = setupValueTemplate(item); }
var template = setupItemTemplate(item);
var setupItemTemplate = Handlebars.compile($("#setup-item").html());
if (hasReacaptcha && !window.jackettIsLocal) {
var setupValueTemplate = Handlebars.compile($("#setup-item-nonlocalrecaptcha").html());
captchaItem.value_element = setupValueTemplate(captchaItem);
var template = setupItemTemplate(captchaItem);
$formItemContainer.append(template); $formItemContainer.append(template);
} else {
if (item.type === 'recaptcha') { for (var i = 0; i < config.length; i++) {
grecaptcha.render($('.jackettrecaptcha')[0], { var item = config[i];
'sitekey': item.sitekey var setupValueTemplate = Handlebars.compile($("#setup-item-" + item.type).html());
}); item.value_element = setupValueTemplate(item);
var template = setupItemTemplate(item);
$formItemContainer.append(template);
if (item.type === 'recaptcha') {
grecaptcha.render($('.jackettrecaptcha')[0], {
'sitekey': item.sitekey
});
}
} }
} }
} }
@@ -338,7 +357,11 @@ function getConfigModalJson(configForm) {
itemEntry.value = $el.find(".setup-item-inputbool input").is(":checked"); itemEntry.value = $el.find(".setup-item-inputbool input").is(":checked");
break; break;
case "recaptcha": case "recaptcha":
itemEntry.value = $('.g-recaptcha-response').val(); if (window.jackettIsLocal) {
itemEntry.value = $('.g-recaptcha-response').val();
} else {
itemEntry.cookie = $el.find(".setup-item-recaptcha input").val();
}
break; break;
} }
configJson.push(itemEntry) configJson.push(itemEntry)

View File

@@ -13,7 +13,7 @@
<script src="/libs/handlebarsmoment.js"></script> <script src="/libs/handlebarsmoment.js"></script>
<script src="/bootstrap/bootstrap.min.js"></script> <script src="/bootstrap/bootstrap.min.js"></script>
<script src="/libs/bootstrap-notify.js"></script> <script src="/libs/bootstrap-notify.js"></script>
<script src='https://www.google.com/recaptcha/api.js'></script> <script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>
<link href="/bootstrap/bootstrap.min.css" rel="stylesheet"> <link href="/bootstrap/bootstrap.min.css" rel="stylesheet">
<link href="/animate.css" rel="stylesheet"> <link href="/animate.css" rel="stylesheet">
@@ -21,6 +21,14 @@
<link href="/css/jquery.dataTables.css" rel="stylesheet"> <link href="/css/jquery.dataTables.css" rel="stylesheet">
<link rel="stylesheet" href="/css/font-awesome.min.css"> <link rel="stylesheet" href="/css/font-awesome.min.css">
<script id="setup-item-nonlocalrecaptcha" type="text/x-handlebars-template">
<div class="setup-item-recaptcha">
<p>This site requires you to enter a ReCaptcha however this only works when accessing Jackett via localhost or 127.0.0.1. If you cannot access Jackett using that hostname then alternatively you can enter the cookie for the site manually. <a href="https://github.com/zone117x/Jackett/wiki/Finding-cookies" target="_blank">See here</a> on how get the cookies.</p>
<div class="setup-item-label">Full cookie header</div>
<input class="form-control" type="text" value="" />
</div>
</script>
<script id="setup-item" type="text/x-handlebars-template"> <script id="setup-item" type="text/x-handlebars-template">
<div class="setup-item form-group" data-id="{{id}}" data-value="{{value}}" data-type="{{type}}"> <div class="setup-item form-group" data-id="{{id}}" data-value="{{value}}" data-type="{{type}}">
<div class="setup-item-label">{{name}}</div> <div class="setup-item-label">{{name}}</div>

View File

@@ -103,6 +103,28 @@ namespace Jackett.Indexers
{ "g-recaptcha-response", configData.Captcha.Value } { "g-recaptcha-response", configData.Captcha.Value }
}; };
if (!string.IsNullOrWhiteSpace(configData.Captcha.Cookie))
{
// Cookie was manually supplied
CookieHeader = configData.Captcha.Cookie;
try
{
var results = await PerformQuery(new TorznabQuery());
if (results.Count() == 0)
{
throw new Exception("Your cookie did not work");
}
SaveConfig();
IsConfigured = true;
}
catch(Exception e)
{
IsConfigured = false;
throw new Exception("Your cookie did not work: " + e.Message);
}
}
var result = await RequestLoginAndFollowRedirect(LoginUrl, pairs, configData.CookieHeader.Value, true, SiteLink, LoginUrl); var result = await RequestLoginAndFollowRedirect(LoginUrl, pairs, configData.CookieHeader.Value, true, SiteLink, LoginUrl);
await ConfigureIfOK(result.Cookies, result.Content != null && result.Content.Contains("logout.php"), () => await ConfigureIfOK(result.Cookies, result.Content != null && result.Content.Contains("logout.php"), () =>
{ {
@@ -110,6 +132,12 @@ namespace Jackett.Indexers
var messageEl = dom["#login"]; var messageEl = dom["#login"];
messageEl.Children("form").Remove(); messageEl.Children("form").Remove();
var errorMessage = messageEl.Text().Trim(); var errorMessage = messageEl.Text().Trim();
if (string.IsNullOrWhiteSpace(errorMessage))
{
errorMessage = dom.Text();
}
throw new ExceptionWithConfigData(errorMessage, configData); throw new ExceptionWithConfigData(errorMessage, configData);
}); });
} }

View File

@@ -72,6 +72,7 @@ namespace Jackett.Models.IndexerConfig
break; break;
case ItemType.Recaptcha: case ItemType.Recaptcha:
((RecaptchaItem)item).Value = arrItem.Value<string>("value"); ((RecaptchaItem)item).Value = arrItem.Value<string>("value");
((RecaptchaItem)item).Cookie = arrItem.Value<string>("cookie");
break; break;
} }
} }
@@ -167,6 +168,7 @@ namespace Jackett.Models.IndexerConfig
{ {
public string SiteKey { get; set; } public string SiteKey { get; set; }
public string Value { get; set; } public string Value { get; set; }
public string Cookie { get; set; }
public StringItem() public StringItem()
{ {
ItemType = ConfigurationData.ItemType.InputString; ItemType = ConfigurationData.ItemType.InputString;