Ticket 921817 - exception when connecting using PJLink authentication method

Fix incorrect location data when projector instance created.

Fix typo in getting authenticated connection salt setup.

Move salt/pin/test hash to resources file for multiple tests.

Add test for ticket 921817.

Passes local nosetests3 and pep8.

bzr-revno: 2599
This commit is contained in:
Ken Roberts 2016-01-09 19:44:30 +00:00 committed by Tim Bentley
commit 5a2c3e5abc
4 changed files with 80 additions and 5 deletions

View File

@ -101,7 +101,7 @@ class PJLink1(QTcpSocket):
self.location = None self.location = None
self.notes = None self.notes = None
self.dbid = None if 'dbid' not in kwargs else kwargs['dbid'] self.dbid = None if 'dbid' not in kwargs else kwargs['dbid']
self.location = None if 'location' not in kwargs else kwargs['notes'] self.location = None if 'location' not in kwargs else kwargs['location']
self.notes = None if 'notes' not in kwargs else kwargs['notes'] self.notes = None if 'notes' not in kwargs else kwargs['notes']
# Poll time 20 seconds unless called with something else # Poll time 20 seconds unless called with something else
self.poll_time = 20000 if 'poll_time' not in kwargs else kwargs['poll_time'] * 1000 self.poll_time = 20000 if 'poll_time' not in kwargs else kwargs['poll_time'] * 1000
@ -345,7 +345,7 @@ class PJLink1(QTcpSocket):
# Authenticated login with salt # Authenticated login with salt
log.debug('(%s) Setting hash with salt="%s"' % (self.ip, data_check[2])) log.debug('(%s) Setting hash with salt="%s"' % (self.ip, data_check[2]))
log.debug('(%s) pin="%s"' % (self.ip, self.pin)) log.debug('(%s) pin="%s"' % (self.ip, self.pin))
salt = qmd5_hash(salt=data_check[2].endcode('ascii'), data=self.pin.encode('ascii')) salt = qmd5_hash(salt=data_check[2].encode('ascii'), data=self.pin.encode('ascii'))
else: else:
salt = None salt = None
# We're connected at this point, so go ahead and do regular I/O # We're connected at this point, so go ahead and do regular I/O

View File

@ -29,9 +29,10 @@ from unittest import TestCase
from openlp.core.common import verify_ip_address, md5_hash, qmd5_hash from openlp.core.common import verify_ip_address, md5_hash, qmd5_hash
salt = '498e4a67' from tests.resources.projector.data import TEST_PIN, TEST_SALT, TEST_HASH
pin = 'JBMIAProjectorLink' salt = TEST_SALT
test_hash = '5d8409bc1c3fa39749434aa3a5c38682' pin = TEST_PIN
test_hash = TEST_HASH
test_non_ascii_string = '이것은 한국어 시험 문자열' test_non_ascii_string = '이것은 한국어 시험 문자열'
test_non_ascii_hash = 'fc00c7912976f6e9c19099b514ced201' test_non_ascii_hash = 'fc00c7912976f6e9c19099b514ced201'

View File

@ -0,0 +1,63 @@
# -*- coding: utf-8 -*-
# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
###############################################################################
# OpenLP - Open Source Lyrics Projection #
# --------------------------------------------------------------------------- #
# Copyright (c) 2008-2015 OpenLP Developers #
# --------------------------------------------------------------------------- #
# This program 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; version 2 of the License. #
# #
# This program 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 this program; if not, write to the Free Software Foundation, Inc., 59 #
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
"""
Package to test the openlp.core.lib.projector.pjlink1 package.
"""
from unittest import TestCase
from mock import MagicMock, patch
from openlp.core.lib.projector.pjlink1 import PJLink1
from tests.resources.projector.data import TEST_PIN, TEST_SALT, TEST_CONNECT_AUTHENTICATE
pjlink_test = PJLink1(name='test', ip='127.0.0.1', pin=TEST_PIN, no_poll=True)
class TestPJLink(TestCase):
"""
Tests for the PJLink module
"""
@patch.object(pjlink_test, 'readyRead')
@patch.object(pjlink_test, 'send_command')
@patch.object(pjlink_test, 'waitForReadyRead')
@patch('openlp.core.common.qmd5_hash')
def authenticated_connection_call_test(self,
mock_qmd5_hash,
mock_waitForReadyRead,
mock_send_command,
mock_readyRead):
"""
Fix for projector connect with PJLink authentication exception. Ticket 92187.
"""
# GIVEN: Test object
pjlink = pjlink_test
# WHEN: Calling check_login with authentication request:
pjlink.check_login(data=TEST_CONNECT_AUTHENTICATE)
# THEN: Should have called qmd5_hash
self.assertTrue(mock_qmd5_hash.called_with(TEST_SALT,
"Connection request should have been called with TEST_SALT"))
self.assertTrue(mock_qmd5_hash.called_with(TEST_PIN,
"Connection request should have been called with TEST_PIN"))

View File

@ -29,6 +29,16 @@ from tempfile import gettempdir
# Test data # Test data
TEST_DB = os.path.join(gettempdir(), 'openlp-test-projectordb.sql') TEST_DB = os.path.join(gettempdir(), 'openlp-test-projectordb.sql')
TEST_SALT = '498e4a67'
TEST_PIN = 'JBMIAProjectorLink'
TEST_HASH = '5d8409bc1c3fa39749434aa3a5c38682'
TEST_CONNECT_AUTHENTICATE = 'PJLink 1 {salt}'.format(salt=TEST_SALT)
TEST_DB = os.path.join(gettempdir(), 'openlp-test-projectordb.sql')
TEST1_DATA = dict(ip='111.111.111.111', TEST1_DATA = dict(ip='111.111.111.111',
port='1111', port='1111',
pin='1111', pin='1111',
@ -49,3 +59,4 @@ TEST3_DATA = dict(ip='333.333.333.333',
name='___TEST_THREE___', name='___TEST_THREE___',
location='location three', location='location three',
notes='notes three') notes='notes three')