Moved xmppc 0.0.3 to Anoxinon Repository
This commit is contained in:
		
							
								
								
									
										445
									
								
								src/main.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										445
									
								
								src/main.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,445 @@ | ||||
| /*! | ||||
|  * @file main.c | ||||
|  * | ||||
|  * vim: expandtab:ts=2:sts=2:sw=2 | ||||
|  * | ||||
|  * @authors | ||||
|  * Copyright (C) 2020 Anoxinon e.V. | ||||
|  * | ||||
|  * @copyright | ||||
|  * This file is part of xmppc. | ||||
|  * | ||||
|  * xmppc is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * xmppc is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Foobar.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * German | ||||
|  * | ||||
|  * Diese Datei ist Teil von xmppc. | ||||
|  * | ||||
|  * xmppc ist Freie Software: Sie können es unter den Bedingungen | ||||
|  * der GNU General Public License, wie von der Free Software Foundation, | ||||
|  * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren | ||||
|  * veröffentlichten Version, weiter verteilen und/oder modifizieren. | ||||
|  * | ||||
|  * xmppc wird in der Hoffnung, dass es nützlich sein wird, aber | ||||
|  * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite | ||||
|  * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. | ||||
|  * Siehe die GNU General Public License für weitere Details. | ||||
|  * | ||||
|  * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem | ||||
|  * Programm erhalten haben. Wenn nicht, siehe <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| /*! | ||||
|  * @mainpage xmppc - XMPP command line | ||||
|  * | ||||
|  * @section whatIsXmppc What is xmppc | ||||
|  * | ||||
|  * xmppc is a command line program for XMPP (https://xmpp.org/). | ||||
|  * The program has been written for the Debian GNU/Linux system (https://www.debian.org/). | ||||
|  * | ||||
|  * @section build Build | ||||
|  * | ||||
|  * @subsection dependencies Dependencies | ||||
|  * | ||||
|  * - The GNU C Library (glibc) - 2.28-10 | ||||
|  * - GLib - 2.58.3 | ||||
|  * - XMPP library libstrophe - 0.9.2-2 | ||||
|  * - GPGME (GnuPG Made Easy) - 1.12.0-6 | ||||
|  * | ||||
|  * @subsection compile Compile | ||||
|  * | ||||
|  * @code{.bash} | ||||
|  * ./bootstrap.sh | ||||
|  * ./configure | ||||
|  * make | ||||
|  * @endcode | ||||
|  * | ||||
|  * @subsection documentation Documentation | ||||
|  * @code{.bash} | ||||
|  * cd doc | ||||
|  * make | ||||
|  * @endcode | ||||
|  * @section usage Usage | ||||
|  * | ||||
|  * @code{.bash} | ||||
|  * xmppc --jid <jabberid> --pwd <secret> --mode <mode> <command> <command args> | ||||
|  * @endcode | ||||
|  * | ||||
|  * @code{.bash} | ||||
|  * xmppc --jid user@domain.tld --pwd "my secret" --mode pgp chat friend@domain.tld "Hello!" | ||||
|  * xmppc --jid user@domain.tld --pwd $(pass XMPP/domain/user) --mode omemo list | ||||
|  * @endcode | ||||
|  * | ||||
|  * | ||||
|  * @section development Development | ||||
|  * | ||||
|  * - \subpage module | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| /*! | ||||
|  * \page module Modules | ||||
|  * | ||||
|  * \section account Account | ||||
|  * \section roster Roster | ||||
|  * \section message Message | ||||
|  * \section muc Multi-User-Chat | ||||
|  * \section omemo OMEMO | ||||
|  * XEP-0384: OMEMO Encryption (Version 0.3.0 (2018-07-31)). xmppc can use used | ||||
|  * to request the users OMEMO Device ID List and displays the Fingerprints of | ||||
|  * the keys. | ||||
|  * | ||||
|  * @code{.bash} | ||||
|  * xmppc --jid user@domain.tld --pwd $(pass domain.tld/user) --mode omemo | ||||
|  * @endcode | ||||
|  * | ||||
|  * @code{.bash} | ||||
|  * xmppc --jid user@domain.tld --pwd $(pass domain.tld/user) --mode omemo| gpg --clear-sign --sign-with 123ABC_MY_OPENPGP_KEY_1234 > omemo.asc | ||||
|  * @endcode | ||||
|  * | ||||
|  * | ||||
|  * \section pgp PGP | ||||
|  * XEP-0027: Current Jabber OpenPGP Usage | ||||
|  * (https://xmpp.org/extensions/xep-0027.html) is obsolete, but there are still | ||||
|  * clients which supports XEP-0027 instead of XEP-0373 / XEP-0374. This module | ||||
|  * supports sending of OpenPGP encrypted messages via XMPP's XEP-0027. | ||||
|  * | ||||
|  * @code{.bash} | ||||
|  * xmppc --jid user@domain.tld --pwd "my secret" --mode pgp friend@domain.tld "Hello!" | ||||
|  * @endcode | ||||
|  * | ||||
|  * xmppc use GnuPG's GPGME API use lookup the own key and the key of the | ||||
|  * recipient. Those two keys will be used to encrypt the message. | ||||
|  * | ||||
|  * Details \subpage module-pgp | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #include "config.h" | ||||
| #include <assert.h> | ||||
| #include <getopt.h> | ||||
| #include <stdarg.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <strophe.h> | ||||
|  | ||||
| #include "xmppc.h" | ||||
| #include "mode/account.h" | ||||
| #include "mode/message.h" | ||||
| #include "mode/muc.h" | ||||
| #include "mode/omemo.h" | ||||
| #include "mode/roster.h" | ||||
| #include "mode/pgp.h" | ||||
| #include "mode/openpgp.h" | ||||
| #include "mode/monitor.h" | ||||
|  | ||||
| /*! | ||||
|  * @brief The callback structure. | ||||
|  * | ||||
|  * This struct is used to call the "execution"-function of the mode module (e.g | ||||
|  * account_execute_command, roster_execute_command, ...). | ||||
|  * | ||||
|  * @authors DebxWoody | ||||
|  * @since 0.0.2 | ||||
|  * @version 1 | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| typedef struct { | ||||
|   /*! Size of arguments */ | ||||
|   int argc; | ||||
|   /*! Array of C-Strings (arguments) with size of argc */ | ||||
|   char **argv; | ||||
|   /*! Pointer to Execute-Handler */ | ||||
|   ExecuteHandler callback; | ||||
|   /*! XMPPC context object */ | ||||
|   xmppc_t *xmppc; | ||||
| } callback_t; | ||||
|  | ||||
| /*! | ||||
|  * @brief Mode Mapping. | ||||
|  * | ||||
|  * This struct is used to provider the mapping of the mode name (name via | ||||
|  * command line interface of the user (e.g. -m account). The technical ID of the | ||||
|  * mode which is defined via enum xmppc_mode_t and the pointer of function which | ||||
|  * should be used to handle those mode. | ||||
|  * | ||||
|  * @authors DebxWoody | ||||
|  * @since 0.0.2 | ||||
|  * @version 1 | ||||
|  */ | ||||
|  | ||||
| struct mode_mapping { | ||||
|   const char *name; | ||||
|   xmppc_mode_t mode; | ||||
|   ExecuteHandler callback; | ||||
| }; | ||||
|  | ||||
| /*! | ||||
|  * @brief Mode mapping table. | ||||
|  * | ||||
|  * Mapping of mode's string, enum and function. | ||||
|  * | ||||
|  * @authors DebxWoody | ||||
|  * @since 0.0.2 | ||||
|  * @version 1 | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| static struct mode_mapping map[] = { | ||||
|   /*! | ||||
|   * Account Mode Mapping | ||||
|   * @since 0.0.2 | ||||
|   * @version 1 | ||||
|   */ | ||||
|   {"account", ACCOUNT, account_execute_command}, | ||||
|   /*! | ||||
|   * roster Mode Mapping | ||||
|   * @since 0.0.2 | ||||
|   * @version 1 | ||||
|   */ | ||||
|   {"roster", ROSTER, roster_execute_command}, | ||||
|   /*! | ||||
|   * Message Mode Mapping | ||||
|   * @since 0.0.2 | ||||
|   * @version 1 | ||||
|   */ | ||||
|   {"message", MESSAGE, message_execute_command}, | ||||
|   /*! | ||||
|   * MUC Mode Mapping | ||||
|   * @since 0.0.2 | ||||
|   * @version 1 | ||||
|   */ | ||||
|   {"muc", MUC, muc_execute_command}, | ||||
|   /*! | ||||
|   * OMEMO Mode Mapping | ||||
|   * @since 0.0.2 | ||||
|   * @version 1 | ||||
|   */ | ||||
|   {"omemo", OMEMO, omemo_execute_command}, | ||||
|   /*! | ||||
|   * PGP Mode Mapping | ||||
|   * @since 0.0.2 | ||||
|   * @version 1 | ||||
|   */ | ||||
|   {"pgp", PGP, pgp_execute_command}, | ||||
|   /*! | ||||
|   * XEP-0373: OpenPGP for XMPP | ||||
|   */ | ||||
|   {"openpgp", OPENPGP, openpgp_execute_command}, | ||||
|   /*! | ||||
|   * Monitor | ||||
|   */ | ||||
|   {"monitor", MONITOR, monitor_execute_command}, | ||||
|   // End of Map | ||||
|   {NULL, 0} | ||||
| }; | ||||
|  | ||||
| /*! | ||||
|  * \brief Connection Handler Callback of libstrophe. | ||||
|  * | ||||
|  * This function will be called by libstrophe. | ||||
|  * | ||||
|  * \param conn See libstrophe documentation | ||||
|  * \param status See libstrophe documentation | ||||
|  * \param error See libstrophe documentation | ||||
|  * \param stream_error See libstrophe documentation | ||||
|  * | ||||
|  * \param userdata callback_t object for the mode request by user. | ||||
|  * | ||||
|  * @authors DebxWoody | ||||
|  * @since 0.0.2 | ||||
|  * @version 1 | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| void conn_handler(xmpp_conn_t *const conn, const xmpp_conn_event_t status, | ||||
|                   const int error, xmpp_stream_error_t *const stream_error, | ||||
|                   void *const userdata) { | ||||
|   callback_t *callback = (callback_t *)userdata; | ||||
|  | ||||
|   if (status == XMPP_CONN_CONNECT) { | ||||
|     logInfo(callback->xmppc, "Connected\n"); | ||||
|     callback->callback(callback->xmppc, callback->argc, callback->argv); | ||||
|   } else { | ||||
|     xmpp_stop(xmpp_conn_get_context(conn)); | ||||
|   } | ||||
| } | ||||
|  | ||||
| static void _show_help(); | ||||
|  | ||||
| /*! | ||||
|  * \brief C-Main function | ||||
|  * | ||||
|  * - Parse argv arguments of the command line. | ||||
|  * - Checks jid and password for xmpp logging | ||||
|  * - Checks mode requested by user | ||||
|  * - All other arguments will be used as mode parameters | ||||
|  * | ||||
|  * \param argc Arguments counter | ||||
|  * \param argv Arguments vector | ||||
|  * \returns Exit Code | ||||
|  * | ||||
|  * @authors DebxWoody | ||||
|  * @since 0.0.2 | ||||
|  * @version 2 | ||||
|  */ | ||||
|  | ||||
| int main(int argc, char *argv[]) { | ||||
| #if XMPPC_DEVELOPMENT | ||||
|   printf("!!! WARNING: XMPPC is running in development mode !!!\n"); | ||||
| #endif | ||||
|  | ||||
|   INIT_XMPPC(xmppc); | ||||
|  | ||||
|   static int verbose_flag = 0; | ||||
|   int c = 0; | ||||
|   xmppc_mode_t mode = UNKOWN; | ||||
|   char *jid = NULL; | ||||
|   char *pwd = 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'}, | ||||
|       {"jid", required_argument, 0, 'j'}, | ||||
|       {"pwd", required_argument, 0, 'p'}, | ||||
|       {"mode", required_argument, 0, 'm'}, | ||||
|       {"file", required_argument, 0, 'f'}, | ||||
|       {0, 0, 0, 0}}; | ||||
|   while (c > -1) { | ||||
|     int option_index = 0; | ||||
|  | ||||
|     c = getopt_long(argc, argv, "hvj:p:m:", long_options, &option_index); | ||||
|     if (c > -1) { | ||||
|       switch (c) { | ||||
|       case 'h': | ||||
|         _show_help(); | ||||
|         return EXIT_SUCCESS; | ||||
|  | ||||
|       case 'c': | ||||
|         printf("option -c with value `%s'\n", optarg); | ||||
|         break; | ||||
|  | ||||
|       case 'f': | ||||
|         printf("option -f with value `%s'\n", optarg); | ||||
|         break; | ||||
|  | ||||
|       case 'j': | ||||
|         jid = malloc(strlen(optarg) + 1); | ||||
|         strcpy(jid, optarg); | ||||
|         break; | ||||
|  | ||||
|       case 'p': | ||||
|         pwd = malloc(strlen(optarg) + 1); | ||||
|         strcpy(pwd, optarg); | ||||
|         break; | ||||
|  | ||||
|       case 'm': | ||||
|         for(int i = 0; map[i].name;i++ ) { | ||||
|           if (strcmp(optarg, map[i].name) == 0) { | ||||
|             mode = map[i].mode; | ||||
|             break; | ||||
|           } | ||||
|         } | ||||
|         break; | ||||
|  | ||||
|       case 'v': | ||||
|         verbose_flag++; | ||||
|         break; | ||||
|  | ||||
|       case '?': | ||||
|         break; | ||||
|  | ||||
|       default: | ||||
|         abort(); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   int paramc = argc- optind; | ||||
|   char* paramv[paramc]; | ||||
|  | ||||
|   for (int i = optind; i < argc; i++) { | ||||
|     char* x= malloc(strlen(argv[i])+1 *sizeof(char)  ); | ||||
|     strcpy(x,argv[i]); | ||||
|     paramv[i-optind] = x; | ||||
|   } | ||||
|   xmppc_context(&xmppc, verbose_flag); | ||||
|  | ||||
|   logInfo(&xmppc, "Connecting... \n"); | ||||
|   xmppc_connect(&xmppc, jid, pwd); | ||||
|  | ||||
|   ExecuteHandler handler = NULL; | ||||
|         for(int i = 0; map[i].name;i++ ) { | ||||
|           if (mode ==  map[i].mode) { | ||||
|             handler = map[i].callback; | ||||
|             break; | ||||
|           } | ||||
|         } | ||||
|  | ||||
|   callback_t callback = {paramc, paramv, handler, &xmppc}; | ||||
|  | ||||
|   xmpp_connect_client(xmppc.conn, NULL, 0, conn_handler, &callback); | ||||
|  | ||||
|   xmpp_run(xmppc.ctx); | ||||
|   xmpp_conn_release(xmppc.conn); | ||||
|   xmpp_ctx_free(xmppc.ctx); | ||||
|   xmpp_shutdown(); | ||||
|  | ||||
|   return EXIT_SUCCESS; | ||||
| } | ||||
|  | ||||
| static void _show_help() { | ||||
| #ifdef XMPPC_DEVELOPMENT | ||||
|   printf("%s - Development\n", PACKAGE_STRING); | ||||
| #else | ||||
|   printf("%s\n", PACKAGE_STRING); | ||||
| #endif | ||||
|   printf("Usage: xmppc --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("\n"); | ||||
|   printf("Modes:\n"); | ||||
|   printf("  -m --mode roster      xmppc roster mode\n"); | ||||
|   printf("    list                  List all contacts\n"); | ||||
|   printf("    export                Exports all contacts\n"); | ||||
|   printf("\n"); | ||||
|   printf("  -m --mode message     xmppc message mode\n"); | ||||
|   printf("    chat <jid> <message>  Sending unencrypted message to jid\n"); | ||||
|   printf("\n"); | ||||
|   printf("  -m --mode pgp         xmppc pgp mode (XEP-0027) \n"); | ||||
|   printf("    chat <jid> <message>  Sending pgp encrypted message to jid\n"); | ||||
|   printf("\n"); | ||||
|   printf("  -m --mode omemo       xmppc omemo mode\n"); | ||||
|   printf("    list                  List the device IDs and fingerprints\n"); | ||||
|   printf("\n"); | ||||
|   printf("  -m --mode openpgp          xmppc openpgp mode (XEP-0373)\n"); | ||||
|   printf("    signcrypt <jid> <message>  Sending pgp signed and encrypted message to jid\n"); | ||||
|   printf("\n"); | ||||
|   printf("  -m --mode monitor     Monitot mode"); | ||||
|   printf("    stanza              Stanza Monitor\n"); | ||||
|   printf("    monitor             microblog Monitor microblog (XEP-0277: Microblogging over XMPP)\n"); | ||||
|   printf("\n"); | ||||
|   printf("\n"); | ||||
|   printf("Examples:\n"); | ||||
|   printf("  Usage: xmppc --jid user@domain.tld --pwd \"secret\" --mode roster list\n"); | ||||
|   printf("  Usage: xmppc --jid user@domain.tld --pwd \"secret\" --mode pgp chat friend@domain.tld \"Hello\"\n"); | ||||
|  | ||||
| } | ||||
							
								
								
									
										52
									
								
								src/mode/account.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								src/mode/account.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | ||||
| /*! | ||||
|  * @file File: account.c | ||||
|  * | ||||
|  * vim: expandtab:ts=2:sts=2:sw=2 | ||||
|  * | ||||
|  * @copyright  | ||||
|  *  | ||||
|  * Copyright (C) 2020 Anoxinon e.V.  | ||||
|  * | ||||
|  * This file is part of xmppc. | ||||
|  * | ||||
|  * xmppc is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * xmppc is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Foobar.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * German | ||||
|  * | ||||
|  * Diese Datei ist Teil von xmppc. | ||||
|  * | ||||
|  * xmppc ist Freie Software: Sie können es unter den Bedingungen | ||||
|  * der GNU General Public License, wie von der Free Software Foundation, | ||||
|  * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren | ||||
|  * veröffentlichten Version, weiter verteilen und/oder modifizieren. | ||||
|  * | ||||
|  * xmppc wird in der Hoffnung, dass es nützlich sein wird, aber | ||||
|  * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite | ||||
|  * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. | ||||
|  * Siehe die GNU General Public License für weitere Details. | ||||
|  * | ||||
|  * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem | ||||
|  * Programm erhalten haben. Wenn nicht, siehe <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include "account.h" | ||||
| #include "stdio.h" | ||||
| #include "string.h" | ||||
|  | ||||
| void account_execute_command(xmppc_t *xmppc, int argc, char *argv[]) { | ||||
|   logError(xmppc, "Message command not implemented!\n");  | ||||
|   xmpp_disconnect(xmppc->conn); | ||||
|   xmpp_stop(xmppc->ctx); | ||||
| } | ||||
|  | ||||
							
								
								
									
										51
									
								
								src/mode/account.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								src/mode/account.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| /*! | ||||
|  * @file account.h | ||||
|  * | ||||
|  * vim: expandtab:ts=2:sts=2:sw=2 | ||||
|  * | ||||
|  * @ copyright | ||||
|  * | ||||
|  * Copyright (C) 2020 Anoxinon e.V.  | ||||
|  * | ||||
|  * This file is part of xmppc. | ||||
|  * | ||||
|  * xmppc is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * xmppc is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Foobar.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * German | ||||
|  * | ||||
|  * Diese Datei ist Teil von xmppc. | ||||
|  * | ||||
|  * xmppc ist Freie Software: Sie können es unter den Bedingungen | ||||
|  * der GNU General Public License, wie von der Free Software Foundation, | ||||
|  * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren | ||||
|  * veröffentlichten Version, weiter verteilen und/oder modifizieren. | ||||
|  * | ||||
|  * xmppc wird in der Hoffnung, dass es nützlich sein wird, aber | ||||
|  * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite | ||||
|  * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. | ||||
|  * Siehe die GNU General Public License für weitere Details. | ||||
|  * | ||||
|  * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem | ||||
|  * Programm erhalten haben. Wenn nicht, siehe <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef XMPPC_ACCOUNT_H__ | ||||
| #define XMPPC_ACCOUNT_H__ | ||||
|  | ||||
| #include "xmppc.h" | ||||
|  | ||||
| void account_execute_command(xmppc_t *xmppc, int agrc, char *argv[]); | ||||
|  | ||||
| #endif // XMPPC_ACCOUNT_H__ | ||||
							
								
								
									
										68
									
								
								src/mode/message.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								src/mode/message.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | ||||
| /*! | ||||
|  * @file message.c | ||||
|  * | ||||
|  * vim: expandtab:ts=2:sts=2:sw=2 | ||||
|  * | ||||
|  * @authors | ||||
|  * Copyright (C) 2020 Anoxinon e.V.  | ||||
|  * | ||||
|  * @copyright  | ||||
|  * This file is part of xmppc. | ||||
|  * | ||||
|  * xmppc is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * xmppc is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Foobar.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * German | ||||
|  * | ||||
|  * Diese Datei ist Teil von xmppc. | ||||
|  * | ||||
|  * xmppc ist Freie Software: Sie können es unter den Bedingungen | ||||
|  * der GNU General Public License, wie von der Free Software Foundation, | ||||
|  * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren | ||||
|  * veröffentlichten Version, weiter verteilen und/oder modifizieren. | ||||
|  * | ||||
|  * xmppc wird in der Hoffnung, dass es nützlich sein wird, aber | ||||
|  * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite | ||||
|  * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. | ||||
|  * Siehe die GNU General Public License für weitere Details. | ||||
|  * | ||||
|  * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem | ||||
|  * Programm erhalten haben. Wenn nicht, siehe <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include "message.h" | ||||
| #include "string.h" | ||||
|  | ||||
| static void _message_send_text(xmppc_t *xmppc, char* to, char* message); | ||||
|  | ||||
| void message_execute_command(xmppc_t *xmppc, int argc, char *argv[]) { | ||||
|   if( argc == 3 && ( strcmp("chat", argv[0] ) == 0)) { | ||||
|     _message_send_text(xmppc, argv[1],argv[2]); | ||||
|   } else { | ||||
|     logError(xmppc, "Befehl unbekannt"); | ||||
|   } | ||||
|   xmpp_disconnect(xmppc->conn); | ||||
| } | ||||
|  | ||||
| void _message_send_text(xmppc_t *xmppc, char* to, char* text) { | ||||
|   xmpp_conn_t *conn = xmppc->conn; | ||||
|   xmpp_stanza_t *message; | ||||
|   char* id = xmpp_uuid_gen(xmppc->ctx); | ||||
|   message = xmpp_message_new(xmpp_conn_get_context(conn), "chat", to, id); | ||||
|   int res = xmpp_message_set_body(message, text); | ||||
|   if(res == 0) { | ||||
|     xmpp_send(conn, message);  | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
							
								
								
									
										49
									
								
								src/mode/message.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								src/mode/message.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | ||||
| /* | ||||
|  * @file message.h | ||||
|  * | ||||
|  * vim: expandtab:ts=2:sts=2:sw=2 | ||||
|  * | ||||
|  * Copyright (C) 2020 Anoxinon e.V.  | ||||
|  * | ||||
|  * This file is part of xmppc. | ||||
|  * | ||||
|  * xmppc is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * xmppc is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Foobar.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * German | ||||
|  * | ||||
|  * Diese Datei ist Teil von xmppc. | ||||
|  * | ||||
|  * xmppc ist Freie Software: Sie können es unter den Bedingungen | ||||
|  * der GNU General Public License, wie von der Free Software Foundation, | ||||
|  * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren | ||||
|  * veröffentlichten Version, weiter verteilen und/oder modifizieren. | ||||
|  * | ||||
|  * xmppc wird in der Hoffnung, dass es nützlich sein wird, aber | ||||
|  * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite | ||||
|  * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. | ||||
|  * Siehe die GNU General Public License für weitere Details. | ||||
|  * | ||||
|  * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem | ||||
|  * Programm erhalten haben. Wenn nicht, siehe <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef XMPPC_MESSAGE_H__ | ||||
| #define XMPPC_MESSAGE_H__ | ||||
|  | ||||
| #include "xmppc.h" | ||||
|  | ||||
| void message_execute_command(xmppc_t *xmppc, int agrc, char *argv[]); | ||||
|  | ||||
| #endif // XMPPC_MESSAGE_H__ | ||||
							
								
								
									
										126
									
								
								src/mode/monitor.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								src/mode/monitor.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,126 @@ | ||||
| /*! | ||||
|  * @file File: monitor.c | ||||
|  * | ||||
|  * vim: expandtab:ts=2:sts=2:sw=2 | ||||
|  * | ||||
|  * @copyright  | ||||
|  *  | ||||
|  * Copyright (C) 2020 Anoxinon e.V.  | ||||
|  * | ||||
|  * This file is part of xmppc. | ||||
|  * | ||||
|  * xmppc is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * xmppc is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Foobar.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * German | ||||
|  * | ||||
|  * Diese Datei ist Teil von xmppc. | ||||
|  * | ||||
|  * xmppc ist Freie Software: Sie können es unter den Bedingungen | ||||
|  * der GNU General Public License, wie von der Free Software Foundation, | ||||
|  * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren | ||||
|  * veröffentlichten Version, weiter verteilen und/oder modifizieren. | ||||
|  * | ||||
|  * xmppc wird in der Hoffnung, dass es nützlich sein wird, aber | ||||
|  * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite | ||||
|  * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. | ||||
|  * Siehe die GNU General Public License für weitere Details. | ||||
|  * | ||||
|  * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem | ||||
|  * Programm erhalten haben. Wenn nicht, siehe <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include "monitor.h" | ||||
| #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); | ||||
|  | ||||
| void monitor_execute_command(xmppc_t *xmppc, int argc, char *argv[]) { | ||||
|   if(argc > 0 && strcmp("stanza", argv[0]) == 0) { | ||||
|     xmpp_handler_add(xmppc->conn, _monitor_log_stanza, NULL, NULL, NULL, NULL); | ||||
| #ifdef XMPPC_DEVELOPMENT  | ||||
|   } else if (argc > 0 && strcmp("microblog", argv[0]) == 0) { | ||||
|     xmpp_handler_add(xmppc->conn, _monitor_show_microblog, NULL, NULL, NULL, NULL); | ||||
| #endif | ||||
|   } else { | ||||
|     printf("Command unbekannt!"); | ||||
|     xmpp_disconnect(xmppc->conn); | ||||
|   } | ||||
|     // presence  | ||||
|     xmpp_stanza_t *presence = xmpp_presence_new(xmppc->ctx); | ||||
|     char* id = xmpp_uuid_gen(xmppc->ctx); | ||||
|     xmpp_stanza_set_id(presence, id); | ||||
|     xmpp_send(xmppc->conn, presence); | ||||
|     xmpp_stanza_release(presence); | ||||
|  | ||||
|     // XEP-0280: Message Carbons | ||||
|     xmpp_stanza_t *carbons = xmpp_iq_new(xmppc->ctx, "set", xmpp_uuid_gen(xmppc->ctx)); | ||||
|     xmpp_stanza_t* enable = xmpp_stanza_new(xmppc->ctx); | ||||
|     xmpp_stanza_set_name(enable, "enable"); | ||||
|     xmpp_stanza_set_ns(enable, "urn:xmpp:carbons:2"); | ||||
|     xmpp_stanza_add_child(carbons,enable); | ||||
|     xmpp_send(xmppc->conn,carbons); | ||||
| } | ||||
|  | ||||
| int _monitor_log_stanza(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata){ | ||||
|   char* s; | ||||
|   size_t len; | ||||
|   xmpp_stanza_to_text(stanza,&s,&len); | ||||
|  | ||||
|   char* color = "\x1b[m"; | ||||
|   if(strcmp(xmpp_stanza_get_name(stanza), "iq") == 0 ) color = ANSI_COLOR_YELLOW; | ||||
|   if(strcmp(xmpp_stanza_get_name(stanza), "message") == 0 ) { | ||||
|     color = ANSI_COLOR_BLUE; | ||||
|      if(strcmp("headline", xmpp_stanza_get_type(stanza)) == 0) { | ||||
|       color = ANSI_COLOR_CYAN; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   if(strcmp(xmpp_stanza_get_name(stanza), "presence") == 0 ) color = ANSI_COLOR_GREEN; | ||||
|   if(xmpp_stanza_get_type(stanza) != NULL)  | ||||
|   if(strcmp(xmpp_stanza_get_type(stanza), "error") == 0 ) color = ANSI_COLOR_B_RED; | ||||
|  | ||||
|   printf("%s%s\x1b[m\n", color, s); | ||||
|   return 1; | ||||
| } | ||||
|  | ||||
| /* 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"); | ||||
|     if(event != NULL &&  | ||||
|       strcmp(xmpp_stanza_get_ns(event), "http://jabber.org/protocol/pubsub#event") ==0) { | ||||
|       char* body_text = xmpp_message_get_body(stanza); | ||||
|       printf("Event: %s\n", body_text); | ||||
|       xmpp_stanza_t * items = xmpp_stanza_get_child_by_name(event,"items"); | ||||
|       if( items != NULL && strcmp("urn:xmpp:microblog:0", xmpp_stanza_get_attribute(items, "node" )) == 0) { | ||||
|       printf("urn:xmpp:microblog:0 items found!\n"); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   if(log) { | ||||
|     _monitor_log_stanza(conn, stanza, userdata); | ||||
|   } | ||||
|  | ||||
|   return 1; | ||||
| } | ||||
|  | ||||
							
								
								
									
										51
									
								
								src/mode/monitor.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								src/mode/monitor.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| /*! | ||||
|  * @file monitor.h | ||||
|  * | ||||
|  * vim: expandtab:ts=2:sts=2:sw=2 | ||||
|  * | ||||
|  * @ copyright | ||||
|  * | ||||
|  * Copyright (C) 2020 Anoxinon e.V. | ||||
|  * | ||||
|  * This file is part of xmppc. | ||||
|  * | ||||
|  * xmppc is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * xmppc is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Foobar.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * German | ||||
|  * | ||||
|  * Diese Datei ist Teil von xmppc. | ||||
|  * | ||||
|  * xmppc ist Freie Software: Sie können es unter den Bedingungen | ||||
|  * der GNU General Public License, wie von der Free Software Foundation, | ||||
|  * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren | ||||
|  * veröffentlichten Version, weiter verteilen und/oder modifizieren. | ||||
|  * | ||||
|  * xmppc wird in der Hoffnung, dass es nützlich sein wird, aber | ||||
|  * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite | ||||
|  * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. | ||||
|  * Siehe die GNU General Public License für weitere Details. | ||||
|  * | ||||
|  * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem | ||||
|  * Programm erhalten haben. Wenn nicht, siehe <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef XMPPC_MONITOR_H__ | ||||
| #define XMPPC_MONITOR_H__ | ||||
|  | ||||
| #include "xmppc.h" | ||||
|  | ||||
| void monitor_execute_command(xmppc_t *xmppc, int agrc, char *argv[]); | ||||
|  | ||||
| #endif // XMPPC_MONITOR_H__ | ||||
							
								
								
									
										48
									
								
								src/mode/muc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								src/mode/muc.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| /* | ||||
|  * @file muc.c | ||||
|  * | ||||
|  * vim: expandtab:ts=2:sts=2:sw=2 | ||||
|  * | ||||
|  * Copyright (C) 2020 Anoxinon e.V. | ||||
|  * | ||||
|  * This file is part of xmppc. | ||||
|  * | ||||
|  * xmppc is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * xmppc is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Foobar.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * German | ||||
|  * | ||||
|  * Diese Datei ist Teil von xmppc. | ||||
|  * | ||||
|  * xmppc ist Freie Software: Sie können es unter den Bedingungen | ||||
|  * der GNU General Public License, wie von der Free Software Foundation, | ||||
|  * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren | ||||
|  * veröffentlichten Version, weiter verteilen und/oder modifizieren. | ||||
|  * | ||||
|  * xmppc wird in der Hoffnung, dass es nützlich sein wird, aber | ||||
|  * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite | ||||
|  * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. | ||||
|  * Siehe die GNU General Public License für weitere Details. | ||||
|  * | ||||
|  * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem | ||||
|  * Programm erhalten haben. Wenn nicht, siehe <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include "account.h" | ||||
| #include "stdio.h" | ||||
| #include "string.h" | ||||
|  | ||||
| void muc_execute_command(xmppc_t *xmppc, int argc, char *argv[]) { | ||||
|   logError(xmppc, "Message command not implemented!\n");  | ||||
| } | ||||
|  | ||||
							
								
								
									
										50
									
								
								src/mode/muc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								src/mode/muc.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| /* | ||||
|  * @file muc.h | ||||
|  * | ||||
|  * vim: expandtab:ts=2:sts=2:sw=2 | ||||
|  * | ||||
|  * @copyright | ||||
|  * | ||||
|  * Copyright (C) 2020 Anoxinon e.V. | ||||
|  * | ||||
|  * This file is part of xmppc. | ||||
|  * | ||||
|  * xmppc is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * xmppc is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Foobar.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * German | ||||
|  * | ||||
|  * Diese Datei ist Teil von xmppc. | ||||
|  * | ||||
|  * xmppc ist Freie Software: Sie können es unter den Bedingungen | ||||
|  * der GNU General Public License, wie von der Free Software Foundation, | ||||
|  * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren | ||||
|  * veröffentlichten Version, weiter verteilen und/oder modifizieren. | ||||
|  * | ||||
|  * xmppc wird in der Hoffnung, dass es nützlich sein wird, aber | ||||
|  * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite | ||||
|  * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. | ||||
|  * Siehe die GNU General Public License für weitere Details. | ||||
|  * | ||||
|  * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem | ||||
|  * Programm erhalten haben. Wenn nicht, siehe <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #ifndef XMPPC_MUC_H__ | ||||
| #define XMPPC_MUC_H__ | ||||
|  | ||||
| #include "xmppc.h" | ||||
|  | ||||
| void muc_execute_command(xmppc_t *xmppc, int agrc, char *argv[]); | ||||
|  | ||||
| #endif // XMPPC_MUC_H__ | ||||
							
								
								
									
										187
									
								
								src/mode/omemo.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										187
									
								
								src/mode/omemo.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,187 @@ | ||||
| /*! | ||||
|  * @file omemo.c | ||||
|  * | ||||
|  * vim: expandtab:ts=2:sts=2:sw=2 | ||||
|  * | ||||
|  * @copyright | ||||
|  * | ||||
|  * Copyright (C) 2020 Anoxinon e.V. | ||||
|  * | ||||
|  * This file is part of xmppc. | ||||
|  * | ||||
|  * xmppc is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * xmppc is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Foobar.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * German | ||||
|  * | ||||
|  * Diese Datei ist Teil von xmppc. | ||||
|  * | ||||
|  * xmppc ist Freie Software: Sie können es unter den Bedingungen | ||||
|  * der GNU General Public License, wie von der Free Software Foundation, | ||||
|  * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren | ||||
|  * veröffentlichten Version, weiter verteilen und/oder modifizieren. | ||||
|  * | ||||
|  * xmppc wird in der Hoffnung, dass es nützlich sein wird, aber | ||||
|  * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite | ||||
|  * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. | ||||
|  * Siehe die GNU General Public License für weitere Details. | ||||
|  * | ||||
|  * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem | ||||
|  * Programm erhalten haben. Wenn nicht, siehe <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include "omemo.h" | ||||
|  | ||||
| #include <glib.h> | ||||
| #include <unistd.h> | ||||
| #define DJB_TYPE 0x05 | ||||
|  | ||||
| static int response = 0; | ||||
|  | ||||
| static void _omemo_device_list_query(xmppc_t *xmppc); | ||||
| static int _omemo_device_list_reply(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, | ||||
|                   void *const userdata); | ||||
|  | ||||
| static void _omemo_bundles_query(xmppc_t *xmppc, const char* deviceid); | ||||
| static int _omemo_bundles_reply(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, | ||||
|                   void *const userdata); | ||||
|  | ||||
| void omemo_execute_command(xmppc_t *xmppc, int agrc, char *argv[]) { | ||||
|   _omemo_device_list_query(xmppc); | ||||
| } | ||||
|  | ||||
| void _omemo_device_list_query(xmppc_t *xmppc) { | ||||
|   xmpp_conn_t *conn = xmppc->conn; | ||||
|   xmpp_stanza_t *iq, *query, *item; | ||||
|   char* id = xmpp_uuid_gen(xmppc->ctx); | ||||
|   iq = xmpp_iq_new(xmpp_conn_get_context(conn), "get", id); | ||||
|   const char *jid = xmpp_conn_get_jid(conn); | ||||
|   xmpp_stanza_set_from(iq, jid); | ||||
|   xmpp_stanza_set_to(iq, jid); | ||||
|   query = xmpp_stanza_new(xmpp_conn_get_context(conn)); | ||||
|   xmpp_stanza_set_name(query, "pubsub"); | ||||
|   xmpp_stanza_set_ns(query, "http://jabber.org/protocol/pubsub"); | ||||
|   xmpp_stanza_add_child(iq, query); | ||||
|   item = xmpp_stanza_new(xmpp_conn_get_context(conn)); | ||||
|   xmpp_stanza_set_name(item, "items"); | ||||
|   xmpp_stanza_set_attribute(item, "node", | ||||
|                             "eu.siacs.conversations.axolotl.devicelist"); | ||||
|   xmpp_stanza_add_child(query, item); | ||||
|   xmpp_stanza_release(query); | ||||
|   xmpp_stanza_release(item); | ||||
|   xmpp_id_handler_add(conn, _omemo_device_list_reply , id, xmppc); | ||||
|   xmpp_send(conn, iq); | ||||
| } | ||||
|  | ||||
| static int _omemo_device_list_reply(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, | ||||
|                   void *const userdata) { | ||||
|   xmppc_t *xmppc = (xmppc_t *)userdata; | ||||
|   xmpp_stanza_t *query, *item; | ||||
|   const char *name; | ||||
|   printf("Device List\n"); | ||||
|   query = xmpp_stanza_get_child_by_name(stanza, "pubsub"); | ||||
|   query = xmpp_stanza_get_child_by_name(query, "items"); | ||||
|   query = xmpp_stanza_get_child_by_name(query, "item"); | ||||
|   query = xmpp_stanza_get_child_by_name(query, "list"); | ||||
|   for (item = xmpp_stanza_get_children(query); item; | ||||
|        item = xmpp_stanza_get_next(item)) | ||||
|     if ((name = xmpp_stanza_get_attribute(item, "id"))) { | ||||
|       response++; | ||||
|       printf("\t %s\n", name); | ||||
|       _omemo_bundles_query(xmppc, name); | ||||
|     } | ||||
|      | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| void _omemo_bundles_query(xmppc_t *xmppc, const char* deviceid){ | ||||
|   xmpp_conn_t *conn = xmppc->conn; | ||||
|   xmpp_stanza_t *iq, *query, *item; | ||||
|   char* id = xmpp_uuid_gen(xmppc->ctx); | ||||
|   iq = xmpp_iq_new(xmpp_conn_get_context(conn), "get", id); | ||||
|   const char *jid = xmpp_conn_get_jid(conn); | ||||
|   xmpp_stanza_set_from(iq, jid); | ||||
|   xmpp_stanza_set_to(iq, jid); | ||||
|   query = xmpp_stanza_new(xmpp_conn_get_context(conn)); | ||||
|   xmpp_stanza_set_name(query, "pubsub"); | ||||
|   xmpp_stanza_set_ns(query, "http://jabber.org/protocol/pubsub"); | ||||
|   xmpp_stanza_add_child(iq, query); | ||||
|   item = xmpp_stanza_new(xmpp_conn_get_context(conn)); | ||||
|   xmpp_stanza_set_name(item, "items"); | ||||
|   char bundle[100] = ""; | ||||
|   strcat(bundle, "eu.siacs.conversations.axolotl.bundles:"); | ||||
|   strcat(bundle, deviceid); | ||||
|   xmpp_stanza_set_attribute(item, "node",bundle); | ||||
|   xmpp_stanza_add_child(query, item); | ||||
|   xmpp_stanza_release(query); | ||||
|   xmpp_stanza_release(item); | ||||
|   xmpp_id_handler_add(conn, _omemo_bundles_reply , id, xmppc); | ||||
|   xmpp_send(conn, iq); | ||||
|  | ||||
| } | ||||
|  | ||||
| int _omemo_bundles_reply(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, | ||||
|                   void *const userdata)  { | ||||
|   xmppc_t *xmppc = (xmppc_t *)userdata; | ||||
|  | ||||
|   if(strcmp(xmpp_stanza_get_type(stanza), "error") == 0) { | ||||
|     printf("Fehler\n"); | ||||
|     return 0; | ||||
|   }  | ||||
|  | ||||
|   xmpp_stanza_t *query; | ||||
|   query = xmpp_stanza_get_child_by_name(stanza, "pubsub"); | ||||
|   query = xmpp_stanza_get_child_by_name(query, "items"); | ||||
|   query = xmpp_stanza_get_child_by_name(query, "item"); | ||||
|   query = xmpp_stanza_get_child_by_name(query, "bundle"); | ||||
|   query = xmpp_stanza_get_child_by_name(query, "identityKey"); | ||||
|   char* identityKey = xmpp_stanza_get_text(query); | ||||
|  | ||||
|  size_t identity_public_key_len = 0; | ||||
|   unsigned char *x = g_base64_decode(identityKey, &identity_public_key_len); | ||||
|   unsigned char *identity_public_key_data = x; | ||||
|   if (identity_public_key_data[0] != DJB_TYPE) { | ||||
|     printf("Ist kein DJB_TYPE"); | ||||
|   } | ||||
|  | ||||
|   // Skip first byte corresponding to signal DJB_TYPE | ||||
|   identity_public_key_len--; | ||||
|   identity_public_key_data = &identity_public_key_data[1]; | ||||
|  | ||||
|   char *fingerprint = malloc(identity_public_key_len * 2 + 1); | ||||
|   fingerprint[identity_public_key_len*2] = '\0'; | ||||
|  | ||||
|   for (int i = 0; i < identity_public_key_len; i++) { | ||||
|     fingerprint[i * 2] = (identity_public_key_data[i] & 0xf0) >> 4; | ||||
|     fingerprint[i * 2] += '0'; | ||||
|     if (fingerprint[i * 2] > '9') { | ||||
|       fingerprint[i * 2] += 0x27; | ||||
|     } | ||||
|  | ||||
|     fingerprint[(i * 2) + 1] = identity_public_key_data[i] & 0x0f; | ||||
|     fingerprint[(i * 2) + 1] += '0'; | ||||
|     if (fingerprint[(i * 2) + 1] > '9') { | ||||
|       fingerprint[(i * 2) + 1] += 0x27; | ||||
|     } | ||||
|   } | ||||
|   printf("Fingerprint: %s\n", fingerprint); | ||||
|   response--; | ||||
|   if(response == 0) { | ||||
|     xmpp_disconnect(xmppc->conn); | ||||
|     xmpp_stop(xmppc->ctx); | ||||
|   } | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
							
								
								
									
										50
									
								
								src/mode/omemo.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								src/mode/omemo.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| /* | ||||
|  * @file omemo.h | ||||
|  * | ||||
|  * vim: expandtab:ts=2:sts=2:sw=2 | ||||
|  * | ||||
|  * @copyright | ||||
|  * | ||||
|  * Copyright (C) 2020 Anoxinon e.V. | ||||
|  * | ||||
|  * This file is part of xmppc. | ||||
|  * | ||||
|  * xmppc is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * xmppc is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Foobar.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * German | ||||
|  * | ||||
|  * Diese Datei ist Teil von xmppc. | ||||
|  * | ||||
|  * xmppc ist Freie Software: Sie können es unter den Bedingungen | ||||
|  * der GNU General Public License, wie von der Free Software Foundation, | ||||
|  * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren | ||||
|  * veröffentlichten Version, weiter verteilen und/oder modifizieren. | ||||
|  * | ||||
|  * xmppc wird in der Hoffnung, dass es nützlich sein wird, aber | ||||
|  * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite | ||||
|  * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. | ||||
|  * Siehe die GNU General Public License für weitere Details. | ||||
|  * | ||||
|  * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem | ||||
|  * Programm erhalten haben. Wenn nicht, siehe <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #ifndef XMPPC_OMEMO_H__ | ||||
| #define XMPPC_OMEMO_H__ | ||||
|  | ||||
| #include "xmppc.h" | ||||
|  | ||||
| void omemo_execute_command(xmppc_t *xmppc, int agrc, char *argv[]); | ||||
|  | ||||
| #endif // XMPPC_OMEMO_H__ | ||||
							
								
								
									
										244
									
								
								src/mode/openpgp.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										244
									
								
								src/mode/openpgp.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,244 @@ | ||||
| /*! | ||||
|  * @file openpgp.c | ||||
|  * | ||||
|  * vim: expandtab:ts=2:sts=2:sw=2 | ||||
|  *  | ||||
|  * @authors | ||||
|  * Copyright (C) 2020 Anoxinon e.V. | ||||
|  * | ||||
|  * @copyright  | ||||
|  * This file is part of xmppc. | ||||
|  * | ||||
|  * xmppc is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * xmppc is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Foobar.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * German | ||||
|  * | ||||
|  * Diese Datei ist Teil von xmppc. | ||||
|  * | ||||
|  * xmppc ist Freie Software: Sie können es unter den Bedingungen | ||||
|  * der GNU General Public License, wie von der Free Software Foundation, | ||||
|  * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren | ||||
|  * veröffentlichten Version, weiter verteilen und/oder modifizieren. | ||||
|  * | ||||
|  * xmppc wird in der Hoffnung, dass es nützlich sein wird, aber | ||||
|  * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite | ||||
|  * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. | ||||
|  * Siehe die GNU General Public License für weitere Details. | ||||
|  * | ||||
|  * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem | ||||
|  * Programm erhalten haben. Wenn nicht, siehe <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #define _GNU_SOURCE | ||||
|  | ||||
| #include "openpgp.h" | ||||
| #include "string.h" | ||||
|  | ||||
| #include <locale.h> | ||||
| #include <stdlib.h> | ||||
| #include <glib.h> | ||||
| #include <gpgme.h> | ||||
|  | ||||
| static void _openpgp_send_text(xmppc_t *xmppc, char* to, char* text); | ||||
| static xmpp_stanza_t* _openpgp_signcrypt(xmppc_t *xmppc, char* to, char* text); | ||||
| static char* _openpgp_gpg_signcrypt(xmppc_t *xmppc, char* recipient, char* message);  | ||||
| static gpgme_error_t _openpgp_lookup_key(xmppc_t *xmppc, char* name, gpgme_ctx_t* ctx, gpgme_key_t* key); | ||||
|  | ||||
| void openpgp_execute_command(xmppc_t *xmppc, int argc, char *argv[]) { | ||||
|   if(argc > 0) { | ||||
|     if(strcmp("signcrypt", argv[0]) == 0) { | ||||
|       _openpgp_send_text(xmppc, argv[1], argv[2]); | ||||
|     } else { | ||||
|       logError(xmppc, "Unbekanner Befehl: %s\n", argv[0]); | ||||
|     } | ||||
|   } | ||||
|   xmpp_disconnect(xmppc->conn); | ||||
| } | ||||
|  | ||||
| void _openpgp_send_text(xmppc_t *xmppc, char* to, char* text) { | ||||
|   xmpp_conn_t *conn = xmppc->conn; | ||||
|   xmpp_stanza_t *message; | ||||
|   char* id = xmpp_uuid_gen(xmppc->ctx); | ||||
|   message = xmpp_message_new(xmpp_conn_get_context(conn), NULL, to, id); | ||||
|   xmpp_message_set_body(message, "This message is *encrypted* with OpenPGP (See :XEP:`0373`)"); | ||||
|     xmpp_stanza_t *openpgp = xmpp_stanza_new(xmppc->ctx); | ||||
|     xmpp_stanza_set_name(openpgp, "openpgp"); | ||||
|     xmpp_stanza_set_ns(openpgp, "urn:xmpp:openpgp:0"); | ||||
|      | ||||
|     xmpp_stanza_t * signcrypt = _openpgp_signcrypt(xmppc, to, text); | ||||
|     char* c; | ||||
|     size_t s; | ||||
|     xmpp_stanza_to_text(signcrypt, &c,&s); | ||||
|     char* signcrypt_e = _openpgp_gpg_signcrypt(xmppc,to, c); | ||||
|     // BASE64_OPENPGP_MESSAGE | ||||
|     xmpp_stanza_t* base64_openpgp_message = xmpp_stanza_new(xmppc->ctx); | ||||
|     xmpp_stanza_set_text(base64_openpgp_message,signcrypt_e); | ||||
|     xmpp_stanza_add_child(openpgp, base64_openpgp_message); | ||||
|     xmpp_stanza_add_child(message, openpgp); | ||||
|      | ||||
|     xmpp_stanza_to_text(message, &c,&s); | ||||
|      | ||||
|     xmpp_send(conn, message);  | ||||
|     | ||||
| } | ||||
|  | ||||
| xmpp_stanza_t* _openpgp_signcrypt(xmppc_t *xmppc, char* to, char* text) { | ||||
|  | ||||
|   time_t now = time(NULL); | ||||
|   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++) { | ||||
|       rpad_data[i] = 'c'; | ||||
|     } | ||||
|     rpad_data[randnr-1] = '\0'; | ||||
|      | ||||
|  | ||||
|     xmpp_stanza_t *signcrypt = xmpp_stanza_new(xmppc->ctx); | ||||
|     xmpp_stanza_set_name(signcrypt, "signcrypt"); | ||||
|     xmpp_stanza_set_ns(signcrypt, "urn:xmpp:openpgp:0"); | ||||
|     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); | ||||
|     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"); | ||||
|     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); | ||||
|     xmpp_stanza_t *payload= xmpp_stanza_new(xmppc->ctx); | ||||
|     xmpp_stanza_set_name(payload, "payload"); | ||||
|     xmpp_stanza_t *body = xmpp_stanza_new(xmppc->ctx); | ||||
|     xmpp_stanza_set_name(body, "body"); | ||||
|     xmpp_stanza_set_ns(body, "jabber:client"); | ||||
|     xmpp_stanza_t *body_text = xmpp_stanza_new(xmppc->ctx); | ||||
|     xmpp_stanza_set_text(body_text, text); | ||||
|     xmpp_stanza_add_child(signcrypt,s_to); | ||||
|     xmpp_stanza_add_child(signcrypt,time); | ||||
|     xmpp_stanza_add_child(signcrypt,rpad); | ||||
|     xmpp_stanza_add_child(rpad,rpad_text); | ||||
|     xmpp_stanza_add_child(signcrypt,payload); | ||||
|     xmpp_stanza_add_child(payload, body); | ||||
|     xmpp_stanza_add_child(body, body_text); | ||||
|     return signcrypt; | ||||
|  | ||||
| } | ||||
|  | ||||
| char* _openpgp_gpg_signcrypt(xmppc_t *xmppc, char* recipient, char* message) { | ||||
|   setlocale (LC_ALL, ""); | ||||
|   gpgme_check_version (NULL); | ||||
|   gpgme_set_locale (NULL, LC_CTYPE, setlocale (LC_CTYPE, NULL)); | ||||
|   gpgme_ctx_t ctx; | ||||
|   gpgme_error_t error = gpgme_new (&ctx); | ||||
|   if(GPG_ERR_NO_ERROR != error ) { | ||||
|     printf("gpgme_new: %d\n", error); | ||||
|     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,0); | ||||
|   gpgme_set_textmode(ctx,0); | ||||
|   gpgme_set_offline(ctx,1); | ||||
|   gpgme_set_keylist_mode(ctx, GPGME_KEYLIST_MODE_LOCAL); | ||||
|   if(error != 0) { | ||||
|     logError(xmppc,"GpgME Error: %s\n", gpgme_strerror(error));   | ||||
|   } | ||||
|  | ||||
|   gpgme_key_t recp[3]; | ||||
|   recp[0] = NULL, | ||||
|   recp[1] = NULL; | ||||
|   const char *jid = xmpp_conn_get_jid(xmppc->conn); | ||||
|    | ||||
|   char* xmpp_jid_me = alloca( (strlen(jid)+6) * sizeof(char) ); | ||||
|   char* xmpp_jid_recipient =  alloca( (strlen(recipient)+6) * sizeof(char) ); | ||||
|  | ||||
|   strcpy(xmpp_jid_me, "xmpp:"); | ||||
|   strcpy(xmpp_jid_recipient, "xmpp:"); | ||||
|   strcat(xmpp_jid_me, jid); | ||||
|   strcat(xmpp_jid_recipient,recipient); | ||||
|  | ||||
|   error = _openpgp_lookup_key(xmppc,xmpp_jid_me, &ctx, &recp[0]); | ||||
|   if(error != 0) { | ||||
|     logError(xmppc,"GpgME Error: %s\n", gpgme_strerror(error));   | ||||
|   } | ||||
|  | ||||
|   error = _openpgp_lookup_key(xmppc,xmpp_jid_recipient, &ctx, &recp[1]); | ||||
|   if(error != 0) { | ||||
|     logError(xmppc,"GpgME Error: %s\n", gpgme_strerror(error));   | ||||
|   } | ||||
|   recp[2] = NULL; | ||||
|   logInfo(xmppc, "%s <%s>\n", recp[0]->uids->name, recp[0]->uids->email); | ||||
|   logInfo(xmppc, "%s <%s>\n", recp[1]->uids->name, recp[1]->uids->email); | ||||
|  | ||||
| #ifdef XMPPC_DEVELOPMENT | ||||
|   gpgme_encrypt_flags_t flags = GPGME_ENCRYPT_ALWAYS_TRUST;  | ||||
| #else  | ||||
|   gpgme_encrypt_flags_t flags = 0; | ||||
| #endif | ||||
|  | ||||
|   gpgme_data_t plain; | ||||
|   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_sign ( 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 = g_base64_encode( (unsigned char*) cipher_str,len); | ||||
|   gpgme_key_release (recp[0]); | ||||
|   gpgme_key_release (recp[1]); | ||||
|   gpgme_release (ctx); | ||||
|   return result; | ||||
| } | ||||
|  | ||||
| gpgme_error_t _openpgp_lookup_key(xmppc_t *xmppc,char* name, gpgme_ctx_t* ctx, gpgme_key_t* key) { | ||||
|   logDebug(xmppc, "Looking for key: %s ...\n", name); | ||||
|   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) { | ||||
|       logDebug(xmppc, "Key found: %s ...\n", (*key)->uids->name); | ||||
|       return error; | ||||
|     } | ||||
|     else { | ||||
|       gpgme_key_release((*key)); | ||||
|     } | ||||
|   } | ||||
|   return error; | ||||
| } | ||||
|  | ||||
							
								
								
									
										59
									
								
								src/mode/openpgp.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								src/mode/openpgp.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| /*! | ||||
|  * @file openpgp.h | ||||
|  * | ||||
|  * vim: expandtab:ts=2:sts=2:sw=2 | ||||
|  * | ||||
|  * @authors | ||||
|  * Copyright (C) 2020 Anoxinon e.V. | ||||
|  * | ||||
|  * @copyright | ||||
|  * This file is part of xmppc. | ||||
|  * | ||||
|  * xmppc is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * xmppc is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Foobar.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * German | ||||
|  * | ||||
|  * Diese Datei ist Teil von xmppc. | ||||
|  * | ||||
|  * xmppc ist Freie Software: Sie können es unter den Bedingungen | ||||
|  * der GNU General Public License, wie von der Free Software Foundation, | ||||
|  * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren | ||||
|  * veröffentlichten Version, weiter verteilen und/oder modifizieren. | ||||
|  * | ||||
|  * xmppc wird in der Hoffnung, dass es nützlich sein wird, aber | ||||
|  * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite | ||||
|  * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. | ||||
|  * Siehe die GNU General Public License für weitere Details. | ||||
|  * | ||||
|  * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem | ||||
|  * Programm erhalten haben. Wenn nicht, siehe <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| /*! | ||||
|  * \page module-openpgp OpenPGP | ||||
|  * \brief xmppc OpenPGP | ||||
|  * | ||||
|  * Commands | ||||
|  * - chat <jdi> <message> | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #ifndef XMPPC_OPENPGP_H__ | ||||
| #define XMPPC_OPENPGP_H__ | ||||
|  | ||||
| #include "xmppc.h" | ||||
|  | ||||
| void openpgp_execute_command(xmppc_t *xmppc, int argc, char *argv[]); | ||||
|  | ||||
| #endif // XMPPC_OPENPGP_H__ | ||||
							
								
								
									
										153
									
								
								src/mode/pgp.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										153
									
								
								src/mode/pgp.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,153 @@ | ||||
| /*! | ||||
|  * @file pgp.c | ||||
|  * | ||||
|  * vim: expandtab:ts=2:sts=2:sw=2 | ||||
|  *  | ||||
|  * @authors | ||||
|  * Copyright (C) 2020 Anoxinon e.V. | ||||
|  * | ||||
|  * @copyright  | ||||
|  * This file is part of xmppc. | ||||
|  * | ||||
|  * xmppc is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * xmppc is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Foobar.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * German | ||||
|  * | ||||
|  * Diese Datei ist Teil von xmppc. | ||||
|  * | ||||
|  * xmppc ist Freie Software: Sie können es unter den Bedingungen | ||||
|  * der GNU General Public License, wie von der Free Software Foundation, | ||||
|  * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren | ||||
|  * veröffentlichten Version, weiter verteilen und/oder modifizieren. | ||||
|  * | ||||
|  * xmppc wird in der Hoffnung, dass es nützlich sein wird, aber | ||||
|  * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite | ||||
|  * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. | ||||
|  * Siehe die GNU General Public License für weitere Details. | ||||
|  * | ||||
|  * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem | ||||
|  * Programm erhalten haben. Wenn nicht, siehe <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #define _GNU_SOURCE | ||||
|  | ||||
| #include "pgp.h" | ||||
| #include "string.h" | ||||
|  | ||||
| #include <locale.h> | ||||
| #include <stdlib.h> | ||||
| #include <gpgme.h> | ||||
|  | ||||
|  | ||||
| #define PGP_BEGIN "-----BEGIN PGP MESSAGE-----" | ||||
| #define PGP_END   "-----END PGP MESSAGE-----" | ||||
|  | ||||
| static char* _pgp_encrypt_message(xmppc_t *xmppc, char* recipient, char* message); | ||||
| static char* _pgp_remove_PGP_MESSAGE_comment(const char* message); | ||||
|  | ||||
| static void _pgp_send_text(xmppc_t *xmppc, char* to, char* text); | ||||
|  | ||||
| void pgp_execute_command(xmppc_t *xmppc, int argc, char *argv[]) { | ||||
|   if(argc > 0) { | ||||
|     if(strcmp("chat", argv[0]) == 0) { | ||||
|       _pgp_send_text(xmppc, argv[1], argv[2]); | ||||
|     } else { | ||||
|       logError(xmppc, "Unbekanner Befehl: %s\n", argv[0]); | ||||
|     } | ||||
|   } | ||||
|   xmpp_disconnect(xmppc->conn); | ||||
| } | ||||
|  | ||||
| void _pgp_send_text(xmppc_t *xmppc, char* to, char* text) { | ||||
|   xmpp_conn_t *conn = xmppc->conn; | ||||
|   xmpp_stanza_t *message; | ||||
|   char* id = xmpp_uuid_gen(xmppc->ctx); | ||||
|   message = xmpp_message_new(xmpp_conn_get_context(conn), "chat", to, id); | ||||
|   int res = xmpp_message_set_body(message, "This message is *encrypted* with PGP (See :XEP:`27`)"); | ||||
|   if(res == 0) { | ||||
|     xmpp_stanza_t *x = xmpp_stanza_new(xmppc->ctx); | ||||
|     xmpp_stanza_set_name(x, "x"); | ||||
|     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) { | ||||
|       return; | ||||
|     } | ||||
|     xmpp_stanza_set_text(b,encrypt_text); | ||||
|     xmpp_stanza_add_child(x, b); | ||||
|     xmpp_stanza_add_child(message, x); | ||||
|     xmpp_stanza_t *e = xmpp_stanza_new(xmppc->ctx); | ||||
|     xmpp_stanza_set_name(e, "encryption"); | ||||
|     xmpp_stanza_set_ns(e, "urn:xmpp:eme:0"); | ||||
|     xmpp_stanza_set_attribute(e, "namespace", "jabber:x:encrypted"); | ||||
|     xmpp_stanza_add_child(message, e); | ||||
|     xmpp_send(conn, message);  | ||||
|   } | ||||
| } | ||||
|  | ||||
| char* _pgp_encrypt_message(xmppc_t *xmppc, char* recipient, char* message) { | ||||
|   setlocale (LC_ALL, ""); | ||||
|   gpgme_check_version (NULL); | ||||
|   gpgme_set_locale (NULL, LC_CTYPE, setlocale (LC_CTYPE, NULL)); | ||||
|   gpgme_ctx_t ctx; | ||||
|   gpgme_error_t error = gpgme_new (&ctx); | ||||
|   if(GPG_ERR_NO_ERROR != error ) { | ||||
|     printf("gpgme_new: %d\n", error); | ||||
|     return NULL; | ||||
|   } | ||||
|   error = gpgme_set_protocol(ctx, GPGME_PROTOCOL_OPENPGP); | ||||
|   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]; | ||||
|   const char *jid = xmpp_conn_get_jid(xmppc->conn); | ||||
|   error = gpgme_get_key(ctx, jid, &(recp[0]), 0); | ||||
|   error = gpgme_get_key(ctx, recipient, &(recp[1]), 0); | ||||
|   recp[2] = NULL; | ||||
|    | ||||
|   logInfo(xmppc, "%s <%s>\n", recp[0]->uids->name, recp[0]->uids->email); | ||||
|   logInfo(xmppc, "%s <%s>\n", recp[1]->uids->name, recp[1]->uids->email); | ||||
|  | ||||
|   gpgme_encrypt_flags_t flags = 0; | ||||
|   gpgme_data_t plain; | ||||
|   gpgme_data_t cipher; | ||||
|  | ||||
|   error = gpgme_data_new (&plain); | ||||
|  | ||||
|   error = gpgme_data_new_from_mem(&plain, message, strlen(message),0); | ||||
|   error = gpgme_data_new (&cipher);   | ||||
|  | ||||
|   error = gpgme_op_encrypt ( ctx, recp, flags, plain, cipher); | ||||
|   size_t len; | ||||
|   char *cipher_str = gpgme_data_release_and_get_mem(cipher, &len); | ||||
|   char* result = NULL; | ||||
|   if(len > 0 ){ | ||||
|     result = _pgp_remove_PGP_MESSAGE_comment(cipher_str); | ||||
|   } | ||||
|  | ||||
|   gpgme_key_release (recp[0]); | ||||
|   gpgme_key_release (recp[1]); | ||||
|   gpgme_release (ctx); | ||||
|   return result; | ||||
| } | ||||
|  | ||||
| static char* _pgp_remove_PGP_MESSAGE_comment(const char* message) { | ||||
|   char* tmp = strndupa(message, strlen(message) - (strlen(PGP_END)+1)); | ||||
|   tmp = tmp+((strlen(PGP_BEGIN) +1) * sizeof(char)); | ||||
|   char* result = malloc(strlen(tmp)+1); | ||||
|   strcpy(result, tmp); | ||||
|   return result; | ||||
| } | ||||
							
								
								
									
										59
									
								
								src/mode/pgp.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								src/mode/pgp.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| /*! | ||||
|  * @file pgp.h | ||||
|  * | ||||
|  * vim: expandtab:ts=2:sts=2:sw=2 | ||||
|  * | ||||
|  * @authors | ||||
|  * Copyright (C) 2020 Anoxinon e.V. | ||||
|  * | ||||
|  * @copyright | ||||
|  * This file is part of xmppc. | ||||
|  * | ||||
|  * xmppc is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * xmppc is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Foobar.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * German | ||||
|  * | ||||
|  * Diese Datei ist Teil von xmppc. | ||||
|  * | ||||
|  * xmppc ist Freie Software: Sie können es unter den Bedingungen | ||||
|  * der GNU General Public License, wie von der Free Software Foundation, | ||||
|  * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren | ||||
|  * veröffentlichten Version, weiter verteilen und/oder modifizieren. | ||||
|  * | ||||
|  * xmppc wird in der Hoffnung, dass es nützlich sein wird, aber | ||||
|  * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite | ||||
|  * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. | ||||
|  * Siehe die GNU General Public License für weitere Details. | ||||
|  * | ||||
|  * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem | ||||
|  * Programm erhalten haben. Wenn nicht, siehe <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| /*! | ||||
|  * \page module-pgp PGP | ||||
|  * \brief xmppc PGP Module | ||||
|  * | ||||
|  * Commands | ||||
|  * - chat <jdi> <message> | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #ifndef XMPPC_PGP_H__ | ||||
| #define XMPPC_PGP_H__ | ||||
|  | ||||
| #include "xmppc.h" | ||||
|  | ||||
| void pgp_execute_command(xmppc_t *xmppc, int agrc, char *argv[]); | ||||
|  | ||||
| #endif // XMPPC_PGP_H__ | ||||
							
								
								
									
										121
									
								
								src/mode/roster.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								src/mode/roster.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,121 @@ | ||||
| /* | ||||
|  * @file roster.c | ||||
|  * | ||||
|  * vim: expandtab:ts=2:sts=2:sw=2 | ||||
|  * | ||||
|  * Copyright (C) 2020 Anoxinon e.V. | ||||
|  * | ||||
|  * This file is part of xmppc. | ||||
|  * | ||||
|  * xmppc is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * xmppc is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Foobar.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * German | ||||
|  * | ||||
|  * Diese Datei ist Teil von xmppc. | ||||
|  * | ||||
|  * xmppc ist Freie Software: Sie können es unter den Bedingungen | ||||
|  * der GNU General Public License, wie von der Free Software Foundation, | ||||
|  * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren | ||||
|  * veröffentlichten Version, weiter verteilen und/oder modifizieren. | ||||
|  * | ||||
|  * xmppc wird in der Hoffnung, dass es nützlich sein wird, aber | ||||
|  * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite | ||||
|  * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. | ||||
|  * Siehe die GNU General Public License für weitere Details. | ||||
|  * | ||||
|  * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem | ||||
|  * Programm erhalten haben. Wenn nicht, siehe <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include "roster.h" | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #define COMMAND_LIST "list" | ||||
| #define COMMAND_EXPORT "export" | ||||
|  | ||||
| typedef enum commandTyp { C_UNKOWN, LIST, EXPORT } CommandType; | ||||
|  | ||||
| typedef struct command { | ||||
|   CommandType type; | ||||
| } command_t; | ||||
|  | ||||
| static void _roster_parse_command(command_t *command, int argc, char *argv[]); | ||||
|  | ||||
| static void _roster_send_query(xmppc_t *xmppc,command_t *command); | ||||
|  | ||||
| static int _handle_reply(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, | ||||
|                   void *const userdata); | ||||
|  | ||||
| void roster_execute_command(xmppc_t *xmppc, int argc, char *argv[]) { | ||||
|   command_t *command = malloc(sizeof(command_t));  | ||||
|   command->type = UNKOWN; | ||||
|   _roster_parse_command(command, argc, argv); | ||||
|   _roster_send_query(xmppc, command); | ||||
| } | ||||
|  | ||||
| static void _roster_parse_command(command_t *command, int argc, char *argv[]) { | ||||
|   if (strcmp(COMMAND_LIST, argv[0]) == 0) { | ||||
|     command->type = LIST; | ||||
|   } else if (strcmp(COMMAND_EXPORT, argv[0]) == 0) { | ||||
|     command->type = EXPORT; | ||||
|   } | ||||
| } | ||||
|  | ||||
| static void _roster_send_query(xmppc_t *xmppc, command_t *command ) { | ||||
|   logInfo(xmppc, "Send roster query\n"); | ||||
|   xmpp_ctx_t *ctx = xmppc->ctx; | ||||
|   xmpp_conn_t *conn = xmppc->conn; | ||||
|   xmpp_stanza_t *iq, *query; | ||||
|   iq = xmpp_iq_new(ctx, "get", "roster1"); | ||||
|   query = xmpp_stanza_new(ctx); | ||||
|   xmpp_stanza_set_name(query, "query"); | ||||
|   xmpp_stanza_set_ns(query, XMPP_NS_ROSTER); | ||||
|   xmpp_stanza_add_child(iq, query); | ||||
|   xmpp_stanza_release(query); | ||||
|   xmpp_id_handler_add(conn, _handle_reply, "roster1",command); | ||||
|   xmpp_send(conn, iq); | ||||
|   xmpp_stanza_release(iq); | ||||
| } | ||||
|  | ||||
| int _handle_reply(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, | ||||
|                   void *const userdata) { | ||||
|   command_t* command = (command_t*) userdata; | ||||
|   xmpp_stanza_t *query, *item; | ||||
|   const char *type, *name; | ||||
|   type = xmpp_stanza_get_type(stanza); | ||||
|   if (strcmp(type, "error") == 0) | ||||
|     printf("query failed\n"); | ||||
|   else { | ||||
|     query = xmpp_stanza_get_child_by_name(stanza, "query"); | ||||
|     for (item = xmpp_stanza_get_children(query); item; | ||||
|          item = xmpp_stanza_get_next(item)) { | ||||
|       if(command->type == LIST) { | ||||
|       if ((name = xmpp_stanza_get_attribute(item, "name")))  | ||||
|         printf("\t %s (%s) sub=%s\n", name, | ||||
|                xmpp_stanza_get_attribute(item, "jid"), | ||||
|                xmpp_stanza_get_attribute(item, "subscription")); | ||||
|       else | ||||
|         printf("\t %s sub=%s\n", xmpp_stanza_get_attribute(item, "jid"), | ||||
|                xmpp_stanza_get_attribute(item, "subscription")); | ||||
|       } else if (command->type == EXPORT) { | ||||
|         printf("%s\n", xmpp_stanza_get_attribute(item, "jid")); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   xmpp_disconnect(conn); | ||||
|   xmpp_stop(xmpp_conn_get_context(conn)); | ||||
|   return 0; | ||||
| } | ||||
							
								
								
									
										50
									
								
								src/mode/roster.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								src/mode/roster.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| /*! | ||||
|  * @file roster.h | ||||
|  * | ||||
|  * vim: expandtab:ts=2:sts=2:sw=2 | ||||
|  * | ||||
|  * Copyright (C) 2020 Anoxinon e.V.  | ||||
|  * | ||||
|  * This file is part of xmppc. | ||||
|  * | ||||
|  * xmppc is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * xmppc is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Foobar.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * German | ||||
|  * | ||||
|  * Diese Datei ist Teil von xmppc. | ||||
|  * | ||||
|  * xmppc ist Freie Software: Sie können es unter den Bedingungen | ||||
|  * der GNU General Public License, wie von der Free Software Foundation, | ||||
|  * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren | ||||
|  * veröffentlichten Version, weiter verteilen und/oder modifizieren. | ||||
|  * | ||||
|  * xmppc wird in der Hoffnung, dass es nützlich sein wird, aber | ||||
|  * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite | ||||
|  * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. | ||||
|  * Siehe die GNU General Public License für weitere Details. | ||||
|  * | ||||
|  * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem | ||||
|  * Programm erhalten haben. Wenn nicht, siehe <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
|  | ||||
|  | ||||
| #ifndef XMPPC_ROSTER_H__ | ||||
| #define XMPPC_ROSTER_H__ | ||||
|  | ||||
| #include "xmppc.h" | ||||
|  | ||||
| void roster_execute_command(xmppc_t *xmppc, int agrc, char *argv[]); | ||||
|  | ||||
| #endif // XMPPC_ROSTER_H__ | ||||
							
								
								
									
										142
									
								
								src/xmpp.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								src/xmpp.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,142 @@ | ||||
| /* | ||||
|  * @file xmppc.c | ||||
|  * | ||||
|  * vim: expandtab:ts=2:sts=2:sw=2 | ||||
|  * | ||||
|  * @copyright | ||||
|  * | ||||
|  * Copyright (C) 2020 Anoxinon e.V.  | ||||
|  * | ||||
|  * This file is part of xmppc. | ||||
|  * | ||||
|  * xmppc is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * xmppc is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Foobar.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * German | ||||
|  * | ||||
|  * Diese Datei ist Teil von xmppc. | ||||
|  * | ||||
|  * xmppc ist Freie Software: Sie können es unter den Bedingungen | ||||
|  * der GNU General Public License, wie von der Free Software Foundation, | ||||
|  * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren | ||||
|  * veröffentlichten Version, weiter verteilen und/oder modifizieren. | ||||
|  * | ||||
|  * xmppc wird in der Hoffnung, dass es nützlich sein wird, aber | ||||
|  * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite | ||||
|  * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. | ||||
|  * Siehe die GNU General Public License für weitere Details. | ||||
|  * | ||||
|  * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem | ||||
|  * Programm erhalten haben. Wenn nicht, siehe <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include "xmppc.h" | ||||
| #include <assert.h> | ||||
| #include <stdarg.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| /*! @file xmppc.c | ||||
|  * | ||||
|  * xmppc | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| /*! | ||||
|  * Error logging | ||||
|  * | ||||
|  * \param xmppc the xmppc context structure | ||||
|  * \param fmt format of message | ||||
|  * | ||||
|  */ | ||||
| void logError(xmppc_t *xmppc, const char *fmt, ...) { | ||||
|   va_list args; | ||||
|   va_start(args, fmt); | ||||
|   vfprintf(stderr, fmt, args); | ||||
|   va_end(args); | ||||
| } | ||||
|  | ||||
| void logWarn(xmppc_t *xmppc, const char *fmt, ...) { | ||||
|   if (xmppc->loglevel) { | ||||
|     va_list args; | ||||
|     va_start(args, fmt); | ||||
|     vprintf(fmt, args); | ||||
|     va_end(args); | ||||
|   } | ||||
| } | ||||
|  | ||||
| void logInfo(xmppc_t *xmppc, const char *fmt, ...) { | ||||
|   if (xmppc->loglevel) { | ||||
|     va_list args; | ||||
|     va_start(args, fmt); | ||||
|     vprintf(fmt, args); | ||||
|     va_end(args); | ||||
|   } | ||||
| } | ||||
|  | ||||
| void logDebug(xmppc_t *xmppc, const char *fmt, ...) { | ||||
|   if (xmppc->loglevel) { | ||||
|     va_list args; | ||||
|     va_start(args, fmt); | ||||
|     vprintf(fmt, args); | ||||
|     va_end(args); | ||||
|   } | ||||
| } | ||||
|  | ||||
| /*! | ||||
|  * \brief Setup the application context. | ||||
|  * | ||||
|  * \param xmppc | ||||
|  * \return 0 - ok | ||||
|  * | ||||
|  **/ | ||||
| int xmppc_context(xmppc_t *xmppc, int level) { | ||||
|   assert(xmppc != NULL); | ||||
|   assert(xmppc->ctx == NULL); | ||||
|   xmpp_log_t *log = NULL; | ||||
|  | ||||
|   if (level > TRACE) { | ||||
|     logError(xmppc, "Log level %d not supported. Max: %d.\n", level, TRACE); | ||||
|     exit(-1); | ||||
|   } | ||||
|  | ||||
|   xmppc->loglevel = level; | ||||
|  | ||||
|   if (level == ERROR) { | ||||
|     log = xmpp_get_default_logger(XMPP_LEVEL_ERROR); | ||||
|   } else if (level == WARN) { | ||||
|     log = xmpp_get_default_logger(XMPP_LEVEL_WARN); | ||||
|   } else if (level == INFO) { | ||||
|     log = xmpp_get_default_logger(XMPP_LEVEL_INFO); | ||||
|   } else if (level == DEBUG) { | ||||
|     log = xmpp_get_default_logger(XMPP_LEVEL_DEBUG); | ||||
|   } else if (level == TRACE) { | ||||
|     log = xmpp_get_default_logger(XMPP_LEVEL_DEBUG); | ||||
|   } | ||||
|  | ||||
|   xmpp_ctx_t *ctx = xmpp_ctx_new(NULL, log); | ||||
|   xmppc->ctx = ctx; | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| int xmppc_connect(xmppc_t *xmppc, char *jid, char *password) { | ||||
|   assert(xmppc != NULL); | ||||
|   assert(jid != NULL); | ||||
|   assert(password != NULL); | ||||
|   xmpp_conn_t *conn = xmpp_conn_new(xmppc->ctx); | ||||
|   assert(conn != NULL); | ||||
|  | ||||
|   xmpp_conn_set_jid(conn, jid); | ||||
|   xmpp_conn_set_pass(conn, password); | ||||
|   xmppc->conn = conn; | ||||
|   return 0; | ||||
| } | ||||
							
								
								
									
										100
									
								
								src/xmpp.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								src/xmpp.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,100 @@ | ||||
| /* | ||||
|  * @file xmppc.h | ||||
|  * | ||||
|  * vim: expandtab:ts=2:sts=2:sw=2 | ||||
|  * | ||||
|  * @copyright  | ||||
|  * | ||||
|  * Copyright (C) 2020 Anoxinon e.V. | ||||
|  * | ||||
|  * This file is part of xmppc. | ||||
|  * | ||||
|  * xmppc is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * xmppc is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with Foobar.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * German | ||||
|  * | ||||
|  * Diese Datei ist Teil von xmppc. | ||||
|  * | ||||
|  * xmppc ist Freie Software: Sie können es unter den Bedingungen | ||||
|  * der GNU General Public License, wie von der Free Software Foundation, | ||||
|  * Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren | ||||
|  * veröffentlichten Version, weiter verteilen und/oder modifizieren. | ||||
|  * | ||||
|  * xmppc wird in der Hoffnung, dass es nützlich sein wird, aber | ||||
|  * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite | ||||
|  * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. | ||||
|  * Siehe die GNU General Public License für weitere Details. | ||||
|  * | ||||
|  * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem | ||||
|  * Programm erhalten haben. Wenn nicht, siehe <https://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #ifndef XMPPC_XMPPC_H__ | ||||
| #define XMPPC_XMPPC_H__ | ||||
|  | ||||
| #include "config.h" | ||||
|  | ||||
| #include <stdarg.h> | ||||
| #include <stdio.h> | ||||
| #include <strophe.h> | ||||
|  | ||||
| #define ANSI_COLOR_RED      "\x1b[31m" | ||||
| #define ANSI_COLOR_GREEN    "\x1b[32m" | ||||
| #define ANSI_COLOR_YELLOW   "\x1b[33m" | ||||
| #define ANSI_COLOR_BLUE     "\x1b[34m" | ||||
| #define ANSI_COLOR_MAGENTA  "\x1b[35m" | ||||
| #define ANSI_COLOR_CYAN     "\x1b[36m" | ||||
|  | ||||
| #define ANSI_COLOR_B_RED    "\x1b[91m" | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * XMPPC Level of Logging | ||||
|  * | ||||
|  */ | ||||
| typedef enum loglevel {  | ||||
|   ERROR = 0, | ||||
|   WARN  = 1, | ||||
|   INFO  = 2, | ||||
|   DEBUG = 3, | ||||
|   TRACE = 4 | ||||
| } loglevel_t; | ||||
|  | ||||
| typedef enum mode { UNKOWN, ACCOUNT, ROSTER, MESSAGE, MUC, OMEMO, PGP, OPENPGP, MONITOR } xmppc_mode_t; | ||||
|  | ||||
| typedef struct { | ||||
|   /** log level **/ | ||||
|   loglevel_t loglevel; | ||||
|   xmpp_ctx_t *ctx; | ||||
|   xmpp_conn_t *conn; | ||||
|   xmppc_mode_t mode; | ||||
| } xmppc_t; | ||||
|  | ||||
| #define INIT_XMPPC(X) xmppc_t X = {.loglevel = ERROR, .ctx = NULL, .conn = NULL, .mode = UNKOWN} | ||||
|  | ||||
| typedef void (*ExecuteHandler)(xmppc_t *, int, char **); | ||||
|  | ||||
| void logError(xmppc_t *xmppc_t, const char *fmt, ...); | ||||
|  | ||||
| void logWarn(xmppc_t *xmppc, const char *fmt, ...); | ||||
|  | ||||
| void logInfo(xmppc_t *xmppc, const char *fmt, ...); | ||||
|  | ||||
| void logDebug(xmppc_t *xmppc, const char *fmt, ...); | ||||
|  | ||||
| int xmppc_context(xmppc_t *xmppc, int level); | ||||
|  | ||||
| int xmppc_connect(xmppc_t *_xmppc, char *jid, char *password); | ||||
|  | ||||
| #endif // XMPPC_XMPPC_H__ | ||||
		Reference in New Issue
	
	Block a user
	 DebXWoody
					DebXWoody