Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bump to v5 #52

Merged
merged 5 commits into from Aug 8, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 2 additions & 5 deletions Cargo.toml
@@ -1,7 +1,7 @@
[package]

name = "rpassword"
version = "4.0.5"
version = "5.0.0"
authors = ["Conrad Kleinespel <conradk@conradk.com>"]
description = "Read passwords in console applications."
license = "Apache-2.0"
Expand All @@ -15,7 +15,4 @@ keywords = ["read", "password", "security", "pass", "getpass"]
libc = "0.2"

[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3", features = ["std", "winnt", "fileapi", "processenv", "winbase", "handleapi", "consoleapi", "minwindef", "wincon"] }

[features]
enhanced_mock = []
winapi = { version = "0.3", features = ["std", "winnt", "fileapi", "processenv", "winbase", "handleapi", "consoleapi", "minwindef", "wincon"] }
23 changes: 5 additions & 18 deletions README.md
Expand Up @@ -19,7 +19,7 @@ Add `rpassword` as a dependency in Cargo.toml:

```toml
[dependencies]
rpassword = "4.0"
rpassword = "5.0"
```

Use `rpassword` within your code:
Expand All @@ -28,7 +28,7 @@ Use `rpassword` within your code:
extern crate rpassword;

fn main() {
// Prompt for a password on TTY (safest but not default for backwards compatibility)
// Prompt for a password on TTY (safest but not always most practical when integrating with other tools or unit testing)
let pass = rpassword::read_password_from_tty(Some("Password: ")).unwrap();
println!("Your password is {}", pass);

Expand All @@ -48,22 +48,6 @@ fn main() {

The full API documentation is available at [https://docs.rs/rpassword](https://docs.rs/rpassword).

## Optional feature

The optional feature **enhanced_mock** can be enabled to change `read_password_with_reader` signature from
```
pub fn read_password_with_reader<T>(source: Option<T>) -> ::std::io::Result<String>
where
T: ::std::io::BufRead
```
to
```
pub fn read_password_with_reader<T>(source: Option<&mut T>) -> ::std::io::Result<String>
where
T: ::std::io::BufRead
```
allowing to call `read_password_with_reader` multiple times with the same reader.

## Contributors

We welcome contribution from everyone. Feel free to open an issue or a pull request at any time.
Expand All @@ -75,10 +59,13 @@ Here's a list of existing `rpassword` contributors:
* [@DaveLancaster](https://github.com/DaveLancaster)
* [@dcuddeback](https://github.com/dcuddeback)
* [@Draphar](https://github.com/Draphar)
* [@dvermd](https://github.com/dvermd)
* [@equalsraf](https://github.com/equalsraf)
* [@Heliozoa](https://github.com/Heliozoa)
* [@JanLikar](https://github.com/JanLikar)
* [@joshuef](https://github.com/joshuef)
* [@longshorej](https://github.com/longshorej)
* [@nicokoch](https://github.com/nicokoch)
* [@petevine](https://github.com/petevine)
* [@psych0d0g](https://github.com/psych0d0g)
* [@retep998](https://github.com/retep998)
Expand Down
55 changes: 2 additions & 53 deletions src/lib.rs
Expand Up @@ -237,55 +237,7 @@ use unix::{read_password_from_stdin, display_on_tty};
use windows::{read_password_from_stdin, display_on_tty};

/// Reads a password from anything that implements BufRead
#[cfg(not(feature = "enhanced_mock"))]
mod legacy_mock {
use super::*;

/// Reads a password from STDIN
pub fn read_password() -> ::std::io::Result<String> {
read_password_with_reader(None::<::std::io::Empty>)
}

/// Reads a password from anything that implements BufRead
pub fn read_password_with_reader<T>(source: Option<T>) -> ::std::io::Result<String>
where
T: ::std::io::BufRead,
{
match source {
Some(mut reader) => {
let mut password = ZeroOnDrop::new();
reader.read_line(&mut password)?;
fixes_newline(&mut password);
Ok(password.into_inner())
},
None => read_password_from_stdin(false),
}
}

#[cfg(test)]
mod tests {
use std::io::Cursor;

fn mock_input_crlf() -> Cursor<&'static [u8]> {
Cursor::new(&b"A mocked response.\r\n\r\n"[..])
}

fn mock_input_lf() -> Cursor<&'static [u8]> {
Cursor::new(&b"A mocked response.\n"[..])
}

#[test]
fn can_read_from_redirected_input() {
let response = ::read_password_with_reader(Some(mock_input_crlf())).unwrap();
assert_eq!(response, "A mocked response.");
let response = ::read_password_with_reader(Some(mock_input_lf())).unwrap();
assert_eq!(response, "A mocked response.");
}
}
}

#[cfg(feature = "enhanced_mock")]
mod enhanced_mock {
mod mock {
use super::*;

/// Reads a password from STDIN
Expand Down Expand Up @@ -342,10 +294,7 @@ mod enhanced_mock {
}
}

#[cfg(feature = "enhanced_mock")]
pub use enhanced_mock::{read_password, read_password_with_reader};
#[cfg(not(feature = "enhanced_mock"))]
pub use legacy_mock::{read_password, read_password_with_reader};
pub use mock::{read_password, read_password_with_reader};

/// Reads a password from the terminal
pub fn read_password_from_tty(prompt: Option<&str>)
Expand Down
12 changes: 0 additions & 12 deletions tests/no-terminal.rs
Expand Up @@ -45,18 +45,6 @@ fn mock_input_lf() -> Cursor<&'static [u8]> {
Cursor::new(&b"A mocked response.\nAnother mocked response.\n"[..])
}

#[cfg(not(feature = "enhanced_mock"))]
#[test]
fn can_read_from_redirected_input() {
close_stdin();

let response = ::read_password_with_reader(Some(mock_input_crlf())).unwrap();
assert_eq!(response, "A mocked response.");
let response = ::read_password_with_reader(Some(mock_input_lf())).unwrap();
assert_eq!(response, "A mocked response.");
}

#[cfg(feature = "enhanced_mock")]
#[test]
fn can_read_from_redirected_input_many_times() {
close_stdin();
Expand Down