Mercurial > hg > rlgallery-misc
diff dgl/rlgwebd-compat.patch @ 24:ce26225f7d9d
Switch to the Git version of dgamelaunch.
author | John "Elwin" Edwards |
---|---|
date | Sun, 20 Oct 2013 17:45:38 -0700 |
parents | |
children | c2127bc98694 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dgl/rlgwebd-compat.patch Sun Oct 20 17:45:38 2013 -0700 @@ -0,0 +1,116 @@ +diff --git a/dgamelaunch.c b/dgamelaunch.c +index fbf6ef5..b52b545 100644 +--- a/dgamelaunch.c ++++ b/dgamelaunch.c +@@ -1489,7 +1489,10 @@ int + changepw (int dowrite) + { + char buf[DGL_PASSWDLEN+1]; ++ char salt[21]; + int error = 2; ++ int i; ++ FILE *urandom; + + /* A precondition is that struct `me' exists because we can be not-yet-logged-in. */ + if (!me) { +@@ -1553,8 +1556,28 @@ changepw (int dowrite) + error = 1; + } + ++ salt[0] = salt[2] = salt[19] = '$'; ++ salt[1] = '6'; ++ salt[20] = '\0'; ++ urandom = fopen("/dev/urandom", "r"); ++ for (i = 3; i < 19; i++) { ++ /* This does waste four random bytes. */ ++ fread(salt + i, 1, 1, urandom); ++ salt[i] &= 0x3f; ++ if (salt[i] < 26) ++ salt[i] += 'a'; ++ else if (salt[i] < 52) ++ salt[i] = 'A' + salt[i] - 26; ++ else if (salt[i] < 62) ++ salt[i] = '0' + salt[i] - 52; ++ else if (salt[i] == 62) ++ salt[i] = '.'; ++ else ++ salt[i] = '/'; ++ } ++ fclose(urandom); + free(me->password); +- me->password = strdup (crypt (buf, buf)); ++ me->password = strdup (crypt (buf, salt)); + + if (dowrite) + writefile (0); +@@ -2053,6 +2076,8 @@ passwordgood (char *cpw) + { + assert (me != NULL); + ++ if (!strncmp (crypt (cpw, me->password), me->password, DGL_PASSWDLEN)) ++ return 1; + if (!strncmp (crypt (cpw, cpw), me->password, DGL_PASSWDLEN)) + return 1; + if (!strncmp (cpw, me->password, DGL_PASSWDLEN)) +diff --git a/dgamelaunch.h b/dgamelaunch.h +index b9ce41c..ca5e11b 100644 +--- a/dgamelaunch.h ++++ b/dgamelaunch.h +@@ -20,7 +20,7 @@ + #define dglsign(x) (x < 0 ? -1 : (x > 0 ? 1 : 0)) + + #define DGL_PLAYERNAMELEN 30 /* max. length of player name */ +-#define DGL_PASSWDLEN 20 /* max. length of passwords */ ++#define DGL_PASSWDLEN 108 /* max. length of passwords */ + #define DGL_MAILMSGLEN 80 /* max. length of mail message */ + + #define DGL_MAXWATCHCOLS 10 +diff --git a/dgl-common.c b/dgl-common.c +index e5c80bc..fbc4eea 100644 +--- a/dgl-common.c ++++ b/dgl-common.c +@@ -593,7 +593,7 @@ game_read_extra_info(struct dg_game *game, const char *extra_info_file) + struct dg_game ** + populate_games (int xgame, int *l, struct dg_user *me) + { +- int fd, len, n, pid; ++ int fd, len, n, pid, is_node; + DIR *pdir; + struct dirent *pdirent; + struct stat pstat; +@@ -631,13 +631,15 @@ populate_games (int xgame, int *l, struct dg_user *me) + + if (!inprog) continue; + ++ is_node = strchr(pdirent->d_name, ':') && !strncmp(strchr(pdirent->d_name, ':'), ":node:", 6); ++ + snprintf (fullname, 130, "%s%s", inprog, pdirent->d_name); + + fd = 0; + /* O_RDWR here should be O_RDONLY, but we need to test for + * an exclusive lock */ + fd = open (fullname, O_RDWR); +- if (fd >= 0 && (fcntl (fd, F_SETLK, &fl) == -1)) ++ if (fd >= 0 && (is_node || (fcntl (fd, F_SETLK, &fl) == -1))) + { + char *ttrecdir = NULL; + strncpy(playername, pdirent->d_name, DGL_PLAYERNAMELEN); +@@ -651,6 +653,9 @@ populate_games (int xgame, int *l, struct dg_user *me) + graceful_exit(145); + } + replacestr++; ++ if (is_node) { ++ replacestr += 5; ++ } + + ttrecdir = dgl_format_str(game, me, myconfig[game]->ttyrecdir, playername); + if (!ttrecdir) continue; +@@ -673,6 +678,8 @@ populate_games (int xgame, int *l, struct dg_user *me) + strlcpy (games[len]->name, pdirent->d_name, + strlen (pdirent->d_name) + 1); + ++ if (is_node) ++ replacestr += 5; + games[len]->date = malloc (11); + strlcpy (games[len]->date, replacestr + 1, 11); +