|
| 1 | +{-# LANGUAGE CPP #-} |
1 | 2 | {-# LANGUAGE FlexibleInstances #-} |
2 | 3 | {-# LANGUAGE LambdaCase #-} |
3 | 4 |
|
| 5 | +#if !defined(mingw32_HOST_OS) |
| 6 | +#define POSIX |
| 7 | +#endif |
| 8 | + |
4 | 9 | -- |
5 | 10 | -- | Cryptographic & Data.X509 specialized methods for RSA with SHA256 |
6 | 11 | -- |
@@ -50,6 +55,11 @@ import Data.X509.CertificateStore (CertificateStore, |
50 | 55 | import Data.X509.Validation |
51 | 56 | import Net.IPv4 (IPv4 (..)) |
52 | 57 | import Net.IPv6 (IPv6 (..)) |
| 58 | +#ifdef POSIX |
| 59 | +import System.Posix.Files (ownerReadMode, ownerWriteMode, setFileMode, |
| 60 | + unionFileModes) |
| 61 | +import System.Posix.Types (FileMode) |
| 62 | +#endif |
53 | 63 |
|
54 | 64 | import qualified Crypto.PubKey.RSA.Types as RSA |
55 | 65 | import qualified Data.ByteString as BS |
@@ -231,21 +241,20 @@ writeCredentials |
231 | 241 | -> (PrivateKey, SignedCertificate) |
232 | 242 | -> IO () |
233 | 243 | writeCredentials filename (key, cert) = do |
234 | | - BS.writeFile (filename <> ".pem") (BS.concat [keyBytes, "\n", certBytes]) |
235 | | - BS.writeFile (filename <> ".key") keyBytes |
236 | | - BS.writeFile (filename <> ".crt") certBytes |
| 244 | + writeFile600 (filename <> ".pem") (BS.concat [keyBytes, "\n", certBytes]) |
| 245 | + writeFile600 (filename <> ".key") keyBytes |
| 246 | + writeFile600 (filename <> ".crt") certBytes |
237 | 247 | where |
238 | 248 | keyBytes = encodePEM key |
239 | 249 | certBytes = encodePEM cert |
240 | 250 |
|
241 | | - |
242 | 251 | -- | Write a certificate to the given location |
243 | 252 | writeCertificate |
244 | 253 | :: FilePath |
245 | 254 | -> SignedCertificate |
246 | 255 | -> IO () |
247 | 256 | writeCertificate filename cert = |
248 | | - BS.writeFile (filename <> ".crt") (encodePEM cert) |
| 257 | + writeFile600 (filename <> ".crt") (encodePEM cert) |
249 | 258 |
|
250 | 259 |
|
251 | 260 | -- |
@@ -330,3 +339,18 @@ validateCertificateIP ip cert = |
330 | 339 | [] |
331 | 340 | else |
332 | 341 | [NameMismatch $ B8.unpack ip] |
| 342 | + |
| 343 | + |
| 344 | +writeFile600 :: FilePath -> ByteString -> IO () |
| 345 | +#ifdef POSIX |
| 346 | +writeFile600 filepath bytes = do |
| 347 | + BS.writeFile filepath mempty |
| 348 | + setFileMode filepath mode600 |
| 349 | + BS.appendFile filepath bytes |
| 350 | + where |
| 351 | + mode600 :: FileMode |
| 352 | + mode600 = unionFileModes ownerReadMode ownerWriteMode |
| 353 | +#else |
| 354 | +writeFile600 _ _ = |
| 355 | + return () |
| 356 | +#endif |
0 commit comments