Add automatic Android app QR scan verification

This commit is contained in:
JonnyWong16 2017-03-30 19:25:45 -07:00
parent ddf671abd1
commit 40060255ee
4 changed files with 103 additions and 13 deletions

View file

@ -3032,6 +3032,7 @@ $(document).ready(function() {
return deferred;
}
var verifiedDevice = false;
$('#generate_qr').click(function () {
getPlexPyURL().then(function (url) {
var parser = document.createElement('a');
@ -3040,14 +3041,44 @@ $(document).ready(function() {
$('#api_qr_private').toggle((valid !== 'n/a'));
});
var encoded_string = url + '|' + $('#api_key').val();
var token = Math.random().toString(36).substr(2, 20);
var encoded_string = url + '|' + $('#api_key').val() + '|' + token;
$('#api_qr_string').html(encoded_string);
$('#api_qr_code').empty().qrcode({
text: encoded_string
});
(function poll(){
verifiedDevice = false;
setTimeout(function() {
$.ajax({
url: 'verify_mobile_device',
type: 'GET',
data: { device_token: token },
success: function(data) {
if (data.result === 'success') {
verifiedDevice = true;
getMobileDevicesTable();
$('#api-qr-modal').modal('hide');
showMsg('<i class="fa fa-check"></i> ' + data.message, false, true, 5000, false);
}
},
complete: function() {
if (!(verifiedDevice)) {
poll();
}
},
timeout: 1000
});
}, 1000);
})();
});
});
$('#api-qr-modal').on('hidden.bs.modal', function () {
verifiedDevice = true;
})
$('body').on('click', 'a[data-tab-destination]', function () {
var tab = $(this).data('tab-destination');
$("a[href=#" + tab + "]").click();

View file

@ -341,7 +341,7 @@ class API2:
return data
def register_device(self, device_name='', device_id='', **kwargs):
def register_device(self, device_id='', device_name='', device_token='' **kwargs):
""" Registers the PlexPy Android App for notifications.
```
@ -350,26 +350,28 @@ class API2:
device_id (str): The OneSignal device id of the PlexPy Android App
Optional parameters:
None
device_token (str): The device token to verify QR code scan
Returns:
None
```
"""
if not device_name:
if not device_id:
self._api_msg = 'Device registartion failed: no device id provided.'
self._api_result_type = 'error'
return
elif not device_name:
self._api_msg = 'Device registartion failed: no device name provided.'
self._api_result_type = 'error'
return
elif not device_id:
self._api_msg = 'Device registartion failed: no device token provided.'
self._api_result_type = 'error'
return
db = database.MonitorDatabase()
keys = {'device_id': device_id}
values = {'device_name': device_name}
values = {'device_name': device_name,
'device_token': device_token}
try:
result = db.upsert(table_name='mobile_devices', key_dict=keys, value_dict=values)

47
plexpy/mobile_app.py Normal file
View file

@ -0,0 +1,47 @@
# This file is part of PlexPy.
#
# PlexPy is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# PlexPy is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with PlexPy. If not, see <http://www.gnu.org/licenses/>.
import plexpy
import database
import helpers
import logger
def get_mobile_devices(device_id=None, device_token=None):
where = where_id = where_token = ''
if device_id or device_token:
where = 'WHERE '
if device_id:
where_id += 'device_id = "%s"' % device_id
if device_token:
where_token = 'device_token = "%s"' % device_token
where += ' AND '.join([w for w in [where_id, where_token] if w])
monitor_db = database.MonitorDatabase()
result = monitor_db.select('SELECT * FROM mobile_devices %s' % where)
return result
def delete_mobile_device(device_id=None):
monitor_db = database.MonitorDatabase()
if device_id:
logger.debug(u"PlexPy Notifiers :: Deleting device_id %s from the database." % device_id)
result = monitor_db.action('DELETE FROM mobile_devices WHERE device_id = ?', [device_id])
return True
else:
return False

View file

@ -39,6 +39,7 @@ import http_handler
import libraries
import log_reader
import logger
import mobile_app
import notification_handler
import notifiers
import plextv
@ -3197,9 +3198,18 @@ class WebInterface(object):
@cherrypy.expose
@requireAuth(member_of("admin"))
def get_mobile_devices_table(self, **kwargs):
result = notifiers.ANDROIDAPP().get_devices()
devices_list = [{'device_id': id, 'device_name': name} for id, name in result.iteritems()]
return serve_template(templatename="mobile_devices_table.html", devices_list=devices_list)
result = mobile_app.get_mobile_devices()
return serve_template(templatename="mobile_devices_table.html", devices_list=result)
@cherrypy.expose
@cherrypy.tools.json_out()
@requireAuth(member_of("admin"))
def verify_mobile_device(self, device_token='', **kwargs):
result = mobile_app.get_mobile_devices(device_token=device_token)
if result:
return {'result': 'success', 'message': 'Device registered successfully.', 'data': result}
else:
return {'result': 'error', 'message': 'Device not registered.'}
@cherrypy.expose
@cherrypy.tools.json_out()
@ -3219,7 +3229,7 @@ class WebInterface(object):
None
```
"""
result = notifiers.delete_mobile_device(device_id=device_id)
result = mobile_app.delete_mobile_device(device_id=device_id)
if result:
return {'result': 'success', 'message': 'Device deleted successfully.'}
else: