示例#1
0
    def buildInterface(self, config):

        fqdn_tooltip = tr("IP address, FQDN or Hostname")

        self.controller_ip = QLineEdit()
        self.texts.add(self.controller_ip)
        self.connect(self.controller_ip, SIGNAL('textChanged(QString)'), self.setControllerIp)
        self.form.addRow(tr('Authentication server'), self.controller_ip)
        self.controller_ip.setToolTip(help_ps_tooltip)
        self.connect(self.controller_ip, SIGNAL('returnPressed()'), self.signalModified)

        self.ps_message_area = MessageArea()
        self.empty_ps_label = QLabel()
        self.form.addRow(self.empty_ps_label, self.ps_message_area)
        self.empty_ps_label.hide()
        self.ps_message_area.hide()
        self.ps_message_area.setMessage(help_ps_title, help_ps_message_area)

        self.wins_ip = IpOrHostnameOrFqdnEdit(accept_empty=True)
        self.texts.add(self.wins_ip)
        self.connect(self.wins_ip, SIGNAL('textChanged(QString)'), self.setWinsIp)
        self.form.addRow(tr('WINS server (optional)'), self.wins_ip)
        self.wins_ip.setToolTip(
            "%s\n%s" % (
                fqdn_tooltip, tr("This field is useful if the AD and EdenWall appliances don't share the same subnet")
            )
        )
        self.connect(self.wins_ip, SIGNAL('returnPressed()'), self.signalModified)

        for args in (
            ('domain', tr('Active Directory Domain'), self.setDomain),
            ('dns_domain', tr('Active Directory DNS Domain (if different from the AD domain)'), self.setDNSDomain),
            ('workgroup', tr('Workgroup (optional)'), self.setWorkgroup)
        ):
            setattr(self, args[0], self.addTextInput(*args[1:]))
            #flagWriteAccess(text_input)


        self.netbios_name = QLabel()
        self.form.addRow(tr("Netbios name"), self.netbios_name)

        for args in (
            ('user', tr('Name used to join the domain'), self.setUser),
            ('password', tr('Password used to join the domain'), self.setPassword, False)
        ):
            setattr(self, args[0], self.addTextInput(*args[1:]))
            #flagWriteAccess(text_input)

        #flagWriteAccess(password_server)
        self.connect(self.controller_ip, SIGNAL('textEdited(QString)'), self.helpPS)
        self.connect(self.controller_ip, SIGNAL('editingFinished()'), self.noHelpPS)

        self.ad_status = ADStatus()
        self.form.addRow('', self.ad_status)
示例#2
0
    def _buildGui(self):
        frame = QFrame()
        layout = QVBoxLayout(frame)
        layout.addWidget(QLabel(tr("<H1>Mobile VPN</H1>")))

        self.activation_box = QGroupBox(tr("Feature Activation"))
        self.activation = QGridLayout(self.activation_box)

        # enabled checkbox:
        self.enabledCheckBox = QCheckBox()
        self.mainwindow.writeAccessNeeded(self.enabledCheckBox)
        self.connect(self.enabledCheckBox, SIGNAL('toggled(bool)'),
                     self.setEnabled)
        self.enabledLabel = QLabel(tr('Enable Mobile VPN'))
        self.activation.addWidget(self.enabledLabel, 0, 0)
        self.activation.addWidget(self.enabledCheckBox, 0, 1)
        layout.addWidget(self.activation_box)

        options_box = QGroupBox(tr("Network Configuration"))
        options = QFormLayout(options_box)

        self.serverIpEdit = IpOrHostnameOrFqdnEdit()
        self.connect(self.serverIpEdit, SIGNAL('editingFinished()'),
                     self.setServer)

        self.protocolComboBox = QComboBox()
        self.protocolComboBox.addItem('tcp')
        self.protocolComboBox.addItem('udp')
        self.connect(self.protocolComboBox,
                     SIGNAL('currentIndexChanged(QString)'), self.setProtocol)

        self.portEdit = PortEdit()
        self.connect(self.portEdit, SIGNAL('editingFinished()'), self.setPort)

        self.clientNetNetworkEdit = NetworkEdit()
        self.connect(self.clientNetNetworkEdit, SIGNAL('editingFinished()'),
                     self.setClientNetwork)

        self.redirectCheckBox = QCheckBox()
        self.connect(self.redirectCheckBox, SIGNAL('toggled(bool)'),
                     self.setRedirect)

        options.addRow(tr("Server public address (for client configuration)"),
                       self.serverIpEdit)
        options.addRow(tr("Protocol"), self.protocolComboBox)
        options.addRow(tr("Port"), self.portEdit)
        options.addRow(tr("Virtual network address of VPN clients"), self.clientNetNetworkEdit)
        options.addRow(tr("Redirect default gateway through the VPN"),
                       self.redirectCheckBox)

        self.pushed_routes = self._mkPushedRoutes(5)
        options.addRow(QLabel(tr("This VPN's routed networks")))
        options.addRow(self.pushed_routes)
        self.connect(self.pushed_routes, SIGNAL('textChanged()'), self.setModified)
        self.connect(self.pushed_routes, SIGNAL('textChanged()'), self.setPushedRoutes)

        layout.addWidget(options_box)

        self.pki_embed = PkiEmbedWidget(self.client, self, "openvpn", PkiEmbedWidget.SHOW_ALL | PkiEmbedWidget.CRL_OPTIONAL, self.setModified)
        layout.addWidget(self.pki_embed)

        self.mainwindow.writeAccessNeeded(
            self.serverIpEdit, self.protocolComboBox, self.portEdit,
            self.clientNetNetworkEdit, self.redirectCheckBox,
            self.pushed_routes, self.pki_embed)

        getClientConfigButton = QPushButton(tr('Get client configuration'))
        self.connect(getClientConfigButton, SIGNAL('clicked()'),
                     self.getClientConfig)
        layout.addWidget(getClientConfigButton)


        layout.addStretch()

        self.setWidget(frame)
        self.setWidgetResizable(True)
示例#3
0
class ADBaseWidget(DirectoryWidget):
    def __init__(self, config, specific_config, mainwindow, parent=None):
        DirectoryWidget.__init__(self, config, specific_config, mainwindow, parent=None)
        self.qhostname_object = QHostnameObject.getInstance()
        self.buildInterface(config)
        self.updateView()
        self._poll()

    def register_qobjects(self):
        self.qhostname_object.registerCallbacks(
            self.acceptHostnameChange,
            self.handleHostnameChange,
            attach=self
            )

    def _poll(self):
        self.ad_status.fetch_data(self.mainwindow.client)
        timer = QTimer()
        timer.setSingleShot(True)
        timer.setInterval(20000) # ms
        timer.start()
        self.connect(timer, SIGNAL('timeout()'), self._poll)
        self.connect(self, SIGNAL('destroyed()'), timer.stop)

    def unregister_qobjects(self):
        self.qhostname_object.forget(self)

    def updateView(self, config=None):
        if config is None:
            config = self.specific_config
        self.setText(self.controller_ip, config.controller_ip)
        self.setDefaultText(self.user, config.user)
        self.setDefaultText(self.password, config.password)
        self.setDefaultText(self.workgroup, config.workgroup)
        self.setDefaultText(self.domain, config.domain)
        self.setDefaultText(self.dns_domain, config.dns_domain)
        self.setText(self.wins_ip, config.wins_ip)
        self.displayHostname()

    def acceptHostnameChange(self):
        button = QMessageBox.warning(
            self,
            tr("Hostname change"),
            tr("Warning: this hostname change will cause the appliance to register again on Active Directory."),
            QMessageBox.Cancel | QMessageBox.Ok

        )
        if button == QMessageBox.Ok:
            self.signalModified()
            return True

        return False

    def handleHostnameChange(self):
        self.displayHostname()

    def displayHostname(self):
        self.netbios_name.setText(u"<b>%s</b>" % unicode(self.qhostname_object.hostnamecfg.hostname))

    def buildInterface(self, config):

        fqdn_tooltip = tr("IP address, FQDN or Hostname")

        self.controller_ip = QLineEdit()
        self.texts.add(self.controller_ip)
        self.connect(self.controller_ip, SIGNAL('textChanged(QString)'), self.setControllerIp)
        self.form.addRow(tr('Authentication server'), self.controller_ip)
        self.controller_ip.setToolTip(help_ps_tooltip)
        self.connect(self.controller_ip, SIGNAL('returnPressed()'), self.signalModified)

        self.ps_message_area = MessageArea()
        self.empty_ps_label = QLabel()
        self.form.addRow(self.empty_ps_label, self.ps_message_area)
        self.empty_ps_label.hide()
        self.ps_message_area.hide()
        self.ps_message_area.setMessage(help_ps_title, help_ps_message_area)

        self.wins_ip = IpOrHostnameOrFqdnEdit(accept_empty=True)
        self.texts.add(self.wins_ip)
        self.connect(self.wins_ip, SIGNAL('textChanged(QString)'), self.setWinsIp)
        self.form.addRow(tr('WINS server (optional)'), self.wins_ip)
        self.wins_ip.setToolTip(
            "%s\n%s" % (
                fqdn_tooltip, tr("This field is useful if the AD and EdenWall appliances don't share the same subnet")
            )
        )
        self.connect(self.wins_ip, SIGNAL('returnPressed()'), self.signalModified)

        for args in (
            ('domain', tr('Active Directory Domain'), self.setDomain),
            ('dns_domain', tr('Active Directory DNS Domain (if different from the AD domain)'), self.setDNSDomain),
            ('workgroup', tr('Workgroup (optional)'), self.setWorkgroup)
        ):
            setattr(self, args[0], self.addTextInput(*args[1:]))
            #flagWriteAccess(text_input)


        self.netbios_name = QLabel()
        self.form.addRow(tr("Netbios name"), self.netbios_name)

        for args in (
            ('user', tr('Name used to join the domain'), self.setUser),
            ('password', tr('Password used to join the domain'), self.setPassword, False)
        ):
            setattr(self, args[0], self.addTextInput(*args[1:]))
            #flagWriteAccess(text_input)

        #flagWriteAccess(password_server)
        self.connect(self.controller_ip, SIGNAL('textEdited(QString)'), self.helpPS)
        self.connect(self.controller_ip, SIGNAL('editingFinished()'), self.noHelpPS)

        self.ad_status = ADStatus()
        self.form.addRow('', self.ad_status)

    def helpPS(self, text):
        self.ps_message_area.show()

    def noHelpPS(self):
        self.controller_ip.setText(
            unicode(
                self.controller_ip.text()
                ).strip()
            )
        self.ps_message_area.hide()

    def setControllerIp(self, server):
        self.specific_config.controller_ip = unicode(server).strip()
        self.signalModified()

    def setWinsIp(self, server):
        self.specific_config.wins_ip = unicode(server)
        self.signalModified()

    def setDomain(self, domain):
        self.specific_config.domain = domain

    def setDNSDomain(self, domain):
        self.specific_config.dns_domain = domain

    def setUser(self, user):
        self.specific_config.user = user

    def setPassword(self, password):
        self.specific_config.password = password

    def setWorkgroup(self, workgroup):
        self.specific_config.workgroup = workgroup

    def signalModified(self):
        self.config.org = self.specific_config
        DirectoryWidget.signalModified(self)
示例#4
0
class RoadWarriorFrontend(ScrollArea):
    COMPONENT = 'openvpn'
    LABEL = tr('Mobile VPN')
    REQUIREMENTS = ('openvpn',)
    ICON = ':/icons/vpn.png'

    def __init__(self, client, parent):
        ScrollArea.__init__(self)
        if not EDENWALL:
            raise NuConfModuleDisabled("Roadwarrior")
        self.loaded_done = False
        self.mainwindow = parent
        self.client = client
        self.modified = False
        self.error_message = ''
        self._buildGui()

        self.qopenvpnobject = QOpenVpnObject.getInstance()
        self.qopenvpnobject.openvpn = self.client.call('openvpn',
                                                       'getOpenVpnConfig')

        # FIXME: Remove isValid() or call it more even?
        self.isValid()

        self.resetConf()

    def _buildGui(self):
        frame = QFrame()
        layout = QVBoxLayout(frame)
        layout.addWidget(QLabel(tr("<H1>Mobile VPN</H1>")))

        self.activation_box = QGroupBox(tr("Feature Activation"))
        self.activation = QGridLayout(self.activation_box)

        # enabled checkbox:
        self.enabledCheckBox = QCheckBox()
        self.mainwindow.writeAccessNeeded(self.enabledCheckBox)
        self.connect(self.enabledCheckBox, SIGNAL('toggled(bool)'),
                     self.setEnabled)
        self.enabledLabel = QLabel(tr('Enable Mobile VPN'))
        self.activation.addWidget(self.enabledLabel, 0, 0)
        self.activation.addWidget(self.enabledCheckBox, 0, 1)
        layout.addWidget(self.activation_box)

        options_box = QGroupBox(tr("Network Configuration"))
        options = QFormLayout(options_box)

        self.serverIpEdit = IpOrHostnameOrFqdnEdit()
        self.connect(self.serverIpEdit, SIGNAL('editingFinished()'),
                     self.setServer)

        self.protocolComboBox = QComboBox()
        self.protocolComboBox.addItem('tcp')
        self.protocolComboBox.addItem('udp')
        self.connect(self.protocolComboBox,
                     SIGNAL('currentIndexChanged(QString)'), self.setProtocol)

        self.portEdit = PortEdit()
        self.connect(self.portEdit, SIGNAL('editingFinished()'), self.setPort)

        self.clientNetNetworkEdit = NetworkEdit()
        self.connect(self.clientNetNetworkEdit, SIGNAL('editingFinished()'),
                     self.setClientNetwork)

        self.redirectCheckBox = QCheckBox()
        self.connect(self.redirectCheckBox, SIGNAL('toggled(bool)'),
                     self.setRedirect)

        options.addRow(tr("Server public address (for client configuration)"),
                       self.serverIpEdit)
        options.addRow(tr("Protocol"), self.protocolComboBox)
        options.addRow(tr("Port"), self.portEdit)
        options.addRow(tr("Virtual network address of VPN clients"), self.clientNetNetworkEdit)
        options.addRow(tr("Redirect default gateway through the VPN"),
                       self.redirectCheckBox)

        self.pushed_routes = self._mkPushedRoutes(5)
        options.addRow(QLabel(tr("This VPN's routed networks")))
        options.addRow(self.pushed_routes)
        self.connect(self.pushed_routes, SIGNAL('textChanged()'), self.setModified)
        self.connect(self.pushed_routes, SIGNAL('textChanged()'), self.setPushedRoutes)

        layout.addWidget(options_box)

        self.pki_embed = PkiEmbedWidget(self.client, self, "openvpn", PkiEmbedWidget.SHOW_ALL | PkiEmbedWidget.CRL_OPTIONAL, self.setModified)
        layout.addWidget(self.pki_embed)

        self.mainwindow.writeAccessNeeded(
            self.serverIpEdit, self.protocolComboBox, self.portEdit,
            self.clientNetNetworkEdit, self.redirectCheckBox,
            self.pushed_routes, self.pki_embed)

        getClientConfigButton = QPushButton(tr('Get client configuration'))
        self.connect(getClientConfigButton, SIGNAL('clicked()'),
                     self.getClientConfig)
        layout.addWidget(getClientConfigButton)


        layout.addStretch()

        self.setWidget(frame)
        self.setWidgetResizable(True)

    def _mkPushedRoutes(self, lines):
        pushed_routes = NetworkListEdit()
        pushed_routes.setMaximumHeight(
            pushed_routes.fontMetrics().height() * lines
            )
        return pushed_routes

    def loaded(self):
        self.loaded_done = True

    def isLoaded(self):
        return self.loaded_done

    def isModified(self):
        return self.modified

    def isValid(self):
        valid, msg = self.qopenvpnobject.openvpn.isValidWithMsg()
        if msg is not None:
            self.error_message = msg

        cert_validity = self.pki_embed.validate()
        if cert_validity is not None:
            if msg is None:
                self.error_message = ''
            self.error_message += '<br/>' + cert_validity + '<br/>'
            self.mainwindow.addToInfoArea(cert_validity, category=COLOR_ERROR)
            valid = False
        return valid

    def resetConf(self):
        self.qopenvpnobject.openvpn = self.client.call('openvpn',
                                                       'getOpenVpnConfig')
        self.serverIpEdit.setText(unicode(self.qopenvpnobject.openvpn.server))
        self.portEdit.setText(unicode(self.qopenvpnobject.openvpn.port))
        index = self.protocolComboBox.findText(
            unicode(self.qopenvpnobject.openvpn.protocol))
        if index != -1:
            self.protocolComboBox.setCurrentIndex(index)
        self.clientNetNetworkEdit.setText(
            self.qopenvpnobject.openvpn.client_network)
        for input_widget in (self.serverIpEdit, self.portEdit):
            input_widget.validColor()
        if self.qopenvpnobject.openvpn.enabled:
            self.enabledCheckBox.setChecked(self.qopenvpnobject.openvpn.enabled)
        self.redirectCheckBox.setChecked(self.qopenvpnobject.openvpn.redirect)

        # Certificates configuration
        ssl_conf = self.qopenvpnobject.openvpn.getSSLDict()
        self.pki_embed.setConfig(ssl_conf)

        pushed_routes = self.qopenvpnobject.openvpn.manual_pushed_routes
        self.pushed_routes.clear()
        for net in pushed_routes:
            self.pushed_routes.append("%s\n" % net)

        self.setModified(False)

    def saveConf(self, message):
        conf = self.pki_embed.getConfig()
        self.qopenvpnobject.openvpn.setSSLDict(conf)

        serialized = self.qopenvpnobject.openvpn.serialize(downgrade=True)
        self.client.call("openvpn", 'setOpenVpnConfig', serialized, message)

    def setModified(self, isModified=True, message=u""):
        if isModified:
            self.modified = True
            self.mainwindow.setModified(self, True)
            if message:
                self.mainwindow.addToInfoArea(unicode(message))
            if self.isLoaded():
                self.qopenvpnobject.post_modify()
        else:
            self.modified = False

    def error(self, message):
        self.mainwindow.addToInfoArea(message, category=COLOR_ERROR)

    def getClientConfig(self):
        filename = QFileDialog.getSaveFileName(self, tr('Select a destination'),
                                               QString(u'client.ovpn'))
        if not filename:
            return
        async = self.client.async()
        self.desc = tr('Client configuration')
        async.call(
            "openvpn", 'getClientConfig',
            callback = self.successDiag,
            errback = self.errorDiag,
            callbackArgs=(filename, self.desc)
        )
    def successDiag(self, file_, filename, desc):
        with open(filename, 'wb') as fd:
            fd.write(decodeFileContent(file_))
        self.mainwindow.addToInfoArea(tr("%s saved in '%s'.") % (desc,
                                                                 filename))
    def errorDiag(self, error):
        self.mainwindow.addToInfoArea(tr("Fetching %s failed.") % self.desc)
        warning = QMessageBox(self)
        warning.setWindowTitle(tr('Fetching diagnostic failed'))
        warning.setText(tr('An error has occurred while fetching %s.') %
                        self.desc)
        warning.setDetailedText(exceptionAsUnicode(error))
        warning.setIcon(QMessageBox.Warning)
        warning.exec_()

    def setEnabled(self, value):
        if value != self.qopenvpnobject.openvpn.enabled:
            self.qopenvpnobject.openvpn.setEnabled(value)
            self.setModified()
    def setServer(self):
        value = self.serverIpEdit.text()
        if value != self.qopenvpnobject.openvpn.server:
            self.qopenvpnobject.openvpn.setServer(value)
            self.setModified()
    def setPort(self):
        value = self.portEdit.text()
        if value != self.qopenvpnobject.openvpn.port:
            self.qopenvpnobject.openvpn.setPort(value)
            self.setModified()
    def setProtocol(self, value):
        if value != self.qopenvpnobject.openvpn.protocol:
            self.qopenvpnobject.openvpn.setProtocol(value)
            self.setModified()
    def setClientNetwork(self):
        value = self.clientNetNetworkEdit.text()
        if value != self.qopenvpnobject.openvpn.client_network:
            self.qopenvpnobject.openvpn.setClientNetwork(value)
            self.setModified()
    def setRedirect(self, value):
        if value != self.qopenvpnobject.openvpn.redirect:
            self.qopenvpnobject.openvpn.setRedirect(value)
            self.setModified()

        #disable pushed_routes when redirecting default gw
        enable = (not value) and (not self.mainwindow.isReadOnly())
        self.pushed_routes.setEnabled(enable)

    def setPushedRoutes(self):
        if self.pushed_routes.isValid():
            pushed_routes = tuple(self.pushed_routes.value())
            self.qopenvpnobject.openvpn.manual_pushed_routes = pushed_routes

    def onApplyFinished(self):
        self.pki_embed.feed()