#!/usr/bin/perl use warnings; use strict; die "Usage: $0 \n" unless @ARGV; my @granted; my @denied; open HOSTS,"$ENV{HOME}/.config/chromium/Default/cookies_accept.txt" and do { chop $_ and push @granted,$_ while ; close HOSTS; }; open HOSTS,"$ENV{HOME}/.config/chromium/Default/cookies_reject.txt" and do { chop $_ and push @denied,$_ while ; close HOSTS; }; ## Open SQLite open OLD,"sqlite3 $ENV{HOME}/.config/chromium/Default/Cookies .dump|" or die $!; if( $ARGV[0] eq "apply" ) { die "No filter list!" unless @granted or @denied; unlink "$ENV{HOME}/.config/chromium/Default/Cookies.new"; open NEW,"|sqlite3 $ENV{HOME}/.config/chromium/Default/Cookies.new" or die $!; ## Parsing & filtering my $n=0; my $total=0; my %keys; while( ) { if( /^INSERT INTO "cookies" VALUES\((.+)\);$/ ) { my @cookie=split(",",$1); /^'(.+)'$/ and $_=$1 foreach @cookie; my $go_next=(@granted ? 1 : 0); foreach (@granted) { my $r=1; my $expr=$_; $expr=~s/\$(\w+)/\$cookie[\$keys{$1}]/g; if( eval $expr ) { $go_next=0; last; } } foreach (@denied) { my $r=1; my $expr=$_; $expr=~s/\$(\w+)/\$cookie[\$keys{$1}]/g; if( eval $expr ) { $go_next=1; last; } } $total++; next if $go_next; $n++; } elsif( ! %keys and /^CREATE TABLE cookies \((.+)\);/ ) { @_=map {$& if /^\w+/} split(",",$1); foreach my $i(0..$#_) { $keys{$_[$i]}=$i; } } print NEW $_; } print NEW "\n.quit\n"; close NEW; rename "$ENV{HOME}/.config/chromium/Default/Cookies","$ENV{HOME}/.config/chromium/Default/Cookies.bak"; rename "$ENV{HOME}/.config/chromium/Default/Cookies.new","$ENV{HOME}/.config/chromium/Default/Cookies"; print "$n/$total cookies kept\n" } elsif( $ARGV[0] eq "list" ) { while( ) { if( /^INSERT INTO "cookies" VALUES\((.+)\);$/ ) { print join("\t", map {m/^'(.+)'$/ and $1 or $_} split(",",$1))."\n"; } elsif( /^CREATE TABLE cookies \((.+)\);/ ) { print join("\t", map {$& if /^\w+/} split(",",$1))."\n"; } } } else { warn "Command `$ARGV[0]' unknown. Available commands: list, apply\n"; } close OLD;