blob: 51ee6dfd2e6a23dfe5a75fe02683ada4a1c9c4aa [file] [log] [blame]
Jeremy Mowerya49e8ac2016-04-12 23:26:11 -07001import os
2import sys
3
Jeremy Mowery5acf7b92016-04-12 23:31:51 -07004from core.models import TenantPrivilege
Jeremy Mowery81e84cc2016-04-19 17:01:48 -07005from services.openvpn.models import OPENVPN_KIND, OpenVPNService, OpenVPNTenant
Jeremy Mowery53605442016-04-14 20:07:54 -07006from synchronizers.base.syncstep import DeferredException, SyncStep
Jeremy Mowerya49e8ac2016-04-12 23:26:11 -07007
8parentdir = os.path.join(os.path.dirname(__file__), "..")
9sys.path.insert(0, parentdir)
10
11
12class SyncTenantPrivilege(SyncStep):
Jeremy Mowery81e84cc2016-04-19 17:01:48 -070013 """Class for syncing a TenantPrivilege for a OpenVPNTenant.
Jeremy Mowery98e97d72016-04-15 00:05:27 -070014
Jeremy Mowery81e84cc2016-04-19 17:01:48 -070015 This SyncStep isolates the updated TenantPrivileges that are for OpenVPNTenants and performs
Jeremy Mowery98e97d72016-04-15 00:05:27 -070016 actions if the TenantPrivilege has been added or deleted. For added privileges a new client
Jeremy Mowery81e84cc2016-04-19 17:01:48 -070017 certificate and key are made, signed with the ca.crt file used by this OpenVPNTenant. For deleted
Jeremy Mowery98e97d72016-04-15 00:05:27 -070018 privileges the client certificate is revoked and the files associated are deleted. In both
Jeremy Mowery81e84cc2016-04-19 17:01:48 -070019 cases the associated OpenVPNTenant is saved causing the OpenVPNTenant synchronizer to run.
Jeremy Mowery98e97d72016-04-15 00:05:27 -070020 """
Jeremy Mowerya49e8ac2016-04-12 23:26:11 -070021 provides = [TenantPrivilege]
22 observes = TenantPrivilege
23 requested_interval = 0
24
25 def fetch_pending(self, deleted):
26 privs = super(SyncTenantPrivilege, self).fetch_pending(deleted)
Jeremy Mowery81e84cc2016-04-19 17:01:48 -070027 # Get only the TenantPrivileges that relate to OpenVPNTenants
28 privs = [priv for priv in privs if priv.tenant.kind == OPENVPN_KIND]
Jeremy Mowerya49e8ac2016-04-12 23:26:11 -070029 return privs
30
31 def sync_record(self, record):
Jeremy Mowery53605442016-04-14 20:07:54 -070032 if (not record.tenant.id):
33 raise DeferredException("Privilege waiting on VPN Tenant ID")
Jeremy Mowerya49e8ac2016-04-12 23:26:11 -070034 certificate = self.get_certificate_name(record)
Jeremy Mowery81e84cc2016-04-19 17:01:48 -070035 tenant = OpenVPNTenant.get_tenant_objects().filter(pk=record.tenant.id)[0]
Jeremy Mowery53605442016-04-14 20:07:54 -070036 if (not tenant):
37 raise DeferredException("Privilege waiting on VPN Tenant")
Jeremy Mowerya49e8ac2016-04-12 23:26:11 -070038 # Only add a certificate if ones does not yet exist
Jeremy Mowery81e84cc2016-04-19 17:01:48 -070039 pki_dir = OpenVPNService.get_pki_dir(tenant)
Jeremy Mowery53605442016-04-14 20:07:54 -070040 if (not os.path.isfile(pki_dir + "/issued/" + certificate + ".crt")):
Jeremy Mowery81e84cc2016-04-19 17:01:48 -070041 OpenVPNService.execute_easyrsa_command(
Jeremy Mowery53605442016-04-14 20:07:54 -070042 pki_dir, "build-client-full " + certificate + " nopass")
Jeremy Mowerya49e8ac2016-04-12 23:26:11 -070043 tenant.save()
44 record.save()
45
46 def delete_record(self, record):
Jeremy Mowery53605442016-04-14 20:07:54 -070047 if (not record.tenant.id):
48 return
Jeremy Mowerya49e8ac2016-04-12 23:26:11 -070049 certificate = self.get_certificate_name(record)
Jeremy Mowery81e84cc2016-04-19 17:01:48 -070050 tenant = OpenVPNTenant.get_tenant_objects().filter(pk=record.tenant.id)[0]
Jeremy Mowery53605442016-04-14 20:07:54 -070051 if (not tenant):
52 return
Jeremy Mowerya49e8ac2016-04-12 23:26:11 -070053 # If the client has already been reovked don't do it again
Jeremy Mowery81e84cc2016-04-19 17:01:48 -070054 pki_dir = OpenVPNService.get_pki_dir(tenant)
Jeremy Mowery53605442016-04-14 20:07:54 -070055 if (os.path.isfile(pki_dir + "/issued/" + certificate + ".crt")):
Jeremy Mowery81e84cc2016-04-19 17:01:48 -070056 OpenVPNService.execute_easyrsa_command(
Jeremy Mowery53605442016-04-14 20:07:54 -070057 pki_dir, "revoke " + certificate)
Jeremy Mowerya49e8ac2016-04-12 23:26:11 -070058 # Revoking a client cert does not delete any of the files
59 # to make sure that we can add this user again we need to
60 # delete all of the files created by easyrsa
Jeremy Mowery53605442016-04-14 20:07:54 -070061 os.remove(pki_dir + "/issued/" + certificate + ".crt")
62 os.remove(pki_dir + "/private/" + certificate + ".key")
63 os.remove(pki_dir + "/reqs/" + certificate + ".req")
Jeremy Mowerya49e8ac2016-04-12 23:26:11 -070064 tenant.save()
65
66 record.delete()
67
68 def get_certificate_name(self, tenant_privilege):
Jeremy Mowery98e97d72016-04-15 00:05:27 -070069 """Gets the name of a certificate for the given TenantPrivilege
70
71 Parameters:
72 tenant_privilege (core.models.TenantPrivilege): The TenantPrivilege to use to generate
73 the certificate name.
74
75 Returns:
76 str: The certificate name.
Jeremy Mowery0ee0bfc2016-04-15 16:13:45 -070077 """
Jeremy Mowerya49e8ac2016-04-12 23:26:11 -070078 return (str(tenant_privilege.user.email) +
79 "-" + str(tenant_privilege.tenant.id))