psyced/world/net/library/legal.c

99 lines
2.4 KiB
C

// $Id: legal.c,v 1.18 2008/07/26 10:54:31 lynx Exp $ // vim:syntax=lpc
#include <net.h>
// legal nickname/placename test..
varargs string legal_name(string name, int isPlace) {
int i;
string n = name;
//PT(("legal_name(%O) in %O\n", n, ME))
if (shutdown_in_progress) {
P1(("not legal_name for %O: shutdown in progress\n", n))
return 0;
}
if (!n || n == "") {
P1(("not legal_name: %O is empty\n", n))
return 0; // "somebody";
}
#ifdef MAX_NAME_LEN
if (strlen(n) > MAX_NAME_LEN) {
P1(("not legal_name: %O exceeds MAX_NAME_LEN\n", n))
return 0;
}
#endif
// this saves applet/user from malfunction!
if (index("!=-0123456789", n[0]) != -1) {
P1(("not legal_name: %O has !=- as first char.\n", n))
return 0;
}
#ifdef _flag_enable_module_microblogging
string nick;
if (isPlace && sscanf(name, "~%s#updates", nick))
n = nick;
#endif
string chars = "\
abcdefghijklmnopqrstuvwxyz\
ABCDEFGHIJKLMNOPQRSTUVWXYZ\
0123456789_-=+";
for (i=strlen(n)-1; i>=0; i--) {
if (index(chars, n[i]) == -1) {
P1(("not legal_name: %O has ill char at %d (%O).\n",
n, i, n[i]))
return 0;
}
}
return name; // we used to return n here instead..
}
array(string) legal_password(string pw, string nick) {
int i;
if (shutdown_in_progress)
return ({ "_failure_server_shutdown",
"Sorry, server is being shut down.\n" });
if (!stringp(pw) || strlen(pw) < 3)
return ({ "_error_illegal_password_size",
"That password is too short.\n" });
if (index(pw, '<') != -1 || index(pw, '>') != -1 ||
index(pw, ' ') != -1)
return ({ "_error_illegal_password_characters",
"Password contains illegal characters.\n" });
if (nick && strstr(lower_case(pw), lower_case(nick), 0) != -1)
return ({ "_error_illegal_password_username",
"That password contains your nickname.\n" });
return 0;
}
/* check for legal PSYC keyword (var or mc names), see specs */
#ifndef legal_keyword // inline variant is better of course
int legal_keyword(string n) {
# if __EFUN_DEFINED__(regreplace)
# include <regexp.h>
string t = regmatch(n, "[^_0-9A-Za-z]");
P1(("legal_keyword(%O) says %O\n", n, t))
return !t;
# else
int i;
for (i=strlen(n)-1; i>=0; i--) {
if (index("_\
abcdefghijklmnopqrstuvwxyz\
ABCDEFGHIJKLMNOPQRSTUVWXYZ\
0123456789", n[i]) == -1) {
P1(("not legal_keyword: %O has ill char at %d (%O).\n",
n, i, n[i]))
return 0;
}
}
return 1;
# endif
}
#endif