/* // File: /cmds/file/_decrypt.c // V1.0: 93-04-08 // Author: Pallando (Douglas Reay) // Mudlib: TMI */ #include <mudlib.h> inherit DAEMON; #define SYNTAX "Syntax: decrypt [-d ]<file> <key>\n" #define LOW 33 #define HIGH 126 // Would use 0 - 255 but read_file() reads ctrl's as spaces. 8-( static void do_decrypt( mixed a ); static void save_file( mixed a ); int cmd_decrypt( mixed a ) { string oldfile, filename, key, euid, del; object player; mixed tmp; int j, sj; player = this_player(); euid = geteuid( previous_object() ); seteuid( euid ); if( a && sscanf( a, "-d %s", del ) ) a = del; if( !a || sscanf( a, "%s %s", filename, key ) < 2 ) { notify_fail( SYNTAX ); return 0; } filename += ".x"; filename = resolv_path( "cwd", filename ); if( file_size( filename ) < 0 ) { notify_fail( filename + " is not a file.\n" ); return 0; } oldfile = read_file( filename ); if( !oldfile ) { notify_fail( filename + " is empty.\n" ); return 0; } sj = strlen( key ); tmp = ({ }); for( j = 0 ; j < sj ; j++ ) tmp += ({ key[j] - 97 }); tmp += ({ 3, 4, 2, 17, 24, 15, 19 }); a = ({ oldfile, "", tmp, 0, strlen( oldfile ), filename, euid, player, del }); // ({ oldfile, newfile, key, i, s, filename, euid, player, del }) write( "Decryption started... ("+a[4]+" lines)\n" ); do_decrypt( a ); return 1; } static void do_decrypt( mixed a ) { int i, s, k, *key; string newfile, oldfile; oldfile = a[0]; newfile = a[1]; key = a[2]; i = a[3]; s = i + 1000; if( s > a[4] ) s = a[4]; for( ; i < s ; i++ ) { k = oldfile[i]; if( ( k < LOW ) || ( k > HIGH ) ) { newfile += oldfile[i..i]; } else { k -= key[(i - 3*(i/3) )]; k -= key[(i - 7*(i/7) )]; if( k < LOW ) k += (HIGH - LOW); newfile += sprintf( "%c", k ); } } a[1] = newfile; a[3] = i; if( s == a[4] ) save_file( a ); else { call_out( "do_decrypt", 1, a ); if( a[7] ) tell_object( a[7], i + "...\n" ); } } static void save_file( mixed a ) { string newfile, filename, euid, del; object player; newfile = a[1]; filename = a[5]; euid = a[6]; player = a[7]; del = a[8]; seteuid( euid ); if( del ) rm( filename ); sscanf( filename, "%s.x", filename ); rm( filename ); write_file( filename, newfile ); if( player ) tell_object( player, "Decrypted version written to " + filename + "\n" ); } string help() { return( SYNTAX + "Effect: decrypts file <file>.x to <file>\n"+ " <key> is the password you must use to decrypt it.\n"+ " If -d is specified, <file>.x is deleted.\n"+ "Characters are decrypted at a rate of 1000 per second.\n"+ "" ); }