- prepare 1.4 release
- fix directory traversal using #../../ (not possible to overwrite arbitrary files, thus not marking as security fix) - general cleanup - documentation fixes (url, copyright, formatting)
This commit is contained in:
parent
ddb0f6db02
commit
36ec5bc425
8
CHANGES
8
CHANGES
@ -1,3 +1,11 @@
|
|||||||
|
1.4 (2008-08-09):
|
||||||
|
- fix directory traversal on servers that support SAJOIN
|
||||||
|
NOTE: not marking as security relevant as it is only possible to
|
||||||
|
create directories outside (which is of course annoying) of the irc
|
||||||
|
hierarchy but not overwriting arbitrary files with the channel name.
|
||||||
|
- documentation fixes
|
||||||
|
- general cleanup
|
||||||
|
|
||||||
1.3 (2007-07-14):
|
1.3 (2007-07-14):
|
||||||
- server messages about users (QUIT,JOIN) will no longer
|
- server messages about users (QUIT,JOIN) will no longer
|
||||||
go to the user directories but to the server out file to
|
go to the user directories but to the server out file to
|
||||||
|
2
LICENSE
2
LICENSE
@ -1,7 +1,7 @@
|
|||||||
MIT/X Consortium License
|
MIT/X Consortium License
|
||||||
|
|
||||||
(C)opyright MMV-MMVI Anselm R. Garbe <garbeam@wmii.de>
|
(C)opyright MMV-MMVI Anselm R. Garbe <garbeam@wmii.de>
|
||||||
(C)opyright MMV-MMVII Nico Golde <nico at ngolde dot de>
|
(C)opyright MMV-MMVIII Nico Golde <nico at ngolde dot de>
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
copy of this software and associated documentation files (the "Software"),
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
30
README
30
README
@ -1,17 +1,17 @@
|
|||||||
Abstract
|
Abstract
|
||||||
--------
|
--------
|
||||||
ii is a minimalistic FIFO and filesystem based IRC client.
|
ii is a minimalistic FIFO and filesystem based IRC client. It creates an irc
|
||||||
It creates an irc directory tree with server, channel and
|
directory tree with server, channel and nick name directories. In every
|
||||||
nick name directories.
|
directory a FIFO file (in) and and normal file (out) is placed.
|
||||||
In every directory a FIFO file (in) and and normal file (out)
|
|
||||||
is placed.
|
The in file is used to communicate with the servers and the out files include
|
||||||
The in file is used to communicate with the servers and the out
|
the server messages. For every channel and every nick name there will be new in
|
||||||
files include the server messages. For every channel and every nick
|
and out files.
|
||||||
name there will be new in and out files.
|
|
||||||
The basic idea of this is to be able to communicate with an IRC
|
The basic idea of this is to be able to communicate with an IRC server with
|
||||||
server with standard command line tools.
|
standard command line tools. For example if you want to join a channel just do
|
||||||
For example if you want to join a channel just do echo "/j #channel" > in
|
echo "/j #channel" > in and ii creates a new channel directory with in and out
|
||||||
and ii creates a new channel directory with in and out file.
|
file.
|
||||||
|
|
||||||
Installation
|
Installation
|
||||||
------------
|
------------
|
||||||
@ -32,10 +32,12 @@ program and for example with vim. Run vim in the server directory and use
|
|||||||
key mapping like:
|
key mapping like:
|
||||||
map w1 :.w >> \#ii/in<cr>
|
map w1 :.w >> \#ii/in<cr>
|
||||||
map w2 :.w >> \#wmii/in<cr>
|
map w2 :.w >> \#wmii/in<cr>
|
||||||
to post to channels.
|
to post to channels.
|
||||||
|
|
||||||
If you use the next editor line for a new posting you can use ctrl-p for nick
|
If you use the next editor line for a new posting you can use ctrl-p for nick
|
||||||
completion if you wrote the nick in the past.
|
completion if you wrote the nick in the past.
|
||||||
Thanks to Matthias Kopfermann for this hint.
|
Thanks to Matthias Kopfermann for this hint.
|
||||||
|
|
||||||
You can find an example of how this nested environment could look like on:
|
You can find an example of how this nested environment could look like on:
|
||||||
http://nion.modprobe.de/blog/archives/440-Using-the-ii-irc-client.html
|
http://nion.modprobe.de/blog/archives/440-Using-the-ii-irc-client.html
|
||||||
|
|
||||||
@ -46,7 +48,7 @@ No configuration is needed.
|
|||||||
Changelog
|
Changelog
|
||||||
---------
|
---------
|
||||||
Since I missed the chance to add a proper changelog right from the beginning,
|
Since I missed the chance to add a proper changelog right from the beginning,
|
||||||
please have a look at the commit messages on http://www.suckless.org/hg.rc/ii
|
please have a look at the commit messages on http://code.suckless.org/hg/ii/
|
||||||
they are fairly descriptive on releases prior to 1.2.
|
they are fairly descriptive on releases prior to 1.2.
|
||||||
|
|
||||||
Contact
|
Contact
|
||||||
|
@ -12,7 +12,7 @@ DESTDIR =
|
|||||||
|
|
||||||
INCDIR = ${PREFIX}/include
|
INCDIR = ${PREFIX}/include
|
||||||
LIBDIR = ${PREFIX}/lib
|
LIBDIR = ${PREFIX}/lib
|
||||||
VERSION = 1.3
|
VERSION = 1.4
|
||||||
|
|
||||||
# includes and libs
|
# includes and libs
|
||||||
INCLUDES = -I. -I${INCDIR} -I/usr/include
|
INCLUDES = -I. -I${INCDIR} -I/usr/include
|
||||||
|
4
ii.1
4
ii.1
@ -44,6 +44,8 @@ lets you override the default port (6667)
|
|||||||
.TP
|
.TP
|
||||||
.BI \-k " password"
|
.BI \-k " password"
|
||||||
lets you use a password to authenticate your nick on the server
|
lets you use a password to authenticate your nick on the server
|
||||||
|
(be aware of the problem that this is visible in the process list, if you
|
||||||
|
don't want this use a query to submit your password)
|
||||||
.TP
|
.TP
|
||||||
.BI \-i " prefix"
|
.BI \-i " prefix"
|
||||||
lets you override the default irc path (~/irc)
|
lets you override the default irc path (~/irc)
|
||||||
@ -87,7 +89,7 @@ Write wrappers, pagers or use your tools of choice to display the out file conte
|
|||||||
Write to ii (at) modprobe (dot) de for suggestions, fixes, 7|-|>< ;) etc.
|
Write to ii (at) modprobe (dot) de for suggestions, fixes, 7|-|>< ;) etc.
|
||||||
.SH AUTHORS
|
.SH AUTHORS
|
||||||
Copyright \(co 2005-2006 by Anselm R. Garbe <garbeam (at) gmail (dot) com> and
|
Copyright \(co 2005-2006 by Anselm R. Garbe <garbeam (at) gmail (dot) com> and
|
||||||
Copyright \(co 2005-2007 by Nico Golde <nico (at) ngolde (dot) de>
|
Copyright \(co 2005-2008 by Nico Golde <nico (at) ngolde (dot) de>
|
||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
.BR echo (1),
|
.BR echo (1),
|
||||||
.BR tail (1),
|
.BR tail (1),
|
||||||
|
27
ii.c
27
ii.c
@ -52,9 +52,12 @@ static void usage() {
|
|||||||
" [-n <nick>] [-k <password>] [-f <fullname>]\n");
|
" [-n <nick>] [-k <password>] [-f <fullname>]\n");
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
static char *lower(char *s) {
|
static char *striplower(char *s) {
|
||||||
char *p = NULL;
|
char *p = NULL;
|
||||||
for(p = s; p && *p; p++) *p = tolower(*p);
|
for(p = s; p && *p; p++) {
|
||||||
|
if(*p == '/') *p = '_';
|
||||||
|
*p = tolower(*p);
|
||||||
|
}
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,10 +82,10 @@ static void create_dirtree(const char *dir) {
|
|||||||
|
|
||||||
static int get_filepath(char *filepath, size_t len, char *channel, char *file) {
|
static int get_filepath(char *filepath, size_t len, char *channel, char *file) {
|
||||||
if(channel) {
|
if(channel) {
|
||||||
if(!snprintf(filepath, len, "%s/%s", path, lower(channel)))
|
if(!snprintf(filepath, len, "%s/%s", path, striplower(channel)))
|
||||||
return 0;
|
return 0;
|
||||||
create_dirtree(filepath);
|
create_dirtree(filepath);
|
||||||
return snprintf(filepath, len, "%s/%s/%s", path,lower(channel), file);
|
return snprintf(filepath, len, "%s/%s/%s", path, striplower(channel), file);
|
||||||
}
|
}
|
||||||
return snprintf(filepath, len, "%s/%s", path, file);
|
return snprintf(filepath, len, "%s/%s", path, file);
|
||||||
}
|
}
|
||||||
@ -200,10 +203,8 @@ static size_t tokenize(char **result, size_t reslen, char *str, char delim) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void print_out(char *channel, char *buf) {
|
static void print_out(char *channel, char *buf) {
|
||||||
static char outfile[256];
|
static char outfile[256], server[256], buft[18];
|
||||||
static char server[256];
|
FILE *out = NULL;
|
||||||
FILE *out;
|
|
||||||
static char buft[18];
|
|
||||||
time_t t = time(0);
|
time_t t = time(0);
|
||||||
|
|
||||||
if(channel) snprintf(server, sizeof(server), "-!- %s", channel);
|
if(channel) snprintf(server, sizeof(server), "-!- %s", channel);
|
||||||
@ -300,8 +301,7 @@ static void proc_server_cmd(char *buf) {
|
|||||||
|
|
||||||
for(i = 0; i < TOK_LAST; i++)
|
for(i = 0; i < TOK_LAST; i++)
|
||||||
argv[i] = NULL;
|
argv[i] = NULL;
|
||||||
/*
|
/* <message> ::= [':' <prefix> <SPACE> ] <command> <params> <crlf>
|
||||||
<message> ::= [':' <prefix> <SPACE> ] <command> <params> <crlf>
|
|
||||||
<prefix> ::= <servername> | <nick> [ '!' <user> ] [ '@' <host> ]
|
<prefix> ::= <servername> | <nick> [ '!' <user> ] [ '@' <host> ]
|
||||||
<command> ::= <letter> { <letter> } | <number> <number> <number>
|
<command> ::= <letter> { <letter> } | <number> <number> <number>
|
||||||
<SPACE> ::= ' ' { ' ' }
|
<SPACE> ::= ' ' { ' ' }
|
||||||
@ -309,8 +309,8 @@ static void proc_server_cmd(char *buf) {
|
|||||||
<middle> ::= <Any *non-empty* sequence of octets not including SPACE
|
<middle> ::= <Any *non-empty* sequence of octets not including SPACE
|
||||||
or NUL or CR or LF, the first of which may not be ':'>
|
or NUL or CR or LF, the first of which may not be ':'>
|
||||||
<trailing> ::= <Any, possibly *empty*, sequence of octets not including NUL or CR or LF>
|
<trailing> ::= <Any, possibly *empty*, sequence of octets not including NUL or CR or LF>
|
||||||
<crlf> ::= CR LF
|
<crlf> ::= CR LF */
|
||||||
*/
|
|
||||||
if(buf[0] == ':') { /* check prefix */
|
if(buf[0] == ':') { /* check prefix */
|
||||||
if (!(p = strchr(buf, ' '))) return;
|
if (!(p = strchr(buf, ' '))) return;
|
||||||
*p = 0;
|
*p = 0;
|
||||||
@ -462,9 +462,8 @@ int main(int argc, char *argv[]) {
|
|||||||
int i;
|
int i;
|
||||||
unsigned short port = SERVER_PORT;
|
unsigned short port = SERVER_PORT;
|
||||||
struct passwd *spw = getpwuid(getuid());
|
struct passwd *spw = getpwuid(getuid());
|
||||||
char *key = NULL;
|
char *key = NULL, *fullname = NULL;
|
||||||
char prefix[_POSIX_PATH_MAX];
|
char prefix[_POSIX_PATH_MAX];
|
||||||
char *fullname = NULL;
|
|
||||||
|
|
||||||
if(!spw) {
|
if(!spw) {
|
||||||
fprintf(stderr,"ii: getpwuid() failed\n");
|
fprintf(stderr,"ii: getpwuid() failed\n");
|
||||||
|
Loading…
Reference in New Issue
Block a user