diff options
| author | Geert Hauwaerts | 2015-06-12 21:40:32 +0200 | 
|---|---|---|
| committer | Geert Hauwaerts | 2015-06-12 21:40:32 +0200 | 
| commit | dca0c3de79a96dc4e2eddea519a9f198a2c97ae8 (patch) | |
| tree | 03ea676677ab9bc3a7653cb6a1d6cd099aef33e1 | |
| parent | 578201fb2f1332a5fcd56a71120b39a39f46f575 (diff) | |
| download | scripts.irssi.org-dca0c3de79a96dc4e2eddea519a9f198a2c97ae8.tar.bz2 | |
Add credstore.pl (#51)
Add credstore.pl (#51)
| -rw-r--r-- | scripts/credstore.pl | 349 | 
1 files changed, 349 insertions, 0 deletions
| diff --git a/scripts/credstore.pl b/scripts/credstore.pl new file mode 100644 index 0000000..f6ad95b --- /dev/null +++ b/scripts/credstore.pl @@ -0,0 +1,349 @@ +#store fingerprints of know users so can verify +#/credstore +use Irssi; +use warnings; +use strict; +use vars qw($VERSION %IRSSI $DBFILE $DEBUG $OPT $FING); + +$VERSION = "1.3"; +%IRSSI = ( +    authors     => "Benedetto", +    contact     => "dettox\@gmail.com", +    name        => "credstore", +    description => "store fingerprints of know users so can verify", +    license     => "GPLv3+", +    url         => "http://irssi.org/", +    changed	=> "Thu Jan 20 13:07:49 GMT 2014", +); + +$DBFILE = Irssi::get_irssi_dir() . "/credstore.txt"; +$OPT = "help"; +$FING = ""; + +sub show_help() { +	my $help="CREDSTORE $VERSION +/CREDSTORE add <nickname> [add nickname fingerprint] +/CREDSTORE del <nickname> [del nickname fingerprint] +/CREDSTORE verify <nickname> [verify nickname fingerprint] +/CREDSTORE [display this help] +"; +	Irssi::print("$help",MSGLEVEL_CLIENTCRAP); +} + +sub redir_init { +    # set up event to handler mappings +    Irssi::signal_add +    ({ +    	'redir credstore_whois_user'       => 'event_whois_user', +    	'redir credstore_whois_server'       => 'event_whois_server', +	'redir credstore_whois_end'        => 'event_whois_end', +	'redir credstore_whois_nosuchnick' => 'event_whois_nosuchnick', +	'redir credstore_whois_timeout'    => 'event_whois_timeout', +	'redir credstore_whois_various'    => 'event_whois_various', +	'redir credstore_whois_idle'    => 'event_whois_idle', +	'redir credstore_whois_channels'    => 'event_whois_channels', +	'redir credstore_whois_modes'    => 'event_whois_modes', +	'redir credstore_whois_usermode'    => 'event_whois_usermode', +	'redir credstore_whois_usermode326'    => 'event_whois_usermode326', +	'redir credstore_whois_realhost'    => 'event_whois_realhost', +	'redir credstore_whois_realhost327'    => 'event_whois_realhost327', +	'redir credstore_whois_realhost338'    => 'event_whois_realhost338', +	}); +} + +sub request_whois { +    my ($server, $nick) = @_; +        $server->redirect_event +	( +		'whois', 1, $nick, 0,             # command, remote, arg, timeout +	        'redir credstore_whois_timeout', # error handler +	        { +	        'event 311' => 'redir credstore_whois_user', # event mappings +	        'event 312' => 'redir credstore_whois_server', +	        'event 317' => 'redir credstore_whois_idle', +	        'event 318' => 'redir credstore_whois_end', +	        'event 319' => 'redir credstore_whois_channels', +	        'event 327' => 'redir credstore_whois_realhost327', +	        'event 338' => 'redir credstore_whois_realhost338', +	        'event 378' => 'redir credstore_whois_realhost', +	        'event 326' => 'redir credstore_whois_usermode326', +	        'event 377' => 'redir credstore_whois_usermode', +	        'event 379' => 'redir credstore_whois_modes', +		'event 401' => 'redir credstore_whois_nosuchnick', +		'event 275' => 'redir credstore_whois_various', +		'event 276' => 'redir credstore_whois_various', +		'event 671' => 'redir credstore_whois_various', +	        ''          => 'event empty', +	        } +        ); + +	Irssi::print("CREDSTORE Sending Command: WHOIS $nick", MSGLEVEL_CLIENTCRAP); +        $server->send_raw("whois $nick"); +} + +sub event_whois_user { +	my ($num, $nick, $user, $host, $empty, $realname) = ( split / +/, $_[1], 6 ); +	Irssi::print("CREDSTORE WHOIS: $nick!$user\@$host $empty $realname", MSGLEVEL_CLIENTCRAP); +} + +sub event_whois_various { +	my $data = $_[1]; +	my $fingerp = get_fingerprint($data); +	if ( defined $fingerp && $fingerp ne "" ) { +		$FING = $data; +	} +     +	Irssi::print("CREDSTORE WHOIS: $data", MSGLEVEL_CLIENTCRAP); +} + +sub event_whois_server { +	my ($empty, $nick, $whoserver, $desc) = ( split / +/, $_[1], 4 ); +	Irssi::print("CREDSTORE WHOIS: $whoserver $desc", MSGLEVEL_CLIENTCRAP); +} + +sub event_whois_idle { +	my ($empty, $nick, $sec, $signon, $rest) = ( split / +/, $_[1], 5 ); +	my $days = int($sec/3600/24); +	my $hours = int(($sec%(3600*24))/3600); +	my $min = int(($sec%3600)/60); +	my $secs = int($sec%60); +	my $logint = gmtime($signon); +	Irssi::print("CREDSTORE WHOIS: $days days $hours hours $min mins $secs secs [signon: $logint]", MSGLEVEL_CLIENTCRAP); +} + +sub event_whois_channels { +	my ($empty, $nick, $chans) = ( split / +/, $_[1], 3 ); +	Irssi::print("CREDSTORE WHOIS: $chans", MSGLEVEL_CLIENTCRAP); +} + +sub event_whois_realhost { +	my ($empty, $nick, $txt_real, $txt_hostname, $hostname) = ( split / +/, $_[1], 5 ); +	Irssi::print("CREDSTORE WHOIS: $txt_real $txt_hostname $hostname", MSGLEVEL_CLIENTCRAP); +} + +sub event_whois_realhost327 { +	my ($empty, $nick, $hostname, $ip, $text) = ( split / +/, $_[1], 5 ); +	Irssi::print("CREDSTORE WHOIS: $hostname $ip $text", MSGLEVEL_CLIENTCRAP); +} + +sub event_whois_realhost338 { +	my ($empty, $nick, $arg1, $arg2, $arg3) = ( split / +/, $_[1], 5 ); +	if ( defined $arg1 && defined $arg2 ) { +		Irssi::print("CREDSTORE WHOIS: $nick $arg1 $arg2", MSGLEVEL_CLIENTCRAP); +	} elsif ( defined $arg2 && defined $arg3 ) { +		Irssi::print("CREDSTORE WHOIS: $nick $arg1 $arg2", MSGLEVEL_CLIENTCRAP); +	} +} + +sub event_whois_usermode { +	my ($empty, $txt_user, $nick, $usermode) = ( split / +/, $_[1], 4 ); +	Irssi::print("CREDSTORE WHOIS: $txt_user $usermode", MSGLEVEL_CLIENTCRAP); +} + +sub event_whois_usermode326 { +	my ($empty, $nick, $usermode) = ( split / +/, $_[1], 3 ); +	Irssi::print("CREDSTORE WHOIS: $usermode", MSGLEVEL_CLIENTCRAP); +} + +sub event_whois_modes { +	my ($empty, $nick, $modes) = ( split / +/, $_[1], 3 ); +	Irssi::print("CREDSTORE WHOIS: $modes", MSGLEVEL_CLIENTCRAP); +} + +sub event_whois_end { +	my ($server, $data) = @_; +	my ($nick) = ( split / +/, $data, 3 )[1]; +	my $fingerp = get_fingerprint($FING); + +	if ( $OPT eq 'add' ) { +		if ( defined $fingerp && $fingerp ne "" ) { +			add_to_db($nick,$fingerp); +		} else {  +			Irssi::print("CREDSTORE Error: No Whois Fingerprint for $nick",MSGLEVEL_CLIENTCRAP); +		} +	} elsif ( $OPT eq 'verify' ) { +			my $fingerp2 = read_from_db($nick); +			if ( defined $fingerp && $fingerp ne "" ) { +				if ( lc($fingerp) ne lc($fingerp2) ) { +					Irssi::print("CREDSTORE Error: Differents Fingerprints for $nick",MSGLEVEL_CLIENTCRAP); +					Irssi::print("CREDSTORE  DB:$fingerp2\nCREDSTORE NEW:$fingerp",MSGLEVEL_CLIENTCRAP); +				} else {  +					Irssi::print("CREDSTORE $nick Fingerprint is OK",MSGLEVEL_CLIENTCRAP); +				} +			} else {  +				Irssi::print("CREDSTORE Error: No Whois Fingerprint for $nick",MSGLEVEL_CLIENTCRAP); +			} +	} +} + +sub event_whois_nosuchnick { +    my ($server, $data) = @_; +    my $nick = ( split / +/, $data, 4)[1]; +    Irssi::active_win->print("CREDSTORE WHOIS Error: no such nick $nick - aborting.",MSGLEVEL_CLIENTCRAP); +} + +sub event_whois_timeout { +    my ($server, $data) = @_; +    Irssi::print("CREDSTORE WHOIS whois_timeout", MSGLEVEL_CLIENTCRAP); +} + +sub dbfile_check { +	if ( ! -w $DBFILE ) { +		open FH,">",$DBFILE or croak $!; +		print FH ""; +		if(!close(FH)) { +			Irssi::print("CREDSTORE Error on $DBFILE",MSGLEVEL_CLIENTCRAP); +		} +	} +} + +#add nick,fingerprint to DB +sub add_to_db { +	my ($nick,$fingerp) = @_; +	if ( -w $DBFILE ) { +		open FH,">>",$DBFILE or croak $!; +		print FH "$nick\t$fingerp\n"; +		if(!close(FH)) { +			Irssi::print("CREDSTORE Error on $DBFILE",MSGLEVEL_CLIENTCRAP); +		} +		Irssi::print("CREDSTORE $nick($fingerp)",MSGLEVEL_CLIENTCRAP); +	} else { +		Irssi::print("CREDSTORE Error on $DBFILE",MSGLEVEL_CLIENTCRAP); +	} +} + +#del nick,fingerprint from DB +sub del_from_db { +	my ($nick) = @_; +	my $nick2; my $fingerp; +	my $filetmp = "$DBFILE.tmp"; +	if ( -w $DBFILE && ! -w $filetmp ) { +		open FHR,"<",$DBFILE or croak $!; +		open FHW,">",$filetmp or croak $!; +		while (<FHR>) { +			my @line = split(/\t/, $_); +			($nick2,$fingerp) = @line; +			if ( $nick ne $nick2 ) { +				print FHW "$nick2\t$fingerp"; +			} +		} +		if(!close(FHR)) { +			Irssi::print("CREDSTORE Error on $DBFILE",MSGLEVEL_CLIENTCRAP); +		} +		if(!close(FHW)) { +			Irssi::print("CREDSTORE Error on $DBFILE",MSGLEVEL_CLIENTCRAP); +		} +		unlink($DBFILE); +		rename($filetmp,$DBFILE); +		Irssi::print("CREDSTORE $nick removed from DB",MSGLEVEL_CLIENTCRAP); +	} else { +		Irssi::print("CREDSTORE Error on $DBFILE",MSGLEVEL_CLIENTCRAP); +	} +} + +#read nick,fingerprint from DB +sub read_from_db { +	my ($nick) = @_; +	my $nick2; my $fingerp; +	 +	if ( -w $DBFILE ) { +		open FH,"<",$DBFILE or croak $!; +		while (<FH>) { +			my @line = split(/\t/, $_); +			($nick2,$fingerp) = @line; +			if ( defined $DEBUG ) { +				Irssi::print("$nick2  ...  $fingerp\n",MSGLEVEL_CLIENTCRAP); +			} +			if ( $nick eq $nick2 ) { +				$_ = $fingerp; +				$fingerp =~ s/\n//g; +				return $fingerp; +			} else { +				$fingerp = ""; +			} +		} +		if(!close(FH)) { +			Irssi::print("CREDSTORE Error on $DBFILE",MSGLEVEL_CLIENTCRAP); +		} +	} else { +		Irssi::print("CREDSTORE Error on $DBFILE",MSGLEVEL_CLIENTCRAP); +	} +	return $fingerp; +} + +#get fingerprint from input +sub get_fingerprint { +	my ($output) = @_; +	my $fingerp; + +	$_ = $output; +	while ( $output =~ s/.*\s(\w{40}).*/$1/ ) { +		$fingerp = $1; +	} +	return $fingerp; +} + +#add fingerprint for nick +sub add_nickname { +	my ($nick,$server) = @_; +	my $exfingerp = read_from_db($nick); +	if ( defined $exfingerp && $exfingerp ne "" ) { +		Irssi::print("CREDSTORE Error: $nick just Exist",MSGLEVEL_CLIENTCRAP); +		return; +	} +	Irssi::print("CREDSTORE Adding $nick ... ",MSGLEVEL_CLIENTCRAP); +	request_whois($server,$nick); +} + +#del nick from db +sub del_nickname { +	my ($nick) = @_; +	Irssi::print("CREDSTORE Deleting $nick ...",MSGLEVEL_CLIENTCRAP); +	del_from_db($nick); +} + +#verify nick, fingerprint +sub verify_nickname { +	my ($nick,$server) = @_; +	Irssi::print("CREDSTORE Verify $nick ...",MSGLEVEL_CLIENTCRAP); + +	my ($fingerp) = read_from_db($nick); +	if ( defined $fingerp && $fingerp ne "" ) { +		request_whois($server,$nick); +	} else {  +		Irssi::print("CREDSTORE Error: $nick not in DB",MSGLEVEL_CLIENTCRAP); +	} +} + +sub cmd_credstore { +	my ($data, $server, $witem) = @_; +	my $cmd; my $nick; my $conn = 0; +	( $cmd, $nick ) = split(/ /, $data); +	 +	if (!$server || !$server->{connected}) { +		$conn = 1; +		Irssi::print("CREDSTORE Warning: not connected",MSGLEVEL_CLIENTCRAP); +	} +	 +	if ( defined $cmd && defined $nick) { +		$OPT = $cmd; +		if ($cmd eq 'add' && !$conn) { +			add_nickname($nick,$server); +		} elsif ($cmd eq 'del' && !$conn) { +			del_nickname($nick); +		} elsif ($cmd eq 'verify' && !$conn) { +			verify_nickname($nick,$server); +		} else { +			show_help(); +		} +	} else { +		show_help(); +	} +	return(0); +} +#signal handler +redir_init(); +#DB file exist and is writable +dbfile_check(); + +Irssi::command_bind('credstore', 'cmd_credstore'); | 
