@@ -202,7 +202,7 @@ const NUM_RETRIES: u32 = 65536;
202202const NUM_RAND_CHARS : usize = 6 ;
203203
204204use std:: ffi:: OsStr ;
205- use std:: fs:: OpenOptions ;
205+ use std:: fs:: { OpenOptions , Permissions } ;
206206use std:: io;
207207use std:: path:: Path ;
208208
@@ -227,7 +227,7 @@ pub struct Builder<'a, 'b> {
227227 prefix : & ' a OsStr ,
228228 suffix : & ' b OsStr ,
229229 append : bool ,
230- permissions : Option < std :: fs :: Permissions > ,
230+ permissions : Option < Permissions > ,
231231 disable_cleanup : bool ,
232232}
233233
@@ -374,7 +374,7 @@ impl<'a, 'b> Builder<'a, 'b> {
374374 self
375375 }
376376
377- /// Set the file to be opened in append mode.
377+ /// Configure the file to be opened in append-only mode.
378378 ///
379379 /// Default: `false`.
380380 ///
@@ -393,31 +393,32 @@ impl<'a, 'b> Builder<'a, 'b> {
393393 self
394394 }
395395
396- /// The permissions to create the tempfile or [tempdir](Self::tempdir) with .
396+ /// Set the permissions for the new temporary file/directory .
397397 ///
398- /// # Security
398+ /// # Platform Notes
399399 ///
400- /// By default, the permissions of tempfiles on Unix are set for it to be
401- /// readable and writable by the owner only, yielding the greatest amount
402- /// of security.
403- /// As this method allows to widen the permissions, security would be
404- /// reduced in such cases .
400+ /// ## Windows
401+ ///
402+ /// This setting is only fully-supported on unix-like platforms. On Windows, if this method is
403+ /// called with a [`Permissions`] object where ` permissions.readonly` returns true, creating
404+ /// temporary files and directories will fail with an error .
405405 ///
406- /// # Platform Notes
407406 /// ## Unix
408407 ///
409- /// The actual permission bits set on the tempfile or tempdir will be affected by the `umask`
410- /// applied by the underlying syscall. The actual permission bits are calculated via
411- /// `permissions & !umask`.
408+ /// On unix-like systems, the actual permission bits set on the tempfile or tempdir will be
409+ /// affected by the `umask` applied by the underlying syscall. The actual permission bits are
410+ /// calculated via `permissions & !umask`. In other words, depending on your umask, the
411+ /// permissions of the created file may be more restrictive (but never more permissive) than the
412+ /// ones you specified.
412413 ///
413414 /// Permissions default to `0o600` for tempfiles and `0o777` for tempdirs. Note, this doesn't
414415 /// include effects of the current `umask`. For example, combined with the standard umask
415416 /// `0o022`, the defaults yield `0o600` for tempfiles and `0o755` for tempdirs.
416417 ///
417- /// ## Windows and others
418+ /// ## WASI
418419 ///
419- /// This setting is unsupported and trying to set a file or directory read-only
420- /// will return an error .
420+ /// While custom permissions are allowed on WASI, they will be ignored as the platform has no
421+ /// concept of permissions or file modes (or multiple users for that matter) .
421422 ///
422423 /// # Examples
423424 ///
@@ -431,12 +432,15 @@ impl<'a, 'b> Builder<'a, 'b> {
431432 ///
432433 /// let all_read_write = std::fs::Permissions::from_mode(0o666);
433434 /// let tempfile = Builder::new().permissions(all_read_write).tempfile()?;
435+ ///
436+ /// // Check that this worked and that the file is world-readable.
437+ /// //
438+ /// // NOTE: the file likely won't actually be created with 0o666 permissions because it's
439+ /// // restricted by the user's umask.
440+ /// //
441+ /// // NOTE: This test will fail if the user's umask is, e.g., 0o066.
434442 /// let actual_permissions = tempfile.path().metadata()?.permissions();
435- /// assert_ne!(
436- /// actual_permissions.mode() & !0o170000,
437- /// 0o600,
438- /// "we get broader permissions than the default despite umask"
439- /// );
443+ /// assert_eq!(actual_permissions.mode() & 0o044, 0o044);
440444 /// # }
441445 /// # Ok::<(), std::io::Error>(())
442446 /// ```
@@ -460,7 +464,7 @@ impl<'a, 'b> Builder<'a, 'b> {
460464 /// # }
461465 /// # Ok::<(), std::io::Error>(())
462466 /// ```
463- pub fn permissions ( & mut self , permissions : std :: fs :: Permissions ) -> & mut Self {
467+ pub fn permissions ( & mut self , permissions : Permissions ) -> & mut Self {
464468 self . permissions = Some ( permissions) ;
465469 self
466470 }
0 commit comments