Ejemplo n.º 1
0
    def sync_fields(self, o, fields):
        pki_dir = OpenVPNService.get_pki_dir(o)

        if (not os.path.isdir(pki_dir)):
            OpenVPNService.execute_easyrsa_command(pki_dir, "init-pki")
            OpenVPNService.execute_easyrsa_command(
                pki_dir, "--req-cn=XOS build-ca nopass")

        # Very hacky way to handle VPNs that need to share CAs
        if (o.use_ca_from_id):
            tenant = OpenVPNTenant.get_tenant_objects().filter(
                pk=o.use_ca_from_id)[0]
            other_pki_dir = OpenVPNService.get_pki_dir(tenant)
            shutil.copy2(other_pki_dir + "/ca.crt", pki_dir)
            shutil.copy2(other_pki_dir + "/private/ca.key",
                         pki_dir + "/private")

        # If the server has to be built then we need to build it
        if (not os.path.isfile(pki_dir + "/issued/server.crt")):
            OpenVPNService.execute_easyrsa_command(
                pki_dir, "build-server-full server nopass")
            OpenVPNService.execute_easyrsa_command(pki_dir, "gen-dh")

        # Get the most recent list of revoked clients
        OpenVPNService.execute_easyrsa_command(pki_dir, "gen-crl")

        # Super runs the playbook
        super(SyncOpenVPNTenant, self).sync_fields(o, fields)
Ejemplo n.º 2
0
    def sync_fields(self, o, fields):
        pki_dir = OpenVPNService.get_pki_dir(o)

        if (not os.path.isdir(pki_dir)):
            OpenVPNService.execute_easyrsa_command(pki_dir, "init-pki")
            OpenVPNService.execute_easyrsa_command(
                pki_dir, "--req-cn=XOS build-ca nopass")

        # Very hacky way to handle VPNs that need to share CAs
        if (o.use_ca_from_id):
            tenant = OpenVPNTenant.get_tenant_objects().filter(
                pk=o.use_ca_from_id)[0]
            other_pki_dir = OpenVPNService.get_pki_dir(tenant)
            shutil.copy2(other_pki_dir + "/ca.crt", pki_dir)
            shutil.copy2(other_pki_dir + "/private/ca.key",
                         pki_dir + "/private")

        # If the server has to be built then we need to build it
        if (not os.path.isfile(pki_dir + "/issued/server.crt")):
            OpenVPNService.execute_easyrsa_command(
                pki_dir, "build-server-full server nopass")
            OpenVPNService.execute_easyrsa_command(pki_dir, "gen-dh")

        # Get the most recent list of revoked clients
        OpenVPNService.execute_easyrsa_command(pki_dir, "gen-crl")

        # Super runs the playbook
        super(SyncOpenVPNTenant, self).sync_fields(o, fields)
Ejemplo n.º 3
0
    def get_script_text(self, obj):
        """Gets the text of the client script for the requesting user.

        Parameters:
            obj (services.openvpn.models.OpenVPNTenant): The OpenVPNTenant to connect to.

        Returns:
            str: The client script as a str.
        """
        env = jinja2.Environment(
            loader=jinja2.FileSystemLoader("/opt/xos/services/openvpn/templates"))
        template = env.get_template("connect.vpn.j2")
        client_name = self.context['request'].user.email + "-" + str(obj.id)
        remote_ids = list(obj.failover_server_ids)
        remote_ids.insert(0, obj.id)
        remotes = OpenVPNTenant.get_tenant_objects().filter(pk__in=remote_ids)
        pki_dir = OpenVPNService.get_pki_dir(obj)
        fields = {"client_name": client_name,
                  "remotes": remotes,
                  "is_persistent": obj.is_persistent,
                  "ca_crt": obj.get_ca_crt(pki_dir),
                  "client_crt": obj.get_client_cert(client_name, pki_dir),
                  "client_key": obj.get_client_key(client_name, pki_dir)
                  }
        return template.render(fields)
Ejemplo n.º 4
0
    def get_script_text(self, obj):
        """Gets the text of the client script for the requesting user.

        Parameters:
            obj (services.openvpn.models.OpenVPNTenant): The OpenVPNTenant to connect to.

        Returns:
            str: The client script as a str.
        """
        env = jinja2.Environment(loader=jinja2.FileSystemLoader(
            "/opt/xos/services/openvpn/templates"))
        template = env.get_template("connect.vpn.j2")
        client_name = self.context['request'].user.email + "-" + str(obj.id)
        remote_ids = list(obj.failover_server_ids)
        remote_ids.insert(0, obj.id)
        remotes = OpenVPNTenant.get_tenant_objects().filter(pk__in=remote_ids)
        pki_dir = OpenVPNService.get_pki_dir(obj)
        fields = {
            "client_name": client_name,
            "remotes": remotes,
            "is_persistent": obj.is_persistent,
            "ca_crt": obj.get_ca_crt(pki_dir),
            "client_crt": obj.get_client_cert(client_name, pki_dir),
            "client_key": obj.get_client_key(client_name, pki_dir)
        }
        return template.render(fields)
Ejemplo n.º 5
0
 def get_extra_attributes(self, tenant):
     return {
         "is_persistent": tenant.is_persistent,
         "vpn_subnet": tenant.vpn_subnet,
         "server_network": tenant.server_network,
         "clients_can_see_each_other": (tenant.clients_can_see_each_other),
         "port_number": tenant.port_number,
         "protocol": tenant.protocol,
         "pki_dir": OpenVPNService.get_pki_dir(tenant)
     }
Ejemplo n.º 6
0
 def get_extra_attributes(self, tenant):
     return {"is_persistent": tenant.is_persistent,
             "vpn_subnet": tenant.vpn_subnet,
             "server_network": tenant.server_network,
             "clients_can_see_each_other": (
                 tenant.clients_can_see_each_other),
             "port_number": tenant.port_number,
             "protocol": tenant.protocol,
             "pki_dir": OpenVPNService.get_pki_dir(tenant)
             }
Ejemplo n.º 7
0
 def sync_record(self, record):
     if (not record.tenant.id):
         raise DeferredException("Privilege waiting on VPN Tenant ID")
     certificate = self.get_certificate_name(record)
     tenant = OpenVPNTenant.get_tenant_objects().filter(pk=record.tenant.id)[0]
     if (not tenant):
         raise DeferredException("Privilege waiting on VPN Tenant")
     # Only add a certificate if ones does not yet exist
     pki_dir = OpenVPNService.get_pki_dir(tenant)
     if (not os.path.isfile(pki_dir + "/issued/" + certificate + ".crt")):
         OpenVPNService.execute_easyrsa_command(
             pki_dir, "build-client-full " + certificate + " nopass")
         tenant.save()
     record.save()
 def sync_record(self, record):
     if (not record.tenant.id):
         raise DeferredException("Privilege waiting on VPN Tenant ID")
     certificate = self.get_certificate_name(record)
     tenant = OpenVPNTenant.get_tenant_objects().filter(
         pk=record.tenant.id)[0]
     if (not tenant):
         raise DeferredException("Privilege waiting on VPN Tenant")
     # Only add a certificate if ones does not yet exist
     pki_dir = OpenVPNService.get_pki_dir(tenant)
     if (not os.path.isfile(pki_dir + "/issued/" + certificate + ".crt")):
         OpenVPNService.execute_easyrsa_command(
             pki_dir, "build-client-full " + certificate + " nopass")
         tenant.save()
     record.save()
Ejemplo n.º 9
0
    def delete_record(self, record):
        if (not record.tenant.id):
            return
        certificate = self.get_certificate_name(record)
        tenant = OpenVPNTenant.get_tenant_objects().filter(pk=record.tenant.id)[0]
        if (not tenant):
            return
        # If the client has already been reovked don't do it again
        pki_dir = OpenVPNService.get_pki_dir(tenant)
        if (os.path.isfile(pki_dir + "/issued/" + certificate + ".crt")):
            OpenVPNService.execute_easyrsa_command(
                pki_dir, "revoke " + certificate)
            # Revoking a client cert does not delete any of the files
            # to make sure that we can add this user again we need to
            # delete all of the files created by easyrsa
            os.remove(pki_dir + "/issued/" + certificate + ".crt")
            os.remove(pki_dir + "/private/" + certificate + ".key")
            os.remove(pki_dir + "/reqs/" + certificate + ".req")
            tenant.save()

        record.delete()
    def delete_record(self, record):
        if (not record.tenant.id):
            return
        certificate = self.get_certificate_name(record)
        tenant = OpenVPNTenant.get_tenant_objects().filter(
            pk=record.tenant.id)[0]
        if (not tenant):
            return
        # If the client has already been reovked don't do it again
        pki_dir = OpenVPNService.get_pki_dir(tenant)
        if (os.path.isfile(pki_dir + "/issued/" + certificate + ".crt")):
            OpenVPNService.execute_easyrsa_command(pki_dir,
                                                   "revoke " + certificate)
            # Revoking a client cert does not delete any of the files
            # to make sure that we can add this user again we need to
            # delete all of the files created by easyrsa
            os.remove(pki_dir + "/issued/" + certificate + ".crt")
            os.remove(pki_dir + "/private/" + certificate + ".key")
            os.remove(pki_dir + "/reqs/" + certificate + ".req")
            tenant.save()

        record.delete()