Bugfixing and Accounts in Configfile
This commit is contained in:
		
							
								
								
									
										27
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								src/main.c
									
									
									
									
									
								
							| @@ -310,12 +310,14 @@ int main(int argc, char *argv[]) { | ||||
|   xmppc_mode_t mode = UNKOWN; | ||||
|   char *jid = NULL; | ||||
|   char *pwd = NULL; | ||||
|   char *account = NULL; | ||||
|  | ||||
|   static struct option long_options[] = { | ||||
|       /* These options set a flag. */ | ||||
|       {"verbose", no_argument, &verbose_flag, 1}, | ||||
|       {"help", no_argument, 0, 'h'}, | ||||
|       {"config", required_argument, 0, 'c'}, | ||||
|       {"account", required_argument, 0, 'a'}, | ||||
|       {"jid", required_argument, 0, 'j'}, | ||||
|       {"pwd", required_argument, 0, 'p'}, | ||||
|       {"mode", required_argument, 0, 'm'}, | ||||
| @@ -324,7 +326,7 @@ int main(int argc, char *argv[]) { | ||||
|   while (c > -1) { | ||||
|     int option_index = 0; | ||||
|  | ||||
|     c = getopt_long(argc, argv, "hvj:p:m:", long_options, &option_index); | ||||
|     c = getopt_long(argc, argv, "hva:j:p:m:", long_options, &option_index); | ||||
|     if (c > -1) { | ||||
|       switch (c) { | ||||
|       case 'h': | ||||
| @@ -339,6 +341,11 @@ int main(int argc, char *argv[]) { | ||||
|         printf("option -f with value `%s'\n", optarg); | ||||
|         break; | ||||
|  | ||||
|       case 'a': | ||||
|         account = malloc(strlen(optarg) + 1); | ||||
|         strcpy(account, optarg); | ||||
|         break; | ||||
|  | ||||
|       case 'j': | ||||
|         jid = malloc(strlen(optarg) + 1); | ||||
|         strcpy(jid, optarg); | ||||
| @@ -390,8 +397,11 @@ int main(int argc, char *argv[]) { | ||||
|   } else { | ||||
|     if(jid == NULL && pwd == NULL) {  | ||||
|       logInfo(&xmppc,"Loading default account\n"); | ||||
|       jid = g_key_file_get_value (config_file, "default", "jid" ,&error); | ||||
|       pwd = g_key_file_get_value (config_file, "default", "pwd" ,&error); | ||||
|       if( account == NULL ) { | ||||
|         account = "default"; | ||||
|       } | ||||
|       jid = g_key_file_get_value (config_file, account, "jid" ,&error); | ||||
|       pwd = g_key_file_get_value (config_file, account, "pwd" ,&error); | ||||
|     } | ||||
|   } | ||||
|  | ||||
| @@ -434,12 +444,13 @@ static void _show_help() { | ||||
| #else | ||||
|   printf("%s\n", PACKAGE_STRING); | ||||
| #endif | ||||
|   printf("Usage: xmppc --jid <jid> --pwd <pwd> --mode <mode> <command> <parameters>\n"); | ||||
|   printf("Usage: xmppc --account <account> --jid <jid> --pwd <pwd> --mode <mode> <command> <parameters>\n"); | ||||
|   printf("Options:\n"); | ||||
|   printf("  -h / --help             Display this information.\n"); | ||||
|   printf("  -j / --jid <jid>        Jabber ID\n"); | ||||
|   printf("  -p / --pwd <password>   Passwort\n"); | ||||
|   printf("  -m / --mode <mode>      xmppc mode\n"); | ||||
|   printf("  -h / --help                Display this information.\n"); | ||||
|   printf("  -j / --jid <jid>           Jabber ID\n"); | ||||
|   printf("  -p / --pwd <password>      Passwort\n"); | ||||
|   printf("  -a / --account <account>   Passwort\n"); | ||||
|   printf("  -m / --mode <mode>         xmppc mode\n"); | ||||
|   printf("\n"); | ||||
|   printf("Modes:\n"); | ||||
|   printf("  -m --mode roster      xmppc roster mode\n"); | ||||
|   | ||||
| @@ -44,7 +44,6 @@ | ||||
| #include "stdio.h" | ||||
| #include "string.h" | ||||
|  | ||||
|  | ||||
| static int _monitor_log_stanza(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata); | ||||
| static int _monitor_show_microblog(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata); | ||||
|  | ||||
| @@ -98,11 +97,7 @@ int _monitor_log_stanza(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, vo | ||||
| } | ||||
|  | ||||
| /* XEP-0277: Microblogging over XMPP */ | ||||
|  | ||||
| int _monitor_show_microblog(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata){ | ||||
|  | ||||
|  | ||||
|  | ||||
|   xmpp_stanza_t *log = stanza; | ||||
|   if(strcmp(xmpp_stanza_get_name(stanza), "message") == 0 ) { | ||||
|     xmpp_stanza_t* event = xmpp_stanza_get_child_by_name(stanza, "event"); | ||||
|   | ||||
| @@ -81,6 +81,10 @@ void _openpgp_send_text(xmppc_t *xmppc, char* to, char* text) { | ||||
|     size_t s; | ||||
|     xmpp_stanza_to_text(signcrypt, &c,&s); | ||||
|     char* signcrypt_e = _openpgp_gpg_signcrypt(xmppc,to, c); | ||||
|     if( signcrypt_e == NULL ) { | ||||
|       logError(xmppc, "Message not signcrypted.\n"); | ||||
|       return; | ||||
|     }  | ||||
|     // BASE64_OPENPGP_MESSAGE | ||||
|     xmpp_stanza_t* base64_openpgp_message = xmpp_stanza_new(xmppc->ctx); | ||||
|     xmpp_stanza_set_text(base64_openpgp_message,signcrypt_e); | ||||
| @@ -99,8 +103,6 @@ xmpp_stanza_t* _openpgp_signcrypt(xmppc_t *xmppc, char* to, char* text) { | ||||
|   struct tm* tm = localtime(&now); | ||||
|   char buf[255]; | ||||
|   strftime(buf, sizeof(buf), "%FT%T%z", tm); | ||||
|   printf("%s\n",buf); | ||||
|  | ||||
|     int randnr = rand() % 5; | ||||
|     char rpad_data[randnr]; | ||||
|     for(int i = 0; i < randnr-1; i++) { | ||||
| @@ -108,26 +110,32 @@ xmpp_stanza_t* _openpgp_signcrypt(xmppc_t *xmppc, char* to, char* text) { | ||||
|     } | ||||
|     rpad_data[randnr-1] = '\0'; | ||||
|      | ||||
|  | ||||
|     // signcrypt | ||||
|     xmpp_stanza_t *signcrypt = xmpp_stanza_new(xmppc->ctx); | ||||
|     xmpp_stanza_set_name(signcrypt, "signcrypt"); | ||||
|     xmpp_stanza_set_ns(signcrypt, "urn:xmpp:openpgp:0"); | ||||
|     // to | ||||
|     xmpp_stanza_t *s_to = xmpp_stanza_new(xmppc->ctx); | ||||
|     xmpp_stanza_set_name(s_to, "to"); | ||||
|     xmpp_stanza_set_attribute(s_to, "jid", to); | ||||
|     // time | ||||
|     xmpp_stanza_t *time = xmpp_stanza_new(xmppc->ctx); | ||||
|     xmpp_stanza_set_name(time, "time"); | ||||
|     xmpp_stanza_set_attribute(time, "stamp", buf); | ||||
|     xmpp_stanza_set_name(time, "time"); | ||||
|     // rpad | ||||
|     xmpp_stanza_t *rpad = xmpp_stanza_new(xmppc->ctx); | ||||
|     xmpp_stanza_set_name(rpad, "rpad"); | ||||
|     xmpp_stanza_t *rpad_text = xmpp_stanza_new(xmppc->ctx); | ||||
|     xmpp_stanza_set_text(rpad_text, rpad_data); | ||||
|     // payload | ||||
|     xmpp_stanza_t *payload= xmpp_stanza_new(xmppc->ctx); | ||||
|     xmpp_stanza_set_name(payload, "payload"); | ||||
|     // body | ||||
|     xmpp_stanza_t *body = xmpp_stanza_new(xmppc->ctx); | ||||
|     xmpp_stanza_set_name(body, "body"); | ||||
|     xmpp_stanza_set_ns(body, "jabber:client"); | ||||
|     // text | ||||
|     xmpp_stanza_t *body_text = xmpp_stanza_new(xmppc->ctx); | ||||
|     xmpp_stanza_set_text(body_text, text); | ||||
|     xmpp_stanza_add_child(signcrypt,s_to); | ||||
| @@ -137,8 +145,8 @@ xmpp_stanza_t* _openpgp_signcrypt(xmppc_t *xmppc, char* to, char* text) { | ||||
|     xmpp_stanza_add_child(signcrypt,payload); | ||||
|     xmpp_stanza_add_child(payload, body); | ||||
|     xmpp_stanza_add_child(body, body_text); | ||||
|     return signcrypt; | ||||
|  | ||||
|     return signcrypt; | ||||
| } | ||||
|  | ||||
| char* _openpgp_gpg_signcrypt(xmppc_t *xmppc, char* recipient, char* message) { | ||||
| @@ -176,14 +184,18 @@ char* _openpgp_gpg_signcrypt(xmppc_t *xmppc, char* recipient, char* message) { | ||||
|   strcat(xmpp_jid_me, jid); | ||||
|   strcat(xmpp_jid_recipient,recipient); | ||||
|  | ||||
|   // lookup own key | ||||
|   error = _openpgp_lookup_key(xmppc,xmpp_jid_me, &ctx, &recp[0]); | ||||
|   if(error != 0) { | ||||
|     logError(xmppc,"GpgME Error: %s\n", gpgme_strerror(error));   | ||||
|     logError(xmppc,"Key not found for %s. GpgME Error: %s\n", xmpp_jid_me, gpgme_strerror(error)); | ||||
|     return NULL; | ||||
|   } | ||||
|  | ||||
|   // lookup key of recipient | ||||
|   error = _openpgp_lookup_key(xmppc,xmpp_jid_recipient, &ctx, &recp[1]); | ||||
|   if(error != 0) { | ||||
|     logError(xmppc,"GpgME Error: %s\n", gpgme_strerror(error));   | ||||
|     logError(xmppc,"Key not found for %s. GpgME Error: %s\n", xmpp_jid_recipient, gpgme_strerror(error)); | ||||
|     return NULL; | ||||
|   } | ||||
|   recp[2] = NULL; | ||||
|   logInfo(xmppc, "%s <%s>\n", recp[0]->uids->name, recp[0]->uids->email); | ||||
| @@ -201,20 +213,24 @@ char* _openpgp_gpg_signcrypt(xmppc_t *xmppc, char* recipient, char* message) { | ||||
|   error = gpgme_data_new (&plain); | ||||
|   if(error != 0) { | ||||
|     logError(xmppc,"GpgME Error: %s\n", gpgme_strerror(error));   | ||||
|     return NULL; | ||||
|   } | ||||
|  | ||||
|   error = gpgme_data_new_from_mem(&plain, message, strlen(message),0); | ||||
|   if(error != 0) { | ||||
|     logError(xmppc,"GpgME Error: %s\n", gpgme_strerror(error));   | ||||
|     return NULL; | ||||
|   } | ||||
|   error = gpgme_data_new (&cipher);   | ||||
|   if(error != 0) { | ||||
|     logError(xmppc,"GpgME Error: %s\n", gpgme_strerror(error));   | ||||
|     return NULL; | ||||
|   } | ||||
|  | ||||
|   error = gpgme_op_encrypt_sign ( ctx, recp, flags, plain, cipher); | ||||
|   if(error != 0) { | ||||
|     logError(xmppc,"GpgME Error: %s\n", gpgme_strerror(error));   | ||||
|     return NULL; | ||||
|   } | ||||
|  | ||||
|   size_t len; | ||||
| @@ -231,11 +247,9 @@ gpgme_error_t _openpgp_lookup_key(xmppc_t *xmppc,char* name, gpgme_ctx_t* ctx, g | ||||
|   gpgme_error_t error = gpgme_op_keylist_start (*ctx, NULL, 0); | ||||
|   while (!error) { | ||||
|     error = gpgme_op_keylist_next (*ctx, key); | ||||
|     if(strcmp((*key)->uids->name, name) == 0) { | ||||
|     if(error == 0 && strcmp((*key)->uids->name, name) == 0) { | ||||
|       logDebug(xmppc, "Key found: %s ...\n", (*key)->uids->name); | ||||
|       return error; | ||||
|     } | ||||
|     else { | ||||
|     } else { | ||||
|       gpgme_key_release((*key)); | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -49,7 +49,6 @@ | ||||
| #include <stdlib.h> | ||||
| #include <gpgme.h> | ||||
|  | ||||
|  | ||||
| #define PGP_BEGIN "-----BEGIN PGP MESSAGE-----" | ||||
| #define PGP_END   "-----END PGP MESSAGE-----" | ||||
|  | ||||
| @@ -81,7 +80,8 @@ void _pgp_send_text(xmppc_t *xmppc, char* to, char* text) { | ||||
|     xmpp_stanza_set_ns(x, "jabber:x:encrypted"); | ||||
|     xmpp_stanza_t *b = xmpp_stanza_new(xmppc->ctx); | ||||
|     char* encrypt_text = _pgp_encrypt_message(xmppc, to,text); | ||||
|     if(text == NULL) { | ||||
|     if(encrypt_text == NULL) { | ||||
|       logError(xmppc,"Encrypting of message failed.\n"); | ||||
|       return; | ||||
|     } | ||||
|     xmpp_stanza_set_text(b,encrypt_text); | ||||
| @@ -107,15 +107,32 @@ char* _pgp_encrypt_message(xmppc_t *xmppc, char* recipient, char* message) { | ||||
|     return NULL; | ||||
|   } | ||||
|   error = gpgme_set_protocol(ctx, GPGME_PROTOCOL_OPENPGP); | ||||
|   if(error != 0) { | ||||
|     logError(xmppc,"GpgME Error: %s\n", gpgme_strerror(error));   | ||||
|   } | ||||
|   gpgme_set_armor(ctx,1); | ||||
|   gpgme_set_textmode(ctx,1); | ||||
|   gpgme_set_offline(ctx,1); | ||||
|   gpgme_set_keylist_mode(ctx, GPGME_KEYLIST_MODE_LOCAL); | ||||
|  | ||||
|   gpgme_key_t recp[3]; | ||||
|  | ||||
|   // Key for sender | ||||
|   const char *jid = xmpp_conn_get_jid(xmppc->conn); | ||||
|   logInfo(xmppc, "Looking up pgp key for %s\n", jid); | ||||
|   error = gpgme_get_key(ctx, jid, &(recp[0]), 0); | ||||
|   if(error != 0) { | ||||
|     logError(xmppc,"Public key not found for %s. GpgME Error: %s\n", jid, gpgme_strerror(error)); | ||||
|     return NULL; | ||||
|   } | ||||
|  | ||||
|   // Key for recipient | ||||
|   logInfo(xmppc, "Looking up pgp key for %s\n", recipient); | ||||
|   error = gpgme_get_key(ctx, recipient, &(recp[1]), 0); | ||||
|   if(error != 0) { | ||||
|     logError(xmppc,"Key not found for %s. GpgME Error: %s\n", recipient, gpgme_strerror(error)); | ||||
|     return NULL; | ||||
|   } | ||||
|   recp[2] = NULL; | ||||
|    | ||||
|   logInfo(xmppc, "%s <%s>\n", recp[0]->uids->name, recp[0]->uids->email); | ||||
| @@ -126,11 +143,23 @@ char* _pgp_encrypt_message(xmppc_t *xmppc, char* recipient, char* message) { | ||||
|   gpgme_data_t cipher; | ||||
|  | ||||
|   error = gpgme_data_new (&plain); | ||||
|   if(error != 0) { | ||||
|     logError(xmppc,"GpgME Error: %s\n", gpgme_strerror(error));   | ||||
|   } | ||||
|  | ||||
|   error = gpgme_data_new_from_mem(&plain, message, strlen(message),0); | ||||
|   if(error != 0) { | ||||
|     logError(xmppc,"GpgME Error: %s\n", gpgme_strerror(error));   | ||||
|   } | ||||
|   error = gpgme_data_new (&cipher);   | ||||
|   if(error != 0) { | ||||
|     logError(xmppc,"GpgME Error: %s\n", gpgme_strerror(error));   | ||||
|   } | ||||
|  | ||||
|   error = gpgme_op_encrypt ( ctx, recp, flags, plain, cipher); | ||||
|   if(error != 0) { | ||||
|     logError(xmppc,"GpgME Error: %s\n", gpgme_strerror(error));   | ||||
|   } | ||||
|   size_t len; | ||||
|   char *cipher_str = gpgme_data_release_and_get_mem(cipher, &len); | ||||
|   char* result = NULL; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 DebXWoody
					DebXWoody