diff --git a/data/interfaces/default/ip_address_modal.html b/data/interfaces/default/ip_address_modal.html
index cb407305..928d4cad 100644
--- a/data/interfaces/default/ip_address_modal.html
+++ b/data/interfaces/default/ip_address_modal.html
@@ -14,7 +14,12 @@
-
Location Details
+
+ Location Details
+ % if data:
+
+ % endif
+
@@ -35,7 +40,12 @@
-
Connection Details
+
+ Connection Details
+ % if data:
+
+ % endif
+
diff --git a/data/interfaces/default/js/ipaddr.min.js b/data/interfaces/default/js/ipaddr.min.js
new file mode 100644
index 00000000..803ff950
--- /dev/null
+++ b/data/interfaces/default/js/ipaddr.min.js
@@ -0,0 +1 @@
+(function(){var r,t,n,e,i,o,a,s;t={},s=this,"undefined"!=typeof module&&null!==module&&module.exports?module.exports=t:s.ipaddr=t,a=function(r,t,n,e){var i,o;if(r.length!==t.length)throw new Error("ipaddr: cannot match CIDR for objects with different lengths");for(i=0;e>0;){if(o=n-e,o<0&&(o=0),r[i]>>o!==t[i]>>o)return!1;e-=n,i+=1}return!0},t.subnetMatch=function(r,t,n){var e,i,o,a,s;null==n&&(n="unicast");for(e in t)for(i=t[e],!i[0]||i[0]instanceof Array||(i=[i]),a=0,s=i.length;a
=0;t=a+=-1){if(n=this.octets[t],!(n in o))return null;if(i=o[n],e&&0!==i)return null;8!==i&&(e=!0),r+=i}return 32-r},r}(),n="(0?\\d+|0x[a-f0-9]+)",e={fourOctet:new RegExp("^"+n+"\\."+n+"\\."+n+"\\."+n+"$","i"),longValue:new RegExp("^"+n+"$","i")},t.IPv4.parser=function(r){var t,n,i,o,a;if(n=function(r){return"0"===r[0]&&"x"!==r[1]?parseInt(r,8):parseInt(r)},t=r.match(e.fourOctet))return function(){var r,e,o,a;for(o=t.slice(1,6),a=[],r=0,e=o.length;r4294967295||a<0)throw new Error("ipaddr: address outside defined range");return function(){var r,t;for(t=[],o=r=0;r<=24;o=r+=8)t.push(a>>o&255);return t}().reverse()}return null},t.IPv6=function(){function r(r){var t,n,e,i,o,a;if(16===r.length)for(this.parts=[],t=e=0;e<=14;t=e+=2)this.parts.push(r[t]<<8|r[t+1]);else{if(8!==r.length)throw new Error("ipaddr: ipv6 part count should be 8 or 16");this.parts=r}for(a=this.parts,i=0,o=a.length;i>8),r.push(255&t);return r},r.prototype.toNormalizedString=function(){var r;return function(){var t,n,e,i;for(e=this.parts,i=[],t=0,n=e.length;t>8,255&r,n>>8,255&n])},r}(),i="(?:[0-9a-f]+::?)+",o={native:new RegExp("^(::)?("+i+")?([0-9a-f]+)?(::)?$","i"),transitional:new RegExp("^((?:"+i+")|(?:::)(?:"+i+")?)"+(""+n+"\\."+n+"\\."+n+"\\."+n+"$"),"i")},r=function(r,t){var n,e,i,o,a;if(r.indexOf("::")!==r.lastIndexOf("::"))return null;for(n=0,e=-1;(e=r.indexOf(":",e+1))>=0;)n++;if("::"===r.substr(0,2)&&n--,"::"===r.substr(-2,2)&&n--,n>t)return null;for(a=t-n,o=":";a--;)o+="0:";return r=r.replace("::",o),":"===r[0]&&(r=r.slice(1)),":"===r[r.length-1]&&(r=r.slice(0,-1)),function(){var t,n,e,o;for(e=r.split(":"),o=[],t=0,n=e.length;t=0&&t<=32))return[this.parse(n[1]),t];throw new Error("ipaddr: string is not formatted like an IPv4 CIDR range")},t.IPv6.parseCIDR=function(r){var t,n;if((n=r.match(/^(.+)\/(\d+)$/))&&(t=parseInt(n[2]),t>=0&&t<=128))return[this.parse(n[1]),t];throw new Error("ipaddr: string is not formatted like an IPv6 CIDR range")},t.isValid=function(r){return t.IPv6.isValid(r)||t.IPv4.isValid(r)},t.parse=function(r){if(t.IPv6.isValid(r))return t.IPv6.parse(r);if(t.IPv4.isValid(r))return t.IPv4.parse(r);throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format")},t.parseCIDR=function(r){var n;try{return t.IPv6.parseCIDR(r)}catch(e){n=e;try{return t.IPv4.parseCIDR(r)}catch(r){throw n=r,new Error("ipaddr: the address has neither IPv6 nor IPv4 CIDR format")}}},t.fromByteArray=function(r){var n;if(n=r.length,4===n)return new t.IPv4(r);if(16===n)return new t.IPv6(r);throw new Error("ipaddr: the binary input is neither an IPv6 nor IPv4 address")},t.process=function(r){var t;return t=this.parse(r),"ipv6"===t.kind()&&t.isIPv4MappedAddress()?t.toIPv4Address():t}}).call(this);
\ No newline at end of file
diff --git a/data/interfaces/default/js/script.js b/data/interfaces/default/js/script.js
index 6824b14e..a1cc43fb 100644
--- a/data/interfaces/default/js/script.js
+++ b/data/interfaces/default/js/script.js
@@ -266,20 +266,45 @@ function getPlatformImagePath(platformName) {
}
}
+$.cachedScript = function (url) {
+ return $.ajax({
+ dataType: "script",
+ cache: true,
+ url: url
+ });
+};
+
function isPrivateIP(ip_address) {
- if (ip_address.indexOf(".") > -1) {
- // get IPv4 mapped address (xxx.xxx.xxx.xxx) from IPv6 addresss (::ffff:xxx.xxx.xxx.xxx)
- var parts = ip_address.split(":");
- var parts = parts[parts.length - 1].split('.');
- if ((parts[0] === '127' && parts[1] === '0' && parts[2] === '0' && parts[3] === '1') || (parts[0] === '10') ||
- (parts[0] === '172' && (parseInt(parts[1], 10) >= 16 && parseInt(parts[1], 10) <= 31)) || (parts[0] ===
- '192' && parts[1] === '168')) {
- return true;
+ var defer = $.Deferred();
+
+ $.cachedScript('js/ipaddr.min.js').done(function () {
+ if (ipaddr.isValid(ip_address)) {
+ var addr = ipaddr.process(ip_address)
+
+ if (addr.kind() === 'ipv4') {
+ var rangeList = [
+ ipaddr.parseCIDR('127.0.0.0/8'),
+ ipaddr.parseCIDR('10.0.0.0/8'),
+ ipaddr.parseCIDR('172.16.0.0/12'),
+ ipaddr.parseCIDR('192.168.0.0/16')
+ ]
+ } else {
+ var rangeList = [
+ ipaddr.parseCIDR('fd00::/8')
+ ]
+ }
+
+ if (ipaddr.subnetMatch(addr, rangeList, -1) >= 0) {
+ defer.resolve();
+ } else {
+ defer.reject();
+ }
+ } else {
+ defer.resolve('n/a');
}
- return false;
- } else {
- return true;
- }
+ })
+
+ return defer.promise();
}
function humanTime(seconds) {
diff --git a/data/interfaces/default/js/tables/history_table.js b/data/interfaces/default/js/tables/history_table.js
index 384e03b2..21d0b856 100644
--- a/data/interfaces/default/js/tables/history_table.js
+++ b/data/interfaces/default/js/tables/history_table.js
@@ -94,16 +94,12 @@ history_table_options = {
"data": "ip_address",
"createdCell": function (td, cellData, rowData, row, col) {
if (cellData) {
- if (isPrivateIP(cellData)) {
- if (cellData != '') {
- $(td).html(cellData);
- } else {
- $(td).html('n/a');
- }
- } else {
+ isPrivateIP(cellData).then(function () {
+ $(td).html(cellData || 'n/a');
+ }, function () {
external_ip = '';
$(td).html(''+ external_ip + cellData + '');
- }
+ });
} else {
$(td).html('n/a');
}
@@ -253,13 +249,12 @@ history_table_options = {
$('#ajaxMsg').fadeOut();
// Create the tooltips.
- $('.current-activity-tooltip').tooltip({ container: 'body' });
- $('.expand-history-tooltip').tooltip({ container: 'body' });
- $('.external-ip-tooltip').tooltip({ container: 'body' });
- $('.transcode-tooltip').tooltip({ container: 'body' });
- $('.media-type-tooltip').tooltip({ container: 'body' });
- $('.watched-tooltip').tooltip({ container: 'body' });
- $('.thumb-tooltip').popover({
+ $('body').tooltip({
+ selector: '[data-toggle="tooltip"]',
+ container: 'body'
+ });
+ $('body').popover({
+ selector: '[data-toggle="popover"]',
html: true,
container: 'body',
trigger: 'hover',
@@ -331,22 +326,13 @@ $('.history_table').on('click', '> tbody > tr > td.modal-control', function () {
var row = history_table.row( tr );
var rowData = row.data();
- function showStreamDetails() {
- $.ajax({
- url: 'get_stream_data',
- data: {
- row_id: rowData['id'],
- session_key: rowData['session_key'],
- user: rowData['friendly_name']
- },
- cache: false,
- async: true,
- complete: function(xhr, status) {
- $("#info-modal").html(xhr.responseText);
- }
- });
- }
- showStreamDetails();
+ $.get('get_stream_data', {
+ row_id: rowData['id'],
+ session_key: rowData['session_key'],
+ user: rowData['friendly_name']
+ }).then(function (jqXHR) {
+ $("#info-modal").html(jqXHR);
+ });
});
// Parent table ip address modal
@@ -355,21 +341,11 @@ $('.history_table').on('click', '> tbody > tr > td.modal-control-ip', function (
var row = history_table.row( tr );
var rowData = row.data();
- function getUserLocation(ip_address) {
- if (isPrivateIP(ip_address)) {
- return "n/a"
- } else {
- $.ajax({
- url: 'get_ip_address_details',
- data: {ip_address: ip_address},
- async: true,
- complete: function(xhr, status) {
- $("#ip-info-modal").html(xhr.responseText);
- }
- });
- }
- }
- getUserLocation(rowData['ip_address']);
+ $.get('get_ip_address_details', {
+ ip_address: rowData['ip_address']
+ }).then(function (jqXHR) {
+ $("#ip-info-modal").html(jqXHR);
+ });
});
// Parent table delete mode
@@ -545,18 +521,12 @@ function createChildTable(row, rowData) {
var childRow = history_child_table[rowData['reference_id']].row(tr);
var childRowData = childRow.data();
- function showStreamDetails() {
- $.ajax({
- url: 'get_stream_data',
- data: { row_id: childRowData['id'], user: childRowData['friendly_name'] },
- cache: false,
- async: true,
- complete: function (xhr, status) {
- $("#info-modal").html(xhr.responseText);
- }
- });
- }
- showStreamDetails();
+ $.get('get_stream_data', {
+ row_id: childRowData['id'],
+ user: childRowData['friendly_name']
+ }).then(function (jqXHR) {
+ $("#info-modal").html(jqXHR);
+ });
});
// Child table ip address modal
@@ -565,21 +535,11 @@ function createChildTable(row, rowData) {
var childRow = history_child_table[rowData['reference_id']].row(tr);
var childRowData = childRow.data();
- function getUserLocation(ip_address) {
- if (isPrivateIP(ip_address)) {
- return "n/a"
- } else {
- $.ajax({
- url: 'get_ip_address_details',
- data: { ip_address: ip_address },
- async: true,
- complete: function (xhr, status) {
- $("#ip-info-modal").html(xhr.responseText);
- }
- });
- }
- }
- getUserLocation(childRowData['ip_address']);
+ $.get('get_ip_address_details', {
+ ip_address: childRowData['ip_address']
+ }).then(function (jqXHR) {
+ $("#ip-info-modal").html(jqXHR);
+ });
});
// Child table delete mode
diff --git a/data/interfaces/default/js/tables/history_table_modal.js b/data/interfaces/default/js/tables/history_table_modal.js
index 1d0a6b61..adf03e4f 100644
--- a/data/interfaces/default/js/tables/history_table_modal.js
+++ b/data/interfaces/default/js/tables/history_table_modal.js
@@ -131,9 +131,12 @@ history_table_modal_options = {
$('#ajaxMsg').fadeOut();
// Create the tooltips.
- $('.transcode-tooltip').tooltip({ container: 'body' });
- $('.media-type-tooltip').tooltip({ container: 'body' });
- $('.thumb-tooltip').popover({
+ $('body').tooltip({
+ selector: '[data-toggle="tooltip"]',
+ container: 'body'
+ });
+ $('body').popover({
+ selector: '[data-toggle="popover"]',
html: true,
container: '#history-modal',
trigger: 'hover',
diff --git a/data/interfaces/default/js/tables/libraries.js b/data/interfaces/default/js/tables/libraries.js
index ad7a7435..0069e13e 100644
--- a/data/interfaces/default/js/tables/libraries.js
+++ b/data/interfaces/default/js/tables/libraries.js
@@ -217,11 +217,12 @@ libraries_list_table_options = {
$('#ajaxMsg').fadeOut();
// Create the tooltips.
- $('.purge-tooltip').tooltip({ container: 'body' });
- $('.edit-tooltip').tooltip({ container: 'body' });
- $('.transcode-tooltip').tooltip({ container: 'body' });
- $('.media-type-tooltip').tooltip({ container: 'body' });
- $('.thumb-tooltip').popover({
+ $('body').tooltip({
+ selector: '[data-toggle="tooltip"]',
+ container: 'body'
+ });
+ $('body').popover({
+ selector: '[data-toggle="popover"]',
html: true,
container: 'body',
trigger: 'hover',
diff --git a/data/interfaces/default/js/tables/login_logs.js b/data/interfaces/default/js/tables/login_logs.js
index a0e7197e..325ad973 100644
--- a/data/interfaces/default/js/tables/login_logs.js
+++ b/data/interfaces/default/js/tables/login_logs.js
@@ -49,16 +49,12 @@ login_log_table_options = {
"data": "ip_address",
"createdCell": function (td, cellData, rowData, row, col) {
if (cellData) {
- if (isPrivateIP(cellData)) {
- if (cellData != '') {
- $(td).html(cellData);
- } else {
- $(td).html('n/a');
- }
- } else {
+ isPrivateIP(cellData).then(function () {
+ $(td).html(cellData || 'n/a');
+ }, function () {
external_ip = '';
$(td).html('' + external_ip + cellData + '');
- }
+ });
} else {
$(td).html('n/a');
}
@@ -92,7 +88,10 @@ login_log_table_options = {
$('#ajaxMsg').fadeOut();
// Create the tooltips.
- $('.external-ip-tooltip').tooltip({ container: 'body' });
+ $('body').tooltip({
+ selector: '[data-toggle="tooltip"]',
+ container: 'body'
+ });
},
"preDrawCallback": function (settings) {
@@ -106,19 +105,9 @@ $('.login_log_table').on('click', '> tbody > tr > td.modal-control-ip', function
var row = login_log_table.row(tr);
var rowData = row.data();
- function getUserLocation(ip_address) {
- if (isPrivateIP(ip_address)) {
- return "n/a"
- } else {
- $.ajax({
- url: 'get_ip_address_details',
- data: { ip_address: ip_address },
- async: true,
- complete: function (xhr, status) {
- $("#ip-info-modal").html(xhr.responseText);
- }
- });
- }
- }
- getUserLocation(rowData['ip_address']);
+ $.get('get_ip_address_details', {
+ ip_address: rowData['ip_address']
+ }).then(function (jqXHR) {
+ $("#ip-info-modal").html(jqXHR);
+ });
});
\ No newline at end of file
diff --git a/data/interfaces/default/js/tables/media_info_table.js b/data/interfaces/default/js/tables/media_info_table.js
index d1e54a34..48f92a8a 100644
--- a/data/interfaces/default/js/tables/media_info_table.js
+++ b/data/interfaces/default/js/tables/media_info_table.js
@@ -237,9 +237,12 @@ media_info_table_options = {
$('#ajaxMsg').fadeOut();
// Create the tooltips.
- $('.expand-media-info-tooltip').tooltip({ container: 'body' });
- $('.media-type-tooltip').tooltip({ container: 'body' });
- $('.thumb-tooltip').popover({
+ $('body').tooltip({
+ selector: '[data-toggle="tooltip"]',
+ container: 'body'
+ });
+ $('body').popover({
+ selector: '[data-toggle="popover"]',
html: true,
container: 'body',
trigger: 'hover',
diff --git a/data/interfaces/default/js/tables/user_ips.js b/data/interfaces/default/js/tables/user_ips.js
index 861ae287..c8b33758 100644
--- a/data/interfaces/default/js/tables/user_ips.js
+++ b/data/interfaces/default/js/tables/user_ips.js
@@ -33,16 +33,12 @@ user_ip_table_options = {
"data": "ip_address",
"createdCell": function (td, cellData, rowData, row, col) {
if (cellData) {
- if (isPrivateIP(cellData)) {
- if (cellData != '') {
- $(td).html(cellData);
- } else {
- $(td).html('n/a');
- }
- } else {
+ isPrivateIP(cellData).then(function () {
+ $(td).html(cellData || 'n/a');
+ }, function () {
external_ip = '';
$(td).html('' + external_ip + cellData + '');
- }
+ });
} else {
$(td).html('n/a');
}
@@ -63,9 +59,9 @@ user_ip_table_options = {
},
{
"targets": [3],
- "data":"player",
+ "data": "player",
"createdCell": function (td, cellData, rowData, row, col) {
- if (cellData) {
+ if (cellData !== '') {
var transcode_dec = '';
if (rowData['transcode_decision'] === 'transcode') {
transcode_dec = '';
@@ -74,9 +70,7 @@ user_ip_table_options = {
} else if (rowData['transcode_decision'] === 'direct play') {
transcode_dec = '';
}
- $(td).html('');
- } else {
- $(td).html('n/a');
+ $(td).html('');
}
},
"width": "15%",
@@ -84,7 +78,7 @@ user_ip_table_options = {
},
{
"targets": [4],
- "data":"last_played",
+ "data": "last_played",
"createdCell": function (td, cellData, rowData, row, col) {
if (cellData !== '') {
var parent_info = '';
@@ -117,7 +111,7 @@ user_ip_table_options = {
},
{
"targets": [5],
- "data":"play_count",
+ "data": "play_count",
"searchable": false,
"width": "10%",
"className": "no-wrap"
@@ -129,11 +123,12 @@ user_ip_table_options = {
$('#ajaxMsg').fadeOut();
// Create the tooltips.
- $('.external-ip-tooltip').tooltip({ container: 'body' });
- $('.transcode-tooltip').tooltip({ container: 'body' });
- $('.media-type-tooltip').tooltip({ container: 'body' });
- $('.watched-tooltip').tooltip({ container: 'body' });
- $('.thumb-tooltip').popover({
+ $('body').tooltip({
+ selector: '[data-toggle="tooltip"]',
+ container: 'body'
+ });
+ $('body').popover({
+ selector: '[data-toggle="popover"]',
html: true,
container: 'body',
trigger: 'hover',
@@ -179,20 +174,9 @@ $('.user_ip_table').on('click', 'td.modal-control-ip', function () {
var row = user_ip_table.row( tr );
var rowData = row.data();
- function getUserLocation(ip_address) {
- if (isPrivateIP(ip_address)) {
- return "n/a"
- } else {
- $.ajax({
- url: 'get_ip_address_details',
- data: {ip_address: ip_address},
- async: true,
- complete: function(xhr, status) {
- $("#ip-info-modal").html(xhr.responseText);
- }
- });
- }
- }
-
- getUserLocation(rowData['ip_address']);
+ $.get('get_ip_address_details', {
+ ip_address: rowData['ip_address']
+ }).then(function (jqXHR) {
+ $("#ip-info-modal").html(jqXHR);
+ });
});
\ No newline at end of file
diff --git a/data/interfaces/default/js/tables/users.js b/data/interfaces/default/js/tables/users.js
index 47d01484..c3cea31c 100644
--- a/data/interfaces/default/js/tables/users.js
+++ b/data/interfaces/default/js/tables/users.js
@@ -105,15 +105,12 @@ users_list_table_options = {
"data": "ip_address",
"createdCell": function (td, cellData, rowData, row, col) {
if (cellData) {
- if (isPrivateIP(cellData)) {
- if (cellData != '') {
- $(td).html(cellData);
- } else {
- $(td).html('n/a');
- }
- } else {
- $(td).html(' ' + cellData + '');
- }
+ isPrivateIP(cellData).then(function () {
+ $(td).html(cellData || 'n/a');
+ }, function () {
+ external_ip = '';
+ $(td).html('' + external_ip + cellData + '');
+ });
} else {
$(td).html('n/a');
}
@@ -220,12 +217,12 @@ users_list_table_options = {
$('#ajaxMsg').fadeOut();
// Create the tooltips.
- $('.purge-tooltip').tooltip({ container: 'body' });
- $('.edit-tooltip').tooltip({ container: 'body' });
- $('.transcode-tooltip').tooltip({ container: 'body' });
- $('.media-type-tooltip').tooltip({ container: 'body' });
- $('.watched-tooltip').tooltip({ container: 'body' });
- $('.thumb-tooltip').popover({
+ $('body').tooltip({
+ selector: '[data-toggle="tooltip"]',
+ container: 'body'
+ });
+ $('body').popover({
+ selector: '[data-toggle="popover"]',
html: true,
container: 'body',
trigger: 'hover',
@@ -262,18 +259,12 @@ $('#users_list_table').on('click', 'td.modal-control', function () {
var row = users_list_table.row(tr);
var rowData = row.data();
- function showStreamDetails() {
- $.ajax({
- url: 'get_stream_data',
- data: { row_id: rowData['id'], user: rowData['friendly_name'] },
- cache: false,
- async: true,
- complete: function (xhr, status) {
- $("#info-modal").html(xhr.responseText);
- }
- });
- }
- showStreamDetails();
+ $.get('get_stream_data', {
+ row_id: rowData['id'],
+ user: rowData['friendly_name']
+ }).then(function (jqXHR) {
+ $("#info-modal").html(jqXHR);
+ });
});
$('#users_list_table').on('click', 'td.modal-control-ip', function () {
@@ -281,22 +272,11 @@ $('#users_list_table').on('click', 'td.modal-control-ip', function () {
var row = users_list_table.row(tr);
var rowData = row.data();
- function getUserLocation(ip_address) {
- if (isPrivateIP(ip_address)) {
- return "n/a"
- } else {
- $.ajax({
- url: 'get_ip_address_details',
- data: { ip_address: ip_address },
- async: true,
- complete: function (xhr, status) {
- $("#ip-info-modal").html(xhr.responseText);
- }
- });
- }
- }
-
- getUserLocation(rowData['ip_address']);
+ $.get('get_ip_address_details', {
+ ip_address: rowData['ip_address']
+ }).then(function (jqXHR) {
+ $("#ip-info-modal").html(jqXHR);
+ });
});
$('#users_list_table').on('change', 'td.edit-control > .edit-user-toggles > input, td.edit-user-control > .edit-user-name > input', function () {
diff --git a/data/interfaces/default/settings.html b/data/interfaces/default/settings.html
index d03a68d4..9e0fb088 100644
--- a/data/interfaces/default/settings.html
+++ b/data/interfaces/default/settings.html
@@ -2720,7 +2720,9 @@ $(document).ready(function() {
getPlexPyURL().then(function (url) {
var parser = document.createElement('a');
parser.href = url;
- $('#api_qr_private').toggle(isPrivateIP(parser.hostname));
+ isPrivateIP(parser.hostname).then(function (valid) {
+ $('#api_qr_private').toggle((valid !== 'n/a'));
+ });
var encoded_string = url + '|' + $('#api_key').val();
$('#api_qr_string').html(encoded_string);
diff --git a/plexpy/helpers.py b/plexpy/helpers.py
index 1c5ac6e7..345930c4 100644
--- a/plexpy/helpers.py
+++ b/plexpy/helpers.py
@@ -502,28 +502,32 @@ def sanitize(string):
else:
return ''
-def is_ip_public(host):
- ip_address = get_ip(host)
- ip = IP(ip_address)
- if ip.iptype() == 'PUBLIC':
+def is_public_ip(host):
+ ip = is_valid_ip(get_ip(host))
+ if ip and ip.iptype() == 'PUBLIC':
return True
-
return False
def get_ip(host):
ip_address = ''
- try:
- socket.inet_aton(host)
- ip_address = host
- except socket.error:
+ if is_valid_ip(host):
+ return host
+ else:
try:
- ip_address = socket.gethostbyname(host)
+ ip_address = socket.getaddrinfo(host, None)[0][4][0]
logger.debug(u"IP Checker :: Resolved %s to %s." % (host, ip_address))
except:
logger.error(u"IP Checker :: Bad IP or hostname provided.")
-
return ip_address
+def is_valid_ip(address):
+ try:
+ return IP(address)
+ except TypeError:
+ return False
+ except ValueError:
+ return False
+
def install_geoip_db():
maxmind_url = 'http://geolite.maxmind.com/download/geoip/database/'
geolite2_gz = 'GeoLite2-City.mmdb.gz'
diff --git a/plexpy/logger.py b/plexpy/logger.py
index 17afa084..dc24d0ed 100644
--- a/plexpy/logger.py
+++ b/plexpy/logger.py
@@ -92,14 +92,14 @@ class PublicIPFilter(logging.Filter):
# Currently only checking for ipv4 addresses
ipv4 = re.findall(r'[0-9]+(?:\.[0-9]+){3}(?!\d*-[a-z0-9]{6})', record.msg)
for ip in ipv4:
- if helpers.is_ip_public(ip):
+ if helpers.is_public_ip(ip):
record.msg = record.msg.replace(ip, ip.partition('.')[0] + '.***.***.***')
args = []
for arg in record.args:
ipv4 = re.findall(r'[0-9]+(?:\.[0-9]+){3}(?!\d*-[a-z0-9]{6})', arg) if isinstance(arg, basestring) else []
for ip in ipv4:
- if helpers.is_ip_public(ip):
+ if helpers.is_public_ip(ip):
arg = arg.replace(ip, ip.partition('.')[0] + '.***.***.***')
args.append(arg)
record.args = tuple(args)
diff --git a/plexpy/webserve.py b/plexpy/webserve.py
index 32a719e6..ab5fce83 100644
--- a/plexpy/webserve.py
+++ b/plexpy/webserve.py
@@ -1719,11 +1719,7 @@ class WebInterface(object):
@cherrypy.expose
@requireAuth()
def get_ip_address_details(self, ip_address=None, **kwargs):
- import socket
-
- try:
- socket.inet_aton(ip_address)
- except socket.error:
+ if not helpers.is_valid_ip(ip_address):
ip_address = None
return serve_template(templatename="ip_address_modal.html", title="IP Address Details", data=ip_address)