mirror of
https://github.com/ZoiteChat/zoitechat.git
synced 2026-03-10 07:50:19 +00:00
Fix building as c89
This commit is contained in:
@@ -39,17 +39,17 @@ static const char fish_base64[64] = "./0123456789abcdefghijklmnopqrstuvwxyzABCDE
|
||||
static const signed char fish_unbase64[256] = {
|
||||
IB,IB,IB,IB,IB,IB,IB,IB, IB,IB,IB,IB,IB,IB,IB,IB,
|
||||
IB,IB,IB,IB,IB,IB,IB,IB, IB,IB,IB,IB,IB,IB,IB,IB,
|
||||
// ! " # $ % & ' ( ) * + , - . /
|
||||
/* ! " # $ % & ' ( ) * + , - . / */
|
||||
IB,IB,IB,IB,IB,IB,IB,IB, IB,IB,IB,IB,IB,IB, 0, 1,
|
||||
// 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
|
||||
/* 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */
|
||||
2, 3, 4, 5, 6, 7, 8, 9, 10,11,IB,IB,IB,IB,IB,IB,
|
||||
// @ A B C D E F G H I J K L M N O
|
||||
/* @ A B C D E F G H I J K L M N O */
|
||||
IB,38,39,40,41,42,43,44, 45,46,47,48,49,50,51,52,
|
||||
// P Q R S T U V W X Y Z [ \ ] ^ _
|
||||
/* P Q R S T U V W X Y Z [ \ ] ^ _*/
|
||||
53,54,55,56,57,58,59,60, 61,62,63,IB,IB,IB,IB,IB,
|
||||
// ` a b c d e f g h i j k l m n o
|
||||
/* ` a b c d e f g h i j k l m n o */
|
||||
IB,12,13,14,15,16,17,18, 19,20,21,22,23,24,25,26,
|
||||
// p q r s t u v w x y z { | } ~ <del>
|
||||
/* p q r s t u v w x y z { | } ~ <del> */
|
||||
27,28,29,30,31,32,33,34, 35,36,37,IB,IB,IB,IB,IB,
|
||||
};
|
||||
|
||||
@@ -75,11 +75,11 @@ char *fish_encrypt(const char *key, size_t keylen, const char *message) {
|
||||
|
||||
messagelen = strlen(message);
|
||||
if (messagelen == 0) return NULL;
|
||||
encrypted = g_malloc(((messagelen - 1) / 8) * 12 + 12 + 1); // each 8-byte block becomes 12 bytes
|
||||
encrypted = g_malloc(((messagelen - 1) / 8) * 12 + 12 + 1); /* each 8-byte block becomes 12 bytes */
|
||||
end = encrypted;
|
||||
|
||||
while (*message) {
|
||||
// Read 8 bytes (a Blowfish block)
|
||||
/* Read 8 bytes (a Blowfish block) */
|
||||
BF_LONG binary[2] = { 0, 0 };
|
||||
unsigned char c;
|
||||
for (i = 0; i < 8; i++) {
|
||||
@@ -89,10 +89,10 @@ char *fish_encrypt(const char *key, size_t keylen, const char *message) {
|
||||
}
|
||||
message += 8;
|
||||
|
||||
// Encrypt block
|
||||
/* Encrypt block */
|
||||
BF_encrypt(binary, &bfkey);
|
||||
|
||||
// Emit FiSH-BASE64
|
||||
/* Emit FiSH-BASE64 */
|
||||
bit = 0;
|
||||
word = 1;
|
||||
for (j = 0; j < 12; j++) {
|
||||
@@ -105,7 +105,7 @@ char *fish_encrypt(const char *key, size_t keylen, const char *message) {
|
||||
}
|
||||
}
|
||||
|
||||
// Stop if a null terminator was found
|
||||
/* Stop if a null terminator was found */
|
||||
if (c == '\0') break;
|
||||
}
|
||||
*end = '\0';
|
||||
@@ -127,7 +127,7 @@ char *fish_decrypt(const char *key, size_t keylen, const char *data) {
|
||||
end = decrypted;
|
||||
|
||||
while (*data) {
|
||||
// Convert from FiSH-BASE64
|
||||
/* Convert from FiSH-BASE64 */
|
||||
BF_LONG binary[2] = { 0, 0 };
|
||||
bit = 0;
|
||||
word = 1;
|
||||
@@ -142,10 +142,10 @@ char *fish_decrypt(const char *key, size_t keylen, const char *data) {
|
||||
}
|
||||
}
|
||||
|
||||
// Decrypt block
|
||||
/* Decrypt block */
|
||||
BF_decrypt(binary, &bfkey);
|
||||
|
||||
// Copy to buffer
|
||||
/* Copy to buffer */
|
||||
GET_BYTES(end, binary[0]);
|
||||
GET_BYTES(end, binary[1]);
|
||||
}
|
||||
@@ -163,11 +163,11 @@ char *fish_encrypt_for_nick(const char *nick, const char *data) {
|
||||
char *key;
|
||||
char *encrypted;
|
||||
|
||||
// Look for key
|
||||
/* Look for key */
|
||||
key = keystore_get_key(nick);
|
||||
if (!key) return NULL;
|
||||
|
||||
// Encrypt
|
||||
/* Encrypt */
|
||||
encrypted = fish_encrypt(key, strlen(key), data);
|
||||
|
||||
g_free(key);
|
||||
@@ -181,11 +181,11 @@ char *fish_encrypt_for_nick(const char *nick, const char *data) {
|
||||
char *fish_decrypt_from_nick(const char *nick, const char *data) {
|
||||
char *key;
|
||||
char *decrypted;
|
||||
// Look for key
|
||||
/* Look for key */
|
||||
key = keystore_get_key(nick);
|
||||
if (!key) return NULL;
|
||||
|
||||
// Decrypt
|
||||
/* Decrypt */
|
||||
decrypted = fish_decrypt(key, strlen(key), data);
|
||||
|
||||
g_free(key);
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
#ifndef FISH_H
|
||||
#define FISH_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
@@ -32,26 +32,26 @@
|
||||
* at spaces. The prefix and command is extracted from the message, and
|
||||
* parameters_offset is set to the index of the first parameter.
|
||||
*/
|
||||
bool irc_parse_message(const char *words[],
|
||||
gboolean irc_parse_message(const char *words[],
|
||||
const char **prefix, const char **command,
|
||||
size_t *parameters_offset) {
|
||||
size_t w = 1;
|
||||
if (prefix) *prefix = NULL;
|
||||
if (command) *command = NULL;
|
||||
|
||||
// See if the message starts with a prefix (sender user)
|
||||
/* See if the message starts with a prefix (sender user) */
|
||||
if (words[w][0] == ':') {
|
||||
if (prefix) *prefix = &words[w][1];
|
||||
w++;
|
||||
}
|
||||
|
||||
// Check command
|
||||
if (words[w][0] == '\0') return false;
|
||||
/* Check command */
|
||||
if (words[w][0] == '\0') return FALSE;
|
||||
if (command) *command = words[w];
|
||||
w++;
|
||||
|
||||
*parameters_offset = w;
|
||||
return true;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
@@ -70,11 +70,11 @@ char *irc_prefix_get_nick(const char *prefix) {
|
||||
|
||||
if (!prefix) return NULL;
|
||||
|
||||
// Find end of nick
|
||||
/* Find end of nick */
|
||||
end = prefix;
|
||||
while (*end != '\0' && *end != '!' && *end != '@') end++;
|
||||
|
||||
// Allocate string
|
||||
/* Allocate string */
|
||||
length = end - prefix;
|
||||
return g_strndup (prefix, length);
|
||||
}
|
||||
|
||||
@@ -25,12 +25,10 @@
|
||||
#ifndef IRC_H
|
||||
#define IRC_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
bool irc_parse_message(const char *words[],
|
||||
gboolean irc_parse_message(const char *words[],
|
||||
const char **prefix, const char **command,
|
||||
size_t *parameters_offset);
|
||||
char *irc_prefix_get_nick(const char *prefix);
|
||||
|
||||
@@ -58,7 +58,7 @@ static GKeyFile *getConfigFile() {
|
||||
static const char *get_keystore_password() {
|
||||
return (keystore_password != NULL ?
|
||||
keystore_password :
|
||||
// Silly default value...
|
||||
/* Silly default value... */
|
||||
"blowinikey");
|
||||
}
|
||||
|
||||
@@ -88,17 +88,17 @@ static gchar *get_nick_value(GKeyFile *keyfile, const char *nick, const char *it
|
||||
* Extracts a key from the key store file.
|
||||
*/
|
||||
char *keystore_get_key(const char *nick) {
|
||||
// Get the key
|
||||
/* Get the key */
|
||||
GKeyFile *keyfile = getConfigFile();
|
||||
gchar *value = get_nick_value(keyfile, nick, "key");
|
||||
g_key_file_free(keyfile);
|
||||
if (!value) return NULL;
|
||||
|
||||
if (strncmp(value, "+OK ", 4) != 0) {
|
||||
// Key is stored in plaintext
|
||||
/* Key is stored in plaintext */
|
||||
return value;
|
||||
} else {
|
||||
// Key is encrypted
|
||||
/* Key is encrypted */
|
||||
const char *encrypted = value+4;
|
||||
const char *password = get_keystore_password();
|
||||
char *decrypted = fish_decrypt(password, strlen(password), encrypted);
|
||||
@@ -110,10 +110,10 @@ char *keystore_get_key(const char *nick) {
|
||||
/**
|
||||
* Deletes a nick and the associated key in the key store file.
|
||||
*/
|
||||
static bool delete_nick(GKeyFile *keyfile, const char *nick) {
|
||||
static gboolean delete_nick(GKeyFile *keyfile, const char *nick) {
|
||||
gchar **group;
|
||||
gchar **groups = g_key_file_get_groups(keyfile, NULL);
|
||||
bool ok = false;
|
||||
gboolean ok = FALSE;
|
||||
|
||||
for (group = groups; *group != NULL; group++) {
|
||||
if (!irc_nick_cmp(*group, nick)) {
|
||||
@@ -149,9 +149,9 @@ static gboolean keyfile_save_to_file (GKeyFile *keyfile, char *filename) {
|
||||
/**
|
||||
* Writes the key store file to disk.
|
||||
*/
|
||||
static bool save_keystore(GKeyFile *keyfile) {
|
||||
static gboolean save_keystore(GKeyFile *keyfile) {
|
||||
char *filename;
|
||||
bool ok;
|
||||
gboolean ok;
|
||||
|
||||
filename = get_config_filename();
|
||||
#if !GLIB_CHECK_VERSION(2,40,0)
|
||||
@@ -167,36 +167,36 @@ static bool save_keystore(GKeyFile *keyfile) {
|
||||
/**
|
||||
* Sets a key in the key store file.
|
||||
*/
|
||||
bool keystore_store_key(const char *nick, const char *key) {
|
||||
gboolean keystore_store_key(const char *nick, const char *key) {
|
||||
const char *password;
|
||||
char *encrypted;
|
||||
char *wrapped;
|
||||
bool ok = false;
|
||||
gboolean ok = FALSE;
|
||||
GKeyFile *keyfile = getConfigFile();
|
||||
|
||||
// Remove old key
|
||||
/* Remove old key */
|
||||
delete_nick(keyfile, nick);
|
||||
|
||||
// Add new key
|
||||
/* Add new key */
|
||||
password = get_keystore_password();
|
||||
if (password) {
|
||||
// Encrypt the password
|
||||
/* Encrypt the password */
|
||||
encrypted = fish_encrypt(password, strlen(password), key);
|
||||
if (!encrypted) goto end;
|
||||
|
||||
// Prepend "+OK "
|
||||
/* Prepend "+OK " */
|
||||
wrapped = g_strconcat("+OK ", encrypted, NULL);
|
||||
g_free(encrypted);
|
||||
|
||||
// Store encrypted in file
|
||||
/* Store encrypted in file */
|
||||
g_key_file_set_string(keyfile, nick, "key", wrapped);
|
||||
g_free(wrapped);
|
||||
} else {
|
||||
// Store unencrypted in file
|
||||
/* Store unencrypted in file */
|
||||
g_key_file_set_string(keyfile, nick, "key", key);
|
||||
}
|
||||
|
||||
// Save key store file
|
||||
/* Save key store file */
|
||||
ok = save_keystore(keyfile);
|
||||
|
||||
end:
|
||||
@@ -207,13 +207,13 @@ bool keystore_store_key(const char *nick, const char *key) {
|
||||
/**
|
||||
* Deletes a nick from the key store.
|
||||
*/
|
||||
bool keystore_delete_nick(const char *nick) {
|
||||
gboolean keystore_delete_nick(const char *nick) {
|
||||
GKeyFile *keyfile = getConfigFile();
|
||||
|
||||
// Delete entry
|
||||
bool ok = delete_nick(keyfile, nick);
|
||||
/* Delete entry */
|
||||
gboolean ok = delete_nick(keyfile, nick);
|
||||
|
||||
// Save
|
||||
/* Save */
|
||||
if (ok) save_keystore(keyfile);
|
||||
|
||||
g_key_file_free(keyfile);
|
||||
|
||||
@@ -25,14 +25,13 @@
|
||||
#ifndef KEYSTORE_H
|
||||
#define KEYSTORE_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
char *keystore_get_key(const char *nick);
|
||||
bool keystore_store_key(const char *nick, const char *key);
|
||||
bool keystore_delete_nick(const char *nick);
|
||||
gboolean keystore_store_key(const char *nick, const char *key);
|
||||
gboolean keystore_delete_nick(const char *nick);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -28,13 +28,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
// #pragma GCC visibility push(default)
|
||||
#include "hexchat-plugin.h"
|
||||
#define HEXCHAT_MAX_WORDS 32
|
||||
// #pragma GCC visibility pop
|
||||
|
||||
//#define EXPORT __attribute((visibility("default")))
|
||||
//#define EXPORT
|
||||
|
||||
#include "fish.h"
|
||||
#include "keystore.h"
|
||||
@@ -81,16 +76,16 @@ int irc_nick_cmp(const char *a, const char *b) {
|
||||
*/
|
||||
static int handle_outgoing(char *word[], char *word_eol[], void *userdata) {
|
||||
const char *own_nick;
|
||||
// Encrypt the message if possible
|
||||
/* Encrypt the message if possible */
|
||||
const char *channel = hexchat_get_info(ph, "channel");
|
||||
char *encrypted = fish_encrypt_for_nick(channel, word_eol[1]);
|
||||
if (!encrypted) return HEXCHAT_EAT_NONE;
|
||||
|
||||
// Display message
|
||||
/* Display message */
|
||||
own_nick = hexchat_get_info(ph, "nick");
|
||||
hexchat_emit_print(ph, "Your Message", own_nick, word_eol[1], NULL);
|
||||
|
||||
// Send message
|
||||
/* Send message */
|
||||
hexchat_commandf(ph, "PRIVMSG %s :+OK %s", channel, encrypted);
|
||||
|
||||
g_free(encrypted);
|
||||
@@ -117,10 +112,10 @@ static int handle_incoming(char *word[], char *word_eol[], hexchat_event_attrs *
|
||||
if (!irc_parse_message((const char **)word, &prefix, &command, &w))
|
||||
return HEXCHAT_EAT_NONE;
|
||||
|
||||
// Topic (command 332) has an extra parameter
|
||||
/* Topic (command 332) has an extra parameter */
|
||||
if (!strcmp(command, "332")) w++;
|
||||
|
||||
// Look for encrypted data
|
||||
/* Look for encrypted data */
|
||||
for (ew = w+1; ew < HEXCHAT_MAX_WORDS-1; ew++) {
|
||||
const char *s = (ew == w+1 ? word[ew]+1 : word[ew]);
|
||||
if (*s && (s[1] == '+' || s[1] == 'm')) { prefix_char = *(s++); }
|
||||
@@ -129,19 +124,19 @@ static int handle_incoming(char *word[], char *word_eol[], hexchat_event_attrs *
|
||||
}
|
||||
return HEXCHAT_EAT_NONE;
|
||||
has_encrypted_data: ;
|
||||
// Extract sender nick and recipient nick/channel
|
||||
/* Extract sender nick and recipient nick/channel */
|
||||
sender_nick = irc_prefix_get_nick(prefix);
|
||||
recipient = word[w];
|
||||
|
||||
// Try to decrypt with these (the keys are searched for in the key store)
|
||||
/* Try to decrypt with these (the keys are searched for in the key store) */
|
||||
encrypted = word[ew+1];
|
||||
decrypted = fish_decrypt_from_nick(recipient, encrypted);
|
||||
if (!decrypted) decrypted = fish_decrypt_from_nick(sender_nick, encrypted);
|
||||
|
||||
// Check for error
|
||||
/* Check for error */
|
||||
if (!decrypted) goto decrypt_error;
|
||||
|
||||
// Build unecrypted message
|
||||
/* Build unecrypted message */
|
||||
message = g_string_sized_new (100); /* TODO: more accurate estimation of size */
|
||||
g_string_append (message, "RECV");
|
||||
|
||||
@@ -160,12 +155,12 @@ static int handle_incoming(char *word[], char *word_eol[], hexchat_event_attrs *
|
||||
g_string_append_c (message, ' ');
|
||||
|
||||
if (uw == ew) {
|
||||
// Add the encrypted data
|
||||
/* Add the encrypted data */
|
||||
peice = decrypted;
|
||||
uw++; // Skip "OK+"
|
||||
uw++; /* Skip "OK+" */
|
||||
|
||||
if (ew == w+1) {
|
||||
// Prefix with colon, which gets stripped out otherwise
|
||||
/* Prefix with colon, which gets stripped out otherwise */
|
||||
g_string_append_c (message, ':');
|
||||
}
|
||||
|
||||
@@ -174,7 +169,7 @@ static int handle_incoming(char *word[], char *word_eol[], hexchat_event_attrs *
|
||||
}
|
||||
|
||||
} else {
|
||||
// Add unencrypted data (for example, a prefix from a bouncer or bot)
|
||||
/* Add unencrypted data (for example, a prefix from a bouncer or bot) */
|
||||
peice = word[uw];
|
||||
}
|
||||
|
||||
@@ -182,8 +177,8 @@ static int handle_incoming(char *word[], char *word_eol[], hexchat_event_attrs *
|
||||
}
|
||||
g_free(decrypted);
|
||||
|
||||
// Simulate unencrypted message
|
||||
//hexchat_printf(ph, "simulating: %s\n", message->str);
|
||||
/* Simulate unencrypted message */
|
||||
/* hexchat_printf(ph, "simulating: %s\n", message->str); */
|
||||
hexchat_command(ph, message->str);
|
||||
|
||||
g_string_free (message, TRUE);
|
||||
@@ -203,23 +198,23 @@ static int handle_setkey(char *word[], char *word_eol[], void *userdata) {
|
||||
const char *nick;
|
||||
const char *key;
|
||||
|
||||
// Check syntax
|
||||
/* Check syntax */
|
||||
if (*word[2] == '\0') {
|
||||
hexchat_printf(ph, "%s\n", usage_setkey);
|
||||
return HEXCHAT_EAT_HEXCHAT;
|
||||
}
|
||||
|
||||
if (*word[3] == '\0') {
|
||||
// /setkey password
|
||||
/* /setkey password */
|
||||
nick = hexchat_get_info(ph, "channel");
|
||||
key = word_eol[2];
|
||||
} else {
|
||||
// /setkey #channel password
|
||||
/* /setkey #channel password */
|
||||
nick = word[2];
|
||||
key = word_eol[3];
|
||||
}
|
||||
|
||||
// Set password
|
||||
/* Set password */
|
||||
if (keystore_store_key(nick, key)) {
|
||||
hexchat_printf(ph, "Stored key for %s\n", nick);
|
||||
} else {
|
||||
@@ -235,7 +230,7 @@ static int handle_setkey(char *word[], char *word_eol[], void *userdata) {
|
||||
static int handle_delkey(char *word[], char *word_eol[], void *userdata) {
|
||||
const char *nick;
|
||||
|
||||
// Check syntax
|
||||
/* Check syntax */
|
||||
if (*word[2] == '\0' || *word[3] != '\0') {
|
||||
hexchat_printf(ph, "%s\n", usage_delkey);
|
||||
return HEXCHAT_EAT_HEXCHAT;
|
||||
@@ -243,7 +238,7 @@ static int handle_delkey(char *word[], char *word_eol[], void *userdata) {
|
||||
|
||||
nick = g_strstrip (word_eol[2]);
|
||||
|
||||
// Delete the given nick from the key store
|
||||
/* Delete the given nick from the key store */
|
||||
if (keystore_delete_nick(nick)) {
|
||||
hexchat_printf(ph, "Deleted key for %s\n", nick);
|
||||
} else {
|
||||
@@ -286,7 +281,7 @@ int hexchat_plugin_init(hexchat_plugin *plugin_handle,
|
||||
hexchat_hook_command(ph, "", HEXCHAT_PRI_NORM, handle_outgoing, NULL, NULL);
|
||||
hexchat_hook_server_attrs(ph, "NOTICE", HEXCHAT_PRI_NORM, handle_incoming, NULL);
|
||||
hexchat_hook_server_attrs(ph, "PRIVMSG", HEXCHAT_PRI_NORM, handle_incoming, NULL);
|
||||
//hexchat_hook_server(ph, "RAW LINE", HEXCHAT_PRI_NORM, handle_debug, NULL);
|
||||
/* hexchat_hook_server(ph, "RAW LINE", HEXCHAT_PRI_NORM, handle_debug, NULL); */
|
||||
hexchat_hook_server_attrs(ph, "TOPIC", HEXCHAT_PRI_NORM, handle_incoming, NULL);
|
||||
hexchat_hook_server_attrs(ph, "332", HEXCHAT_PRI_NORM, handle_incoming, NULL);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user