#!/usr/bin/perl -w
#
#  $Id: elidesecrets,v 1.1 2005/01/31 22:49:08 dgregor Exp $
#
# Copyright (c) 1997,1999,2005 Daniel J. Gregor, Jr.
# All rights reserved.
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 
#    - Redistributions of source code must retain the above copyright
#      notice, this list of conditions and the following disclaimer.
#    - Redistributions in binary form must reproduce the above
#      copyright notice, this list of conditions and the following
#      disclaimer in the documentation and/or other materials provided
#      with the distribution.
# 
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
# 

$formats = {
    '-ciscoconfig' => [ "Cisco IOS configuration file",
                     '(enable secret 5 )(?:\S+)()',
                     '(password 7 )(?:\S+)()', ],
                     '(snmp-server community )(?:\S+)( \S+)',
                     '(crypto isakmp key )(?:\S+)( address \S+)',
    '-slapdconf' => [ "OpenLDAP slapd.conf configuration file",
                     '(rootpw\s+)(?:[^#]+)()',
                     '(credentials=)(?:[^#]+)()', ],
    '-ldif'      => [ "LDIF",
                      '^((?i:userpassword|sambalmpassword|sambantpassword):\s*)(?:.*)()', ],
};

$usage = "elidesecrets <format specifier> [<files...>]";
$formatusage = "allowed formats:\n";
for my $f (keys(%$formats)) {
    $formatusage .= sprintf("    %-20s  %s\n", $f, (@{$$formats{$f}})[0]);
}

if (@ARGV < 1) {
    warn("$0: you need to specify a format specifier of the input file(s)\n");
    warn("$0: usage: $usage\n");
    die("$0: $formatusage");
}

$format = shift(@ARGV);

if (!exists($$formats{$format})) {
    die("$0: format \"$format\" unknown.");
}

$regexps = $$formats{$format};
shift(@$regexps);

while (<>) {
    chomp();

    for my $f (@$regexps) {
        s/$f/$1<elided>$2/g;
    }

    print("$_\n");
}
