diff --git a/master/bt5/slapos_cloud/DocumentTemplateItem/portal_components/document.erp5.Person.py b/master/bt5/slapos_cloud/DocumentTemplateItem/portal_components/document.erp5.Person.py index a44fd7386e58576010ca042b049af85f2ea4c406..50d997b22bca2c14166eaa6e15060b55211f77e8 100644 --- a/master/bt5/slapos_cloud/DocumentTemplateItem/portal_components/document.erp5.Person.py +++ b/master/bt5/slapos_cloud/DocumentTemplateItem/portal_components/document.erp5.Person.py @@ -2,9 +2,16 @@ from AccessControl import ClassSecurityInfo, Unauthorized, getSecurityManager from Products.ERP5.Document.Person import Person as ERP5Person from Products.ERP5Type import Permissions +class UserCertificateNotFound(Exception): + """Exception raised when certificate is not found""" + pass + +class UserCertificateFound(Exception): + """Exception raised when certificate is found""" + pass + class Person(ERP5Person): security = ClassSecurityInfo() - security.declarePublic('getCertificate') def _checkCertificateRequest(self): try: @@ -19,24 +26,46 @@ class Person(ERP5Person): if getSecurityManager().getUser().getId() != reference: raise - def _getCertificate(self): - return self.getPortalObject().portal_certificate_authority\ - .getNewCertificate(self.getReference()) + security.declarePublic('signCertificate') + def signCertificate(self, csr): + """Send csr for certificate signature""" + self._checkCertificateRequest() + if self.getDestinationReference(): + raise UserCertificateFound("A Certificate already exists, please revoke it first!") + ca_service = self.getPortalObject().portal_web_services.caucase_adapter + csr_id = ca_service.putCertificateSigningRequest(csr) - def _revokeCertificate(self): - return self.getPortalObject().portal_certificate_authority\ - .revokeCertificateByCommonName(self.getReference()) + # Sign the csr immediately + crt_id, url = ca_service.signCertificate(csr_id) + self.setDestinationReference(crt_id) + return crt_id, url + security.declarePublic('getCertificate') def getCertificate(self): - """Returns new SSL certificate""" + """Returns existing SSL certificate""" self._checkCertificateRequest() - return self._getCertificate() + crt_id = self.getDestinationReference() + if crt_id: + return self.getPortalObject().portal_web_services.caucase_adapter\ + .getCertificate(crt_id) + raise UserCertificateNotFound( + "No certificate set for the user %s" % self.getReference() + ) security.declarePublic('revokeCertificate') def revokeCertificate(self): """Revokes existing certificate""" self._checkCertificateRequest() - self._revokeCertificate() + crt_id = self.getDestinationReference() + if crt_id: + response = self.getPortalObject().portal_web_services.caucase_adapter\ + .revokeCertificate(crt_id) + # Remove Destination Reference + self.setDestinationReference("") + return response.read() + raise UserCertificateNotFound( + "No certificate set for the user %s" % self.getReference() + ) security.declareProtected(Permissions.AccessContentsInformation, 'getTitle') diff --git a/master/bt5/slapos_cloud/DocumentTemplateItem/portal_components/document.erp5.Person.xml b/master/bt5/slapos_cloud/DocumentTemplateItem/portal_components/document.erp5.Person.xml index bec0fd0c8a8919c7fdce09c7b2c76e20469f7478..96a1300ab1fcecffc4307c04753605debcfdd329 100644 --- a/master/bt5/slapos_cloud/DocumentTemplateItem/portal_components/document.erp5.Person.xml +++ b/master/bt5/slapos_cloud/DocumentTemplateItem/portal_components/document.erp5.Person.xml @@ -6,10 +6,22 @@ </pickle> <pickle> <dictionary> + <item> + <key> <string>_recorded_property_dict</string> </key> + <value> + <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent> + </value> + </item> <item> <key> <string>default_reference</string> </key> <value> <string>Person</string> </value> </item> + <item> + <key> <string>description</string> </key> + <value> + <none/> + </value> + </item> <item> <key> <string>id</string> </key> <value> <string>document.erp5.Person</string> </value> @@ -43,13 +55,28 @@ <item> <key> <string>workflow_history</string> </key> <value> - <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent> + <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent> </value> </item> </dictionary> </pickle> </record> <record id="2" aka="AAAAAAAAAAI="> + <pickle> + <global name="PersistentMapping" module="Persistence.mapping"/> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>data</string> </key> + <value> + <dictionary/> + </value> + </item> + </dictionary> + </pickle> + </record> + <record id="3" aka="AAAAAAAAAAM="> <pickle> <global name="PersistentMapping" module="Persistence.mapping"/> </pickle> @@ -62,7 +89,7 @@ <item> <key> <string>component_validation_workflow</string> </key> <value> - <persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent> + <persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent> </value> </item> </dictionary> @@ -71,7 +98,7 @@ </dictionary> </pickle> </record> - <record id="3" aka="AAAAAAAAAAM="> + <record id="4" aka="AAAAAAAAAAQ="> <pickle> <global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/> </pickle> diff --git a/master/bt5/slapos_cloud/WorkflowTemplateItem/portal_workflow/computer_slap_interface_workflow/scripts/Computer_generateCertificate.py b/master/bt5/slapos_cloud/WorkflowTemplateItem/portal_workflow/computer_slap_interface_workflow/scripts/Computer_generateCertificate.py index 1935b9271bc9fbb2914f98009e6761086690f297..afcaaa7c675f268a01c1c7c76e50eef94fc840ed 100644 --- a/master/bt5/slapos_cloud/WorkflowTemplateItem/portal_workflow/computer_slap_interface_workflow/scripts/Computer_generateCertificate.py +++ b/master/bt5/slapos_cloud/WorkflowTemplateItem/portal_workflow/computer_slap_interface_workflow/scripts/Computer_generateCertificate.py @@ -1,14 +1,24 @@ computer = state_change['object'] +# Get required arguments +kwargs = state_change.kwargs + +try: + certificate_signature_request = kwargs["csr"] +except KeyError, e: + raise TypeError("Computer_generateCertificate takes exactly 1 argument: %s" % str(e)) if computer.getDestinationReference() is not None: context.REQUEST.set("computer_certificate", None) - context.REQUEST.set("computer_key", None) + context.REQUEST.set("computer_certificate_url", None) raise ValueError('Certificate still active.') -ca = context.getPortalObject().portal_certificate_authority -certificate_dict = ca.getNewCertificate(computer.getReference()) +ca_service = context.getPortalObject().portal_web_services.caucase_adapter +csr_id = ca_service.putCertificateSigningRequest(certificate_signature_request) +# Sign the csr immediately +crt_id, url = ca_service.signCertificate(csr_id) +certificate = ca_service.getCertificate(crt_id) -computer.setDestinationReference(certificate_dict["id"]) +computer.setDestinationReference(crt_id) -context.REQUEST.set("computer_certificate", certificate_dict["certificate"]) -context.REQUEST.set("computer_key", certificate_dict["key"]) +context.REQUEST.set("computer_certificate", certificate) +context.REQUEST.set("computer_certificate_url", url) diff --git a/master/bt5/slapos_cloud/WorkflowTemplateItem/portal_workflow/computer_slap_interface_workflow/scripts/Computer_generateCertificate.xml b/master/bt5/slapos_cloud/WorkflowTemplateItem/portal_workflow/computer_slap_interface_workflow/scripts/Computer_generateCertificate.xml index 56308f63454a1b88b5c50da50195ae4ff7a58462..96e88cc9ef856aa7967f9050ae93d238827c2c3b 100644 --- a/master/bt5/slapos_cloud/WorkflowTemplateItem/portal_workflow/computer_slap_interface_workflow/scripts/Computer_generateCertificate.xml +++ b/master/bt5/slapos_cloud/WorkflowTemplateItem/portal_workflow/computer_slap_interface_workflow/scripts/Computer_generateCertificate.xml @@ -52,6 +52,14 @@ <key> <string>_params</string> </key> <value> <string>state_change</string> </value> </item> + <item> + <key> <string>_proxy_roles</string> </key> + <value> + <tuple> + <string>Manager</string> + </tuple> + </value> + </item> <item> <key> <string>id</string> </key> <value> <string>Computer_generateCertificate</string> </value> diff --git a/master/bt5/slapos_cloud/WorkflowTemplateItem/portal_workflow/computer_slap_interface_workflow/scripts/Computer_revokeCertificate.py b/master/bt5/slapos_cloud/WorkflowTemplateItem/portal_workflow/computer_slap_interface_workflow/scripts/Computer_revokeCertificate.py index b4c5b60e641aaaee80db7b8f70c61d1c80d4a8ff..d5ae8b1655bda4bf84a9873b917ce2759bf16b74 100644 --- a/master/bt5/slapos_cloud/WorkflowTemplateItem/portal_workflow/computer_slap_interface_workflow/scripts/Computer_revokeCertificate.py +++ b/master/bt5/slapos_cloud/WorkflowTemplateItem/portal_workflow/computer_slap_interface_workflow/scripts/Computer_revokeCertificate.py @@ -1,8 +1,9 @@ computer = state_change['object'] context.REQUEST.set('computer_certificate', None) -context.REQUEST.set('computer_key', None) +context.REQUEST.set('computer_certificate_url', None) destination_reference = computer.getDestinationReference() if destination_reference is None: raise ValueError('No certificate') -context.getPortalObject().portal_certificate_authority.revokeCertificate(destination_reference) +context.getPortalObject().portal_web_services.caucase_adapter\ + .revokeCertificate(destination_reference) computer.setDestinationReference(None)