initial commit
Signed-off-by: Harald Hoyer <harald@hoyer.xyz>
This commit is contained in:
commit
3e3c4e4d6e
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
src/main.rs text filter=rot8000
|
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
/target
|
54
Cargo.lock
generated
Normal file
54
Cargo.lock
generated
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "aho-corasick"
|
||||||
|
version = "1.1.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "memchr"
|
||||||
|
version = "2.7.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex"
|
||||||
|
version = "1.10.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15"
|
||||||
|
dependencies = [
|
||||||
|
"aho-corasick",
|
||||||
|
"memchr",
|
||||||
|
"regex-automata",
|
||||||
|
"regex-syntax",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex-automata"
|
||||||
|
version = "0.4.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea"
|
||||||
|
dependencies = [
|
||||||
|
"aho-corasick",
|
||||||
|
"memchr",
|
||||||
|
"regex-syntax",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex-syntax"
|
||||||
|
version = "0.8.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rot8000"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"regex",
|
||||||
|
]
|
9
Cargo.toml
Normal file
9
Cargo.toml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
[package]
|
||||||
|
name = "rot8000"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
regex = "1.10"
|
57
src/main.rs
Normal file
57
src/main.rs
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
/*!
|
||||||
|
To be used as a git smudge filter,
|
||||||
|
to replace email addresses in a file with a scrambled version of the email address
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[filter "rot8000"]
|
||||||
|
smudge = /home/foo/.cargo/bin/rot8000
|
||||||
|
clean = /home/foo/.cargo/bin/rot8000
|
||||||
|
```
|
||||||
|
|
||||||
|
"grfg123@rknzcyr.bet"
|
||||||
|
"grfg456@rknzcyr.bet"
|
||||||
|
"grfg456@rknzcyr1.bet"
|
||||||
|
!*/
|
||||||
|
|
||||||
|
use regex::{Captures, Regex, Replacer};
|
||||||
|
use std::io::stdin;
|
||||||
|
struct Rot8000;
|
||||||
|
|
||||||
|
impl Replacer for Rot8000 {
|
||||||
|
/// Replace the matched text with a replacement.
|
||||||
|
///
|
||||||
|
/// Should have implemented a true unicode rot13, but I was lazy
|
||||||
|
fn replace_append(&mut self, caps: &Captures<'_>, dst: &mut String) {
|
||||||
|
for c in caps[0].chars() {
|
||||||
|
if c.is_ascii() {
|
||||||
|
// do rot13 for ascii alphanumeric characters
|
||||||
|
let mut c = c as u8;
|
||||||
|
if c.is_ascii_lowercase() {
|
||||||
|
c = (c - b'a' + 13) % 26 + b'a';
|
||||||
|
} else if c.is_ascii_uppercase() {
|
||||||
|
c = (c - b'A' + 13) % 26 + b'A';
|
||||||
|
}
|
||||||
|
dst.push(unsafe { char::from_u32_unchecked(c as u32) });
|
||||||
|
} else {
|
||||||
|
dst.push(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// match only ascii email addresses for now
|
||||||
|
let re =
|
||||||
|
Regex::new(r#""([[[:ascii:]]&&[^"\s\[\]\\]]*?@[[[:ascii:]]&&[^"\s]\[\]\\]*)""#).unwrap();
|
||||||
|
|
||||||
|
let mut line = String::new();
|
||||||
|
|
||||||
|
while let Ok(n) = stdin().read_line(&mut line) {
|
||||||
|
if n == 0 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
let result = re.replace(&line, Rot8000);
|
||||||
|
print!("{}", result);
|
||||||
|
line.clear();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue