private function doPut(array $certificates) { if (empty($certificates)) { throw new InvalidArgumentException("Empty array not allowed"); } $cert = new Certificate($certificates[0]); $commonName = $cert->getSubject()->getCommonName(); if (!$commonName) { throw new CertificateStoreException("Certificate doesn't have a common name."); } // See https://github.com/amphp/dns/blob/4c4d450d4af26fc55dc56dcf45ec7977373a38bf/lib/functions.php#L83 if (isset($commonName[253]) || !preg_match("~^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9]){0,1})(?:\\.[a-z0-9][a-z0-9-]{0,61}[a-z0-9])*\$~i", $commonName)) { throw new CertificateStoreException("Invalid common name: '{$commonName}'"); } try { $chain = array_slice($certificates, 1); $path = $this->root . "/" . $commonName; $realpath = realpath($path); if (!$realpath && !mkdir($path, 0775, true)) { throw new FilesystemException("Couldn't create certificate directory: '{$path}'"); } (yield \Amp\File\put($path . "/cert.pem", $certificates[0])); (yield \Amp\File\chmod($path . "/cert.pem", 0644)); (yield \Amp\File\put($path . "/fullchain.pem", implode("\n", $certificates))); (yield \Amp\File\chmod($path . "/fullchain.pem", 0644)); (yield \Amp\File\put($path . "/chain.pem", implode("\n", $chain))); (yield \Amp\File\chmod($path . "/chain.pem", 0644)); } catch (FilesystemException $e) { throw new CertificateStoreException("Couldn't save certificates for '{$commonName}'", 0, $e); } }
private function doPut($token, $payload, $user = null) { Assert::string($token, "Token must be a string. Got: %s"); Assert::string($payload, "Payload must be a string. Got: %s"); Assert::nullOrString($user, "User must be a string or null. Got: %s"); $path = $this->docroot . "/.well-known/acme-challenge"; $realpath = realpath($path); if (!realpath($this->docroot)) { throw new ChallengeStoreException("Document root doesn't exist: '{$this->docroot}'"); } if (!$realpath && !@mkdir($path, 0755, true)) { throw new ChallengeStoreException("Couldn't create public directory to serve the challenges: '{$path}'"); } if ($user) { if (!($userInfo = posix_getpwnam($user))) { throw new ChallengeStoreException("Unknown user: '******'"); } } if (isset($userInfo)) { (yield \Amp\File\chown($this->docroot . "/.well-known", $userInfo["uid"], -1)); (yield \Amp\File\chown($this->docroot . "/.well-known/acme-challenge", $userInfo["uid"], -1)); } (yield \Amp\File\put("{$path}/{$token}", $payload)); if (isset($userInfo)) { (yield \Amp\File\chown("{$path}/{$token}", $userInfo["uid"], -1)); } (yield \Amp\File\chmod("{$path}/{$token}", 0644)); }
private function doPut($path, KeyPair $keyPair) { if (!is_string($path)) { throw new InvalidArgumentException(sprintf("\$root must be of type string, %s given.", gettype($path))); } $file = $this->root . "/" . $path; try { // TODO: Replace with async version once available if (!file_exists(dirname($file))) { $success = mkdir(dirname($file), 0755, true); if (!$success) { throw new KeyStoreException("Could not create key store directory."); } } (yield \Amp\File\put($file, $keyPair->getPrivate())); (yield \Amp\File\chmod($file, 0600)); } catch (FilesystemException $e) { throw new KeyStoreException("Could not save key.", 0, $e); } (yield new CoroutineResult($keyPair)); }