Modified:
/glade.c
/shacrypt.glade
=======================================
--- /glade.c Mon Nov 9 17:05:03 2009
+++ /glade.c Mon Nov 9 19:03:37 2009
@@ -452,7 +452,7 @@
g_free( step2 );
g_free( step3 );
- g_thread_create( encrypt_step3, NULL, FALSE, NULL );
+ g_thread_create( (GThreadFunc)encrypt_step3, NULL, FALSE, NULL );
} else {
GtkProgressBar* meter;
@@ -528,7 +528,7 @@
g_free( f );
}
- if ( strncmp( fbuf, identifier, 3 ) != 0 || fbuf[3] != '\2' ||
fbuf[4] != '\0' ) {
+ if ( strncmp( fbuf, identifier, 3 ) != 0 || fbuf[3] < '\1' || fbuf[3]
> '\2' || fbuf[4] != '\0' ) {
g_free( fbuf );
GtkWidget* invalid_file;
@@ -541,6 +541,18 @@
return;
}
+
+ GtkWidget* step1;
+ GtkWidget* step2;
+
+ step1 = GTK_WIDGET( gtk_builder_get_object( builder, "decrypt_step1" )
);
+ step2 = GTK_WIDGET( gtk_builder_get_object( builder, "decrypt_step2" )
);
+
+ gtk_widget_show( step2 );
+ gtk_widget_hide( step1 );
+
+ g_free( step1 );
+ g_free( step2 );
}
G_MODULE_EXPORT void decrypt_step1_cancel( GtkWidget* button, gpointer
data ) {
@@ -560,9 +572,155 @@
g_free( error );
}
+
+G_MODULE_EXPORT void decrypt_step3() {
+ GtkWindow* step3;
+ GtkEntry* pass;
+ GtkFileChooser* file;
+ GtkProgressBar* progress;
+
+ step3 = GTK_WINDOW( gtk_builder_get_object( builder, "decrypt_step3" )
);
+ pass = GTK_ENTRY( gtk_builder_get_object( builder, "field_d2_password"
) );
+ file = GTK_FILE_CHOOSER( gtk_builder_get_object(
builder, "file_d1_select" ) );
+ progress = GTK_PROGRESS_BAR( gtk_builder_get_object(
builder, "progressbar_d3_progress" ) );
+
+ gtk_progress_bar_set_text( progress, NULL );
+ gtk_window_set_deletable( step3, FALSE );
+
+ FILE* f;
+ FILE* o;
+ unsigned long i, size, n;
+ SHACrypt_Context s;
+ unsigned char algos = '\0',
+ randlen = '\0';
+ static char fbuf[256] = {0},
+ obuf[256] = {0};
+ char** filename = g_strsplit( gtk_file_chooser_get_filename( file
), ".", -1 );
+ char* filename_prefix;
+ char* filename_suffix;
+ char* tmp;
+
+ g_free( file );
+
+ f = fopen( g_strjoinv( ".", filename ), "rb" );
+
+ i = g_strv_length( filename );
+
+ if ( i == 2 ) {
+ filename_suffix = "";
+ filename_prefix = g_strdup( filename[0] );
+ } else {
+ n = strlen( filename[i - 1] ) + strlen( filename[i - 2] ) + 2;
+
+printf( "0\n" );
+ filename_suffix = g_strconcat( ".", filename[i - 2], NULL );
+
+printf( "1\n" );
+
+ tmp = g_strjoinv( ".", filename );
+ filename_prefix = g_strndup( tmp, strlen( tmp ) - n );
+ g_free( tmp );
+
+printf( "2\n" );
+ }
+ g_strfreev( filename );
+
+ tmp = g_strdup_printf( "%s%s", filename_prefix, filename_suffix );
+
+
+ i = 0;
+ while ( fopen( tmp, "rb" ) != NULL ) {
+ g_free( tmp );
+ i++;
+ tmp = g_strdup_printf( "%s_%lu%s", filename_prefix, i,
filename_suffix );
+ }
+
+ o = fopen( tmp, "wb" );
+
+ g_free( tmp );
+ g_free( filename_prefix );
+ g_free( filename_suffix );
+
+ fread( fbuf, 1, 5, f );
+
+printf( "5\n" );
+
+ if ( fbuf[3] == '\1' ) {
+ randlen = '\x13';
+ fread( fbuf, 1, 20, f );
+ algos = '\x01';
+ }
+ if ( fbuf[3] == '\2' ) {
+ randlen = fgetc( f );
+ fread( fbuf, 1, (int)randlen + 1, f );
+ algos = fgetc( f );
+ }
+
+ SHACrypt_Init( &s, g_strdup( gtk_entry_get_text( pass ) ),
gtk_entry_get_text_length( pass ), algos, fbuf, (int)randlen + 1 );
+
+ gtk_entry_set_text( pass, "" );
+
+ g_free( pass );
+
+ i = ftell( f );
+ fseek( f, 0, SEEK_END );
+ size = ftell( f ) - i;
+ fseek( f, i, SEEK_SET );
+
+ i = 0;
+ /* Do the actual encryption */
+ while ( ( n = fread( fbuf, 1, 256, f ) ) > 0 ) {
+ i += n;
+
+ gtk_progress_bar_set_fraction( progress, (double)i / size );
+
+ SHACrypt_Process( &s, fbuf, obuf, n );
+
+ fwrite( obuf, 1, n, o );
+ }
+
+ fclose( f );
+ fclose( o );
+
+ g_free( f );
+ g_free( o );
+ g_free( fbuf );
+ g_free( obuf );
+
+ gtk_progress_bar_set_text( progress, "Done!" );
+ gtk_window_set_deletable( step3, TRUE );
+
+ g_free( progress );
+ g_free( step3 );
+}
G_MODULE_EXPORT void decrypt_step2_ok( GtkWidget* button, gpointer data ) {
- // TODO: Finish decryption
+ GtkEntry* pass;
+
+ pass = GTK_ENTRY( gtk_builder_get_object( builder, "field_d2_password"
) );
+
+ if ( !gtk_entry_get_text_length( pass ) ) {
+ gtk_widget_grab_focus( GTK_WIDGET( pass ) );
+
+ g_free( pass );
+
+ return;
+ }
+ g_free( pass );
+
+ GtkWidget* step2;
+ GtkWidget* step3;
+
+ step2 = GTK_WIDGET( gtk_builder_get_object( builder, "decrypt_step2" )
);
+ step3 = GTK_WIDGET( gtk_builder_get_object( builder, "decrypt_step3" )
);
+
+ gtk_widget_show( step3 );
+ gtk_widget_hide( step2 );
+
+ g_free( step2 );
+ g_free( step3 );
+
+ g_thread_create( (GThreadFunc)decrypt_step3, NULL, FALSE, NULL );
}
G_MODULE_EXPORT void decrypt_step2_cancel( GtkWidget* button, gpointer
data ) {
@@ -599,6 +757,8 @@
g_free( error );
return 1;
}
+
+ g_free( error );
window = GTK_WIDGET( gtk_builder_get_object( builder, "main" ) );
=======================================
--- /shacrypt.glade Mon Nov 9 17:05:03 2009
+++ /shacrypt.glade Mon Nov 9 19:03:37 2009
@@ -919,7 +919,7 @@
<property name="window_position">center-on-parent</property>
<property name="type_hint">dialog</property>
<property name="deletable">False</property>
- <property name="transient_for">encrypt_step2</property>
+ <property name="transient_for">decrypt_step2</property>
<signal name="delete_event" handler="gtk_widget_hide_on_delete"/>
<child>
<object class="GtkVBox" id="vbox6">