2015-04-24 17:01:36 +03:00
|
|
|
# Copyright (c) 2014 Yubico AB
|
|
|
|
# All rights reserved.
|
|
|
|
#
|
|
|
|
# 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, either version 3 of the License, or
|
|
|
|
# (at your option) any later version.
|
|
|
|
#
|
|
|
|
# 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, see <http://www.gnu.org/licenses/>.
|
|
|
|
#
|
|
|
|
# Additional permission under GNU GPL version 3 section 7
|
|
|
|
#
|
|
|
|
# If you modify this program, or any covered work, by linking or
|
|
|
|
# combining it with the OpenSSL project's OpenSSL library (or a
|
|
|
|
# modified version of that library), containing parts covered by the
|
|
|
|
# terms of the OpenSSL or SSLeay licenses, We grant you additional
|
|
|
|
# permission to convey the resulting work. Corresponding Source for a
|
|
|
|
# non-source form of such a combination shall include the source code
|
|
|
|
# for the parts of OpenSSL used as well as that of the covered work.
|
|
|
|
|
2015-04-27 16:18:16 +03:00
|
|
|
import sys
|
|
|
|
import argparse
|
|
|
|
from PySide import QtGui, QtCore
|
|
|
|
from yubioath import __version__ as version
|
2015-05-19 11:02:39 +03:00
|
|
|
from yubioath.yubicommon import qt
|
2015-05-26 16:15:32 +03:00
|
|
|
from ..cli.keystore import get_keystore
|
|
|
|
try:
|
|
|
|
from ..core.legacy_otp import ykpers_version
|
|
|
|
except ImportError:
|
|
|
|
ykpers_version = 'None'
|
|
|
|
from . import messages as m
|
|
|
|
from .controller import GuiController
|
|
|
|
from .view.codes import CodesWidget
|
2015-04-27 16:18:16 +03:00
|
|
|
|
|
|
|
|
2015-05-19 11:02:39 +03:00
|
|
|
ABOUT_TEXT = """
|
|
|
|
<h2>%s</h2>
|
|
|
|
%s<br>
|
|
|
|
%s
|
|
|
|
<h4>%s</h4>
|
|
|
|
%%s
|
|
|
|
<br><br>
|
|
|
|
""" % (m.app_name, m.copyright, m.version_1, m.libraries)
|
2015-04-27 16:18:16 +03:00
|
|
|
|
|
|
|
|
2015-05-19 11:02:39 +03:00
|
|
|
class MainWidget(QtGui.QStackedWidget):
|
2015-04-27 16:18:16 +03:00
|
|
|
|
2015-05-19 13:13:55 +03:00
|
|
|
def __init__(self, controller):
|
2015-05-19 11:02:39 +03:00
|
|
|
super(MainWidget, self).__init__()
|
2015-04-27 16:18:16 +03:00
|
|
|
|
2015-05-19 13:13:55 +03:00
|
|
|
self._controller = controller
|
|
|
|
|
2015-05-19 11:02:39 +03:00
|
|
|
self._build_ui()
|
2015-05-19 13:13:55 +03:00
|
|
|
controller.refreshed.connect(self._refresh)
|
2015-04-27 16:18:16 +03:00
|
|
|
|
2015-05-19 11:02:39 +03:00
|
|
|
def showEvent(self, event):
|
|
|
|
event.accept()
|
|
|
|
|
|
|
|
def _build_ui(self):
|
2015-05-19 13:13:55 +03:00
|
|
|
self.codes_widget = CodesWidget(self._controller)
|
|
|
|
self.no_key_widget = QtGui.QLabel(m.no_key)
|
|
|
|
self.addWidget(self.codes_widget)
|
|
|
|
self.addWidget(self.no_key_widget)
|
|
|
|
|
|
|
|
def _refresh(self):
|
|
|
|
if self._controller.credentials is None:
|
|
|
|
self.setCurrentIndex(1)
|
|
|
|
else:
|
|
|
|
self.setCurrentIndex(0)
|
2015-05-19 11:02:39 +03:00
|
|
|
|
|
|
|
|
|
|
|
class YubiOathApplication(qt.Application):
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
super(YubiOathApplication, self).__init__(m)
|
2015-04-27 16:18:16 +03:00
|
|
|
|
|
|
|
QtCore.QCoreApplication.setOrganizationName(m.organization)
|
|
|
|
QtCore.QCoreApplication.setOrganizationDomain(m.domain)
|
|
|
|
QtCore.QCoreApplication.setApplicationName(m.app_name)
|
|
|
|
|
2015-05-19 11:02:39 +03:00
|
|
|
self._widget = None
|
|
|
|
self._settings = {} # TODO get_store('window')
|
2015-04-27 16:18:16 +03:00
|
|
|
|
2015-05-19 13:13:55 +03:00
|
|
|
reader = self._settings.get('reader', 'Yubikey')
|
2015-05-26 12:45:10 +03:00
|
|
|
self._controller = GuiController(self, reader)
|
2015-05-19 11:02:39 +03:00
|
|
|
self._init_window()
|
|
|
|
|
|
|
|
def _init_window(self):
|
|
|
|
self.window.setWindowTitle(m.win_title_1 % version)
|
|
|
|
self.window.setWindowIcon(QtGui.QIcon(':/yubioath.png'))
|
2015-05-20 18:11:43 +03:00
|
|
|
self.window.resize(self._settings.get('size', QtCore.QSize(320, 340)))
|
2015-05-19 11:02:39 +03:00
|
|
|
|
|
|
|
self._build_menu_bar()
|
2015-04-27 16:18:16 +03:00
|
|
|
|
|
|
|
args = self._parse_args()
|
|
|
|
|
|
|
|
if args.tray:
|
|
|
|
pass
|
|
|
|
|
2015-05-19 11:02:39 +03:00
|
|
|
self.window.shown.connect(self._on_shown)
|
|
|
|
self.window.closed.connect(self._on_closed)
|
|
|
|
|
2015-04-27 16:18:16 +03:00
|
|
|
self.window.show()
|
|
|
|
self.window.raise_()
|
|
|
|
|
|
|
|
def _parse_args(self):
|
|
|
|
parser = argparse.ArgumentParser(description='Yubico Authenticator',
|
|
|
|
add_help=True)
|
|
|
|
parser.add_argument('-t', '--tray', action='store_true')
|
|
|
|
return parser.parse_args()
|
|
|
|
|
2015-05-19 11:02:39 +03:00
|
|
|
def _build_menu_bar(self):
|
|
|
|
file_menu = self.window.menuBar().addMenu(m.menu_file)
|
|
|
|
add_action = QtGui.QAction(m.action_add, file_menu)
|
|
|
|
add_action.triggered.connect(self._add_credential)
|
|
|
|
file_menu.addAction(add_action)
|
|
|
|
password_action = QtGui.QAction(m.action_password, file_menu)
|
|
|
|
password_action.triggered.connect(self._change_password)
|
|
|
|
file_menu.addAction(password_action)
|
|
|
|
settings_action = QtGui.QAction(m.action_settings, file_menu)
|
|
|
|
settings_action.triggered.connect(self._show_settings)
|
|
|
|
file_menu.addAction(settings_action)
|
|
|
|
|
|
|
|
help_menu = self.window.menuBar().addMenu(m.menu_help)
|
|
|
|
about_action = QtGui.QAction(m.action_about, help_menu)
|
|
|
|
about_action.triggered.connect(self._about)
|
|
|
|
help_menu.addAction(about_action)
|
|
|
|
|
|
|
|
def _on_shown(self):
|
|
|
|
if not self._widget:
|
2015-05-19 13:13:55 +03:00
|
|
|
self._widget = MainWidget(self._controller)
|
2015-05-19 11:02:39 +03:00
|
|
|
self.window.setCentralWidget(self._widget)
|
|
|
|
|
|
|
|
def _on_closed(self):
|
|
|
|
self._settings['size'] = self.window.size()
|
|
|
|
|
|
|
|
def _libversions(self):
|
|
|
|
return 'ykpers: %s' % ykpers_version
|
|
|
|
|
|
|
|
def _about(self):
|
|
|
|
QtGui.QMessageBox.about(self.window, m.about_1 % m.app_name,
|
|
|
|
ABOUT_TEXT % (version, self._libversions()))
|
|
|
|
|
|
|
|
def _add_credential(self):
|
|
|
|
print "TODO"
|
|
|
|
|
|
|
|
def _change_password(self):
|
|
|
|
print "TODO"
|
2015-04-27 16:18:16 +03:00
|
|
|
|
2015-05-19 11:02:39 +03:00
|
|
|
def _show_settings(self):
|
|
|
|
print "TODO"
|
2015-04-27 16:18:16 +03:00
|
|
|
|
2015-04-24 17:01:36 +03:00
|
|
|
|
|
|
|
def main():
|
2015-05-19 11:02:39 +03:00
|
|
|
app = YubiOathApplication()
|
|
|
|
sys.exit(app.exec_())
|