rendered paste bodysource $tcl_library/tv/Inc.itcl
tvsource $tcl_library/tv/mfslib.tcl
tvsource $tcl_library/tv/setup.tcl
namespace import Inc::*
proc unbundle { sourcefile } {
if ![file exists /tmp/unbundle] {
file mkdir /tmp/unbundle
}
catch {
foreach i [glob /tmp/unbundle/*] {
file delete -force $i
}
}
set srcSize [file size $sourcefile]
if {$srcSize == 0} {
return
}
set currentdir [pwd]
if {[string first "/" $sourcefile] == -1} {
set targetdir $currentdir
set sourcefile "$currentdir/$sourcefile"
} else {
set targetdir [file dirname $sourcefile]
}
set namebase [file tail $sourcefile]
cd /tmp/unbundle
putlog "Unbundling $sourcefile"
catch { eval exec cpio -i -I $sourcefile 2>/dev/null }
set keyfiles [glob *$Inc::TS_SKEY_EXT]
set db [dbopen]
RetryTransaction {
set setup [FindOrCreateObject $db Setup /State/ServiceConfig]
set mykeys [dbobj $setup get EncryptionKeys]
}
dbclose $db
set foundkey 0
foreach key $mykeys {
set blowfishtag [string first ",1," $key]
if {$blowfishtag != -1} {
set keyid [string range $key 0 [expr $blowfishtag-1]]
set keyval [string range $key [expr $blowfishtag+3] end]
set keymatch "$keyid$Inc::TS_SKEY_EXT"
if {[lsearch $keyfiles $keymatch] != -1} {
putlog "Using type-1 Blowfish key $keyid"
puts "executing $Inc::TS_DECRYPT_PROG $keyval < $keymatch"
set sessionkey [eval exec $Inc::TS_DECRYPT_PROG $keyval < $keymatch]
puts "sessionkey: $sessionkey"
if {[string first 0x $sessionkey] != 0} {
putlog "Session key did not decrypt properly!"
} else {
putlog "Session key decrypted successfully"
set foundkey 1
}
}
}
set elgtag [string first ",2," $key]
if {$elgtag != -1} {
set keyid [string range $key 0 [expr $elgtag-1]]
set keyval [string range $key [expr $elgtag+3] end]
set keymatch "$keyid$Inc::TS_SKEY_EXT"
if {[lsearch $keyfiles $keymatch] != -1} {
putlog "Using type-2 ElGamal master key $keyid"
if {[catch {set sessionkey [eval exec $Inc::TS_KEY_PROG -x -ddm $keyval $keymatch]} oops]} {
putlog "Session key did not decrypt: $oops"
} else {
putlog "Session key decrypted successfully"
set foundkey 1
}
}
}
if {$foundkey} {
break;
}
}
if {!$foundkey} {
putlog "No key match!"
putlog "Bundle keylist is $keyfiles"
set havekeys "My keyring holds "
foreach key $mykeys {
set comma [string first "," $key]
if {$comma != 1} {
set keyid [string range $key 0 [expr $comma-1]]
set havekeys "$havekeys $keyid"
}
}
putlog $havekeys
cd $currentdir
error "Can't find a suitable key for this bundle"
}
putlog "Session unlocked"
foreach file [glob *$Inc::TS_CRYPT_EXT] {
set basefile [file rootname $file]
putlog "Decrypting $file to $basefile"
eval exec $Inc::TS_DECRYPT_PROG $sessionkey < $file > $basefile
file delete $file
}
foreach file [glob -nocomplain *$Inc::TS_BZIP_EXT] {
set basefile [file rootname $file]
set basepath "$targetdir/$basefile"
putlog "Decompressing $file to $basepath"
eval exec $Inc::TS_BUZIP_PROG < $file > $basepath
file delete $file
}
foreach file [glob -nocomplain *$Inc::TS_ZIP_EXT] {
set basefile [file rootname $file]
set basepath "$targetdir/$basefile"
putlog "Decompressing $file to $basepath"
eval exec $Inc::TS_UZIP_PROG < $file > $basepath
file delete $file
}
foreach file [glob -nocomplain *$Inc::TS_SIG_EXT] {
set basefile [file rootname $file]
set basepath "$targetdir/$basefile"
putlog "Moving $file to $basepath"
file copy $file $basepath
file delete $file
}
cd $currentdir
}
unbundle $argv