Skip to content

Commit 8edff25

Browse files
authored
Merge pull request #42 from mcpcpc/saslexternal
Support SASL EXTERNAL
2 parents 2718692 + b43ce38 commit 8edff25

File tree

1 file changed

+31
-31
lines changed

1 file changed

+31
-31
lines changed

kirc.c

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,11 @@
1515

1616
#define MSG_MAX 512 /* guaranteed max message length */
1717
#define CHA_MAX 200 /* guaranteed max channel length */
18-
#define VERSION "0.1.1" /* software version */
19-
#define USAGE "kirc [-s hostname] [-p port] [-c channel] [-n nick] \
20-
[-r real_name] [-u username] [-k password] [-a token] [-x init_command] \
21-
[-w columns] [-W columns] [-o path] [-h|v|V]"
2218

2319
static int conn; /* connection socket */
2420
static char chan_default[MSG_MAX]; /* default channel for PRIVMSG */
2521
static int verb = 0; /* verbose output (e.g. raw stream) */
22+
static int sasl = 0; /* SASL method (PLAIN=0, EXTERNAL=1) */
2623
static size_t cmax = 80; /* max number of chars per line */
2724
static size_t gutl = 20; /* max char width of left column */
2825
static char * host = "irc.freenode.org"; /* irc host address */
@@ -148,11 +145,6 @@ raw_parser(char *string) {
148145
return;
149146
}
150147

151-
if (!strncmp(string, "AUTHENTICATE +", 14)) {
152-
raw("AUTHENTICATE %s\r\n", auth);
153-
return;
154-
}
155-
156148
if (string[0] != ':') return;
157149

158150
if (olog) log_append(string, olog);
@@ -168,8 +160,6 @@ raw_parser(char *string) {
168160
strcpy(chan_default, tok);
169161
raw("JOIN #%s\r\n", tok);
170162
} return;
171-
} else if (!strncmp(command, "90", 2)) {
172-
raw("CAP END\r\n");
173163
} else if (!strncmp(command, "QUIT", 4) || !strncmp(command, "PART", 4)) {
174164
printf("%*s<-- \x1b[34;1m%s\x1b[0m\n", g - 3, "", nickname);
175165
return;
@@ -275,45 +265,55 @@ keyboard_hit() {
275265
return byteswaiting;
276266
}
277267

268+
static void
269+
usage(void) {
270+
fputs("kirc [-s hostname] [-p port] [-c channel] [-n nick] \
271+
[-r real_name] [-u username] [-k password] [-a token] [-x init_command] \
272+
[-w columns] [-W columns] [-o path] [-e|v|V]\n", stderr);
273+
exit(EXIT_FAILURE);
274+
}
275+
278276
int
279277
main(int argc, char **argv) {
280278

281279
int cval;
282280

283-
while ((cval = getopt(argc, argv, "s:p:o:n:k:c:u:r:x:w:W:a:hvV")) != -1) {
281+
while ((cval = getopt(argc, argv, "s:p:o:n:k:c:u:r:x:w:W:a:hevV")) != -1) {
284282
switch (cval) {
285-
case 'V' : verb = 1; break;
286-
case 's' : host = optarg; break;
287-
case 'p' : port = optarg; break;
288-
case 'r' : real = optarg; break;
289-
case 'u' : user = optarg; break;
290-
case 'a' : auth = optarg; break;
291-
case 'o' : olog = optarg; break;
292-
case 'n' : nick = optarg; break;
293-
case 'k' : pass = optarg; break;
294-
case 'c' : chan = optarg; break;
295-
case 'x' : inic = optarg; break;
296-
case 'w' : gutl = atoi(optarg); break;
297-
case 'W' : cmax = atoi(optarg); break;
298-
case 'v' : printf("kirc %s\n", VERSION); return EXIT_SUCCESS;
299-
case 'h' : printf("usage: %s\n", USAGE); return EXIT_SUCCESS;
300-
case '?' : return EXIT_FAILURE;
283+
case 'V' : ++verb; break;
284+
case 'e' : ++sasl; break;
285+
case 's' : host = optarg; break;
286+
case 'p' : port = optarg; break;
287+
case 'r' : real = optarg; break;
288+
case 'u' : user = optarg; break;
289+
case 'a' : auth = optarg; break;
290+
case 'o' : olog = optarg; break;
291+
case 'n' : nick = optarg; break;
292+
case 'k' : pass = optarg; break;
293+
case 'c' : chan = optarg; break;
294+
case 'x' : inic = optarg; break;
295+
case 'w' : gutl = atoi(optarg); break;
296+
case 'W' : cmax = atoi(optarg); break;
297+
case 'v' : puts("kirc 0.1.2\n"); break;
298+
case '?' : usage(); break;
301299
}
302300
}
303301

304302
if (!nick) {
305303
fputs("Nick not specified\n", stderr);
306-
return EXIT_FAILURE;
304+
usage();
307305
}
308306

309307
if (connection_initialize() != 0) {
310308
return EXIT_FAILURE;
311309
}
312310

313-
if (auth) raw("CAP REQ :sasl\r\n");
311+
if (auth || sasl) raw("CAP REQ :sasl\r\n");
314312
raw("NICK %s\r\n", nick);
315313
raw("USER %s - - :%s\r\n", (user ? user : nick), (real ? real : nick));
316-
if (auth) raw("AUTHENTICATE PLAIN\r\n");
314+
if (auth || sasl) raw("AUTHENTICATE %s\r\n", (sasl ? "EXTERNAL" : "PLAIN"));
315+
if (auth || sasl) raw("AUTHENTICATE %s\r\n", (sasl ? "+" : auth));
316+
if (auth || sasl) raw("CAP END\r\n");
317317
if (pass) raw("PASS %s\r\n", pass);
318318
if (inic) raw("%s\r\n", inic);
319319

0 commit comments

Comments
 (0)