Page Menu
Home
DevCentral
Search
Configure Global Search
Log In
Files
F3715269
D3096.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
14 KB
Referenced Files
None
Subscribers
None
D3096.diff
View Options
diff --git a/dat/setup.ini b/dat/setup.ini
--- a/dat/setup.ini
+++ b/dat/setup.ini
@@ -47,6 +47,8 @@
RANDOM_BACKUP=0
RANDOM_IDLE_TIME=1800
RANDOM_TIME=3600
+SASL_USER=
+SASL_PASS=
SEEN_MODE=1
SEEN_TIME=604800
SEEN_TEXT=in the last 7 days.
diff --git a/source/Makefile.am b/source/Makefile.am
--- a/source/Makefile.am
+++ b/source/Makefile.am
@@ -35,6 +35,7 @@
users.c chansrv.c helpers.c quiz.c seen.c stats.c \
vars.c comm.c main.c random.c server.c topics.c web.c \
parse.c raw.c signals.c tree.c url.c xmlame.c \
+ utils/base64.c utils/sasl.c \
langs/*.h \
prototypes.h tree.h vars.h
darkbot_LDADD = compat/libcompat.a
diff --git a/source/comm.c b/source/comm.c
--- a/source/comm.c
+++ b/source/comm.c
@@ -12,6 +12,7 @@
#include "defines.h"
#include "vars.h"
#include "prototypes.h"
+#include "utils/sasl.h"
/**
* Delete one or more elements from the sendq
@@ -453,6 +454,20 @@
register_bot (void)
{
get_sendq_count (1);
+
+ // SASL nickserv authentication needs to be done as soon as connected
+ // to the server, before registering with NICK and USER, PASS commands.
+ if (strlen(SASL_USER) > 0 && strlen(SASL_PASS) > 0) {
+ char* sasl_plain_string = build_sasl_plain_string(SASL_USER, SASL_USER, SASL_PASS);
+
+ Snow ("CAP REQ :SASL\n");
+ Snow ("CAP END\n");
+ Snow ("AUTHENTICATE PLAIN\n");
+ Snow ("AUTHENTICATE %s\n", sasl_plain_string);
+
+ free(sasl_plain_string);
+ }
+
Snow ("NICK %s\n", Mynick);
strlwr (UID);
Snow ("USER %s %d %d :%s \2%d\2\n", UID, time (NULL), time (NULL), REALNAME, NUM_HELPER);
diff --git a/source/utils/base64.h b/source/utils/base64.h
new file mode 100644
--- /dev/null
+++ b/source/utils/base64.h
@@ -0,0 +1,13 @@
+/* -------------------------------------------------------------
+ Base64 - RFC 1341
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ Description: Base64 helper functions
+ Author: Jouni Malinen <j@w1.fi>
+ License: BSD-2-Clause
+ Source: This version has been extracted from FreeBSD
+ source code - src/contrib/wpa/src/utils/base64.h
+ Commit source: 0a6760a1de32bf5df91ef926eba25b3f74b4f84f
+ ------------------------------------------------------------- */
+
+char * base64_encode(const void *src, size_t len, size_t *out_len);
+unsigned char * base64_decode(const char *src, size_t len, size_t *out_len);
diff --git a/source/utils/base64.c b/source/utils/base64.c
new file mode 100644
--- /dev/null
+++ b/source/utils/base64.c
@@ -0,0 +1,195 @@
+/* -------------------------------------------------------------
+ Base64 - RFC 1341
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ Description: Base64 helper functions
+ Author: Jouni Malinen <j@w1.fi>
+ License: BSD-2-Clause
+ Source: This version has been extracted from FreeBSD
+ source code - src/contrib/wpa/src/utils/base64.c
+ Commit source: 0a6760a1de32bf5df91ef926eba25b3f74b4f84f
+ ------------------------------------------------------------- */
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef BIT
+#define BIT(x) (1U << (x))
+#endif
+
+/* -------------------------------------------------------------
+ Helper functions to actually do the encode/decode work
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+static const char base64_table[65] =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+#define BASE64_PAD BIT(0)
+#define BASE64_LF BIT(1)
+
+static char * base64_gen_encode(const unsigned char *src, size_t len,
+ size_t *out_len, const char *table, int add_pad)
+{
+ char *out, *pos;
+ const unsigned char *end, *in;
+ size_t olen;
+ int line_len;
+
+ if (len >= SIZE_MAX / 4)
+ return NULL;
+ olen = len * 4 / 3 + 4; /* 3-byte blocks to 4-byte */
+ if (add_pad & BASE64_LF)
+ olen += olen / 72; /* line feeds */
+ olen++; /* nul termination */
+ if (olen < len)
+ return NULL; /* integer overflow */
+ out = malloc(olen);
+ if (out == NULL)
+ return NULL;
+
+ end = src + len;
+ in = src;
+ pos = out;
+ line_len = 0;
+ while (end - in >= 3) {
+ *pos++ = table[(in[0] >> 2) & 0x3f];
+ *pos++ = table[(((in[0] & 0x03) << 4) | (in[1] >> 4)) & 0x3f];
+ *pos++ = table[(((in[1] & 0x0f) << 2) | (in[2] >> 6)) & 0x3f];
+ *pos++ = table[in[2] & 0x3f];
+ in += 3;
+ line_len += 4;
+ if ((add_pad & BASE64_LF) && line_len >= 72) {
+ *pos++ = '\n';
+ line_len = 0;
+ }
+ }
+
+ if (end - in) {
+ *pos++ = table[(in[0] >> 2) & 0x3f];
+ if (end - in == 1) {
+ *pos++ = table[((in[0] & 0x03) << 4) & 0x3f];
+ if (add_pad & BASE64_PAD)
+ *pos++ = '=';
+ } else {
+ *pos++ = table[(((in[0] & 0x03) << 4) |
+ (in[1] >> 4)) & 0x3f];
+ *pos++ = table[((in[1] & 0x0f) << 2) & 0x3f];
+ }
+ if (add_pad & BASE64_PAD)
+ *pos++ = '=';
+ line_len += 4;
+ }
+
+ if ((add_pad & BASE64_LF) && line_len)
+ *pos++ = '\n';
+
+ *pos = '\0';
+ if (out_len)
+ *out_len = pos - out;
+ return out;
+}
+
+static unsigned char * base64_gen_decode(const char *src, size_t len,
+ size_t *out_len, const char *table)
+{
+ unsigned char dtable[256], *out, *pos, block[4], tmp;
+ size_t i, count, olen;
+ int pad = 0;
+ size_t extra_pad;
+
+ memset(dtable, 0x80, 256);
+ for (i = 0; i < sizeof(base64_table) - 1; i++)
+ dtable[(unsigned char) table[i]] = (unsigned char) i;
+ dtable['='] = 0;
+
+ count = 0;
+ for (i = 0; i < len; i++) {
+ if (dtable[(unsigned char) src[i]] != 0x80)
+ count++;
+ }
+
+ if (count == 0)
+ return NULL;
+ extra_pad = (4 - count % 4) % 4;
+
+ olen = (count + extra_pad) / 4 * 3;
+ pos = out = malloc(olen);
+ if (out == NULL)
+ return NULL;
+
+ count = 0;
+ for (i = 0; i < len + extra_pad; i++) {
+ unsigned char val;
+
+ if (i >= len)
+ val = '=';
+ else
+ val = src[i];
+ tmp = dtable[val];
+ if (tmp == 0x80)
+ continue;
+
+ if (val == '=')
+ pad++;
+ block[count] = tmp;
+ count++;
+ if (count == 4) {
+ *pos++ = (block[0] << 2) | (block[1] >> 4);
+ *pos++ = (block[1] << 4) | (block[2] >> 2);
+ *pos++ = (block[2] << 6) | block[3];
+ count = 0;
+ if (pad) {
+ if (pad == 1)
+ pos--;
+ else if (pad == 2)
+ pos -= 2;
+ else {
+ /* Invalid padding */
+ free(out);
+ return NULL;
+ }
+ break;
+ }
+ }
+ }
+
+ *out_len = pos - out;
+ return out;
+}
+
+/* -------------------------------------------------------------
+ High-level functions to use as library
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+/**
+ * base64_encode - Base64 encode
+ * @src: Data to be encoded
+ * @len: Length of the data to be encoded
+ * @out_len: Pointer to output length variable, or %NULL if not used
+ * Returns: Allocated buffer of out_len bytes of encoded data,
+ * or %NULL on failure
+ *
+ * Caller is responsible for freeing the returned buffer. Returned buffer is
+ * nul terminated to make it easier to use as a C string. The nul terminator is
+ * not included in out_len.
+ */
+char * base64_encode(const void *src, size_t len, size_t *out_len)
+{
+ return base64_gen_encode(src, len, out_len, base64_table,
+ BASE64_PAD | BASE64_LF);
+}
+
+/**
+ * base64_decode - Base64 decode
+ * @src: Data to be decoded
+ * @len: Length of the data to be decoded
+ * @out_len: Pointer to output length variable
+ * Returns: Allocated buffer of out_len bytes of decoded data,
+ * or %NULL on failure
+ *
+ * Caller is responsible for freeing the returned buffer.
+ */
+unsigned char * base64_decode(const char *src, size_t len, size_t *out_len)
+{
+ return base64_gen_decode(src, len, out_len, base64_table);
+}
diff --git a/source/utils/sasl.h b/source/utils/sasl.h
new file mode 100644
--- /dev/null
+++ b/source/utils/sasl.h
@@ -0,0 +1,7 @@
+/* -------------------------------------------------------------
+ SASL PLAIN authentication
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ License: BSD-2-Clause
+ ------------------------------------------------------------- */
+
+char* build_sasl_plain_string(char* identity, char* username, char* password);
diff --git a/source/utils/sasl.c b/source/utils/sasl.c
new file mode 100644
--- /dev/null
+++ b/source/utils/sasl.c
@@ -0,0 +1,62 @@
+/* -------------------------------------------------------------
+ SASL PLAIN authentication
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ Description: SASL plain authentication to solve T1739
+ License: BSD-2-Clause
+ ------------------------------------------------------------- */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "base64.h"
+
+/* -------------------------------------------------------------
+ SASL plain authentication
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+/**
+ * Build a SASL PLAIN string, encoded in Base64
+ * @identity: The identity you want to authenticate as
+ * @username: The username
+ * @password: The password, in plain
+ * Returns: Allocated buffer of encoded data or %NULL on failure
+ *
+ * If the specification isn't clear what to use as identity, generally
+ * you can pass again the username. If not, pass an empty string.
+ *
+ * Caller is responsible for freeing the returned buffer. Returned buffer is
+ * nul terminated to make it easier to use as a C string.
+ */
+char* build_sasl_plain_string(char* identity, char* username, char* password) {
+ // Authentication string: concatenate the fields, with 2 NUL separator
+ // A lot of string.h functions stop at NUL character, so memcpy is safer.
+ // For example, with sprintf, only identity is copied to sasl_plain_string.
+ int identity_len = strlen(identity);
+ int username_len = strlen(username);
+ int password_len = strlen(password);
+
+ int sasl_plain_string_len = identity_len + username_len + password_len + 2;
+ char* sasl_plain_string = (char*) malloc(sasl_plain_string_len + 1);
+
+ char* buffer = sasl_plain_string;
+
+ memcpy(buffer, identity, identity_len);
+ buffer += identity_len;
+ *buffer++ = '\0';
+
+ memcpy(buffer, username, username_len);
+ buffer += username_len;
+ *buffer++ = '\0';
+
+ memcpy(buffer, password, password_len);
+ buffer += password_len;
+ *buffer++ = '\0';
+
+ // Base64 encode
+ char* result = base64_encode(sasl_plain_string, sasl_plain_string_len, NULL);
+
+ free(sasl_plain_string);
+
+ return result;
+}
diff --git a/source/vars.h b/source/vars.h
--- a/source/vars.h
+++ b/source/vars.h
@@ -139,6 +139,9 @@
extern char REALNAME[STRING_SHORT];
extern char privmsg_log[STRING_SHORT];
+extern char SASL_USER[STRING_SHORT];
+extern char SASL_PASS[STRING_SHORT];
+
extern long CONNECT_WAIT_TIMEOUT;
extern bool PERFORM_TIMER;
extern char DEFAULT_UMODE[STRING_SHORT];
diff --git a/source/vars.c b/source/vars.c
--- a/source/vars.c
+++ b/source/vars.c
@@ -144,6 +144,10 @@
char REALNAME[STRING_SHORT] = "http://darkbot.sourceforge.net";
char privmsg_log[STRING_SHORT] = { 0 };
+// SASL nickserv authentication
+char SASL_USER[STRING_SHORT] = "";
+char SASL_PASS[STRING_SHORT] = "";
+
long CONNECT_WAIT_TIMEOUT = 10;
bool PERFORM_TIMER = true;
char DEFAULT_UMODE[STRING_SHORT] = "+i-ds";
@@ -332,6 +336,8 @@
// {ST_BOOLEAN, 3, sizeof(RANDQ), {"RANDOM_Q", NULL, NULL, NULL, NULL}, "enable RANDQ command", &RANDQ, NULL},
{ST_INTEGER, 3, sizeof(RAND_STUFF_TIME), {"RANDOM_TIME", NULL, NULL, NULL, NULL}, "seconds between random utterences", &RAND_STUFF_TIME, NULL},
#endif
+ {ST_STRING, 3, sizeof(SASL_USER), {"SASL_USER", NULL, NULL, NULL, NULL}, "bot's nickserv username for SASL auth", SASL_USER, NULL},
+ {ST_STRING, 3, sizeof(SASL_PASS), {"SASL_PASS", NULL, NULL, NULL, NULL}, "bot's nickserv password for SASL auth", SASL_PASS, NULL},
{ST_BOOLEAN, 3, sizeof(SeeN), {"SEEN_MODE", NULL, NULL, NULL, NULL}, "seen mode", &SeeN, NULL},
{ST_INTEGER, 3, sizeof(MAX_LASTSEEN), {"SEEN_TIME", NULL, NULL, NULL, NULL}, "maximum last seen seconds", &MAX_LASTSEEN, NULL},
{ST_STRING, 3, sizeof(SEEN_REPLY), {"SEEN_TEXT", NULL, NULL, NULL, NULL}, "maximum last seen reply", SEEN_REPLY, NULL},
@@ -395,9 +401,11 @@
}
if (ptr)
{
-#ifdef ENABLE_VERBOSE
- printf("Setting %s = %s\n", result->summary, ptr);
-#endif
+ if (DebuG)
+ {
+ printf("Setting %s = %s\n", result->summary, ptr);
+ }
+
switch (result->type)
{
case ST_BOOLEAN :
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Nov 6, 04:24 (21 h, 33 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2231149
Default Alt Text
D3096.diff (14 KB)
Attached To
Mode
D3096: Add SASL capability
Attached
Detach File
Event Timeline
Log In to Comment