Make mailareas network ready.
This commit is contained in:
parent
f9575b92a0
commit
881289efd9
81
bbs.c
81
bbs.c
@ -20,6 +20,63 @@ int gSocket;
|
|||||||
|
|
||||||
int usertimeout;
|
int usertimeout;
|
||||||
|
|
||||||
|
struct fido_addr *parse_fido_addr(const char *str) {
|
||||||
|
struct fido_addr *ret = (struct fido_addr *)malloc(sizeof(struct fido_addr));
|
||||||
|
int c;
|
||||||
|
int state = 0;
|
||||||
|
|
||||||
|
ret->zone = 0;
|
||||||
|
ret->net = 0;
|
||||||
|
ret->node = 0;
|
||||||
|
ret->point = 0;
|
||||||
|
|
||||||
|
for (c=0;c<strlen(str);c++) {
|
||||||
|
switch(str[c]) {
|
||||||
|
case ':':
|
||||||
|
state = 1;
|
||||||
|
break;
|
||||||
|
case '/':
|
||||||
|
state = 2;
|
||||||
|
break;
|
||||||
|
case '.':
|
||||||
|
state = 3;
|
||||||
|
break;
|
||||||
|
case '0':
|
||||||
|
case '1':
|
||||||
|
case '2':
|
||||||
|
case '3':
|
||||||
|
case '4':
|
||||||
|
case '5':
|
||||||
|
case '6':
|
||||||
|
case '7':
|
||||||
|
case '8':
|
||||||
|
case '9':
|
||||||
|
{
|
||||||
|
switch (state) {
|
||||||
|
case 0:
|
||||||
|
ret->zone *= 10 + (str[c] - '0');
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
ret->net *= 10 + (str[c] - '0');
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
ret->node *= 10 + (str[c] - '0');
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
ret->point *= 10 + (str[c] - '0');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
free(ret);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void timer_handler(int signum) {
|
void timer_handler(int signum) {
|
||||||
if (signum == SIGALRM) {
|
if (signum == SIGALRM) {
|
||||||
if (gUser != NULL) {
|
if (gUser != NULL) {
|
||||||
@ -157,6 +214,14 @@ static int mail_area_handler(void* user, const char* section, const char* name,
|
|||||||
mc->realnames = 0;
|
mc->realnames = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if (strcasecmp(section, "network") == 0) {
|
||||||
|
if (strcasecmp(name, "type") == 0) {
|
||||||
|
if (strcasecmp(value, "fido") == 0) {
|
||||||
|
mc->nettype = NETWORK_FIDO;
|
||||||
|
}
|
||||||
|
} else if (strcasecmp(name, "fido node") == 0) {
|
||||||
|
mc->fidoaddr = parse_fido_addr(value);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// check if it's partially filled in
|
// check if it's partially filled in
|
||||||
for (i=0;i<mc->mail_area_count;i++) {
|
for (i=0;i<mc->mail_area_count;i++) {
|
||||||
@ -167,6 +232,14 @@ static int mail_area_handler(void* user, const char* section, const char* name,
|
|||||||
mc->mail_areas[i]->write_sec_level = atoi(value);
|
mc->mail_areas[i]->write_sec_level = atoi(value);
|
||||||
} else if (strcasecmp(name, "path") == 0) {
|
} else if (strcasecmp(name, "path") == 0) {
|
||||||
mc->mail_areas[i]->path = strdup(value);
|
mc->mail_areas[i]->path = strdup(value);
|
||||||
|
} else if (strcasecmp(name, "type") == 0) {
|
||||||
|
if (strcasecmp(value, "local") == 0) {
|
||||||
|
mc->mail_areas[i]->type = TYPE_LOCAL_AREA;
|
||||||
|
} else if (strcasecmp(value, "echo") == 0) {
|
||||||
|
mc->mail_areas[i]->type = TYPE_ECHOMAIL_AREA;
|
||||||
|
} else if (strcasecmp(value, "netmail") == 0) {
|
||||||
|
mc->mail_areas[i]->type = TYPE_NETMAIL_AREA;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -186,6 +259,14 @@ static int mail_area_handler(void* user, const char* section, const char* name,
|
|||||||
mc->mail_areas[mc->mail_area_count]->write_sec_level = atoi(value);
|
mc->mail_areas[mc->mail_area_count]->write_sec_level = atoi(value);
|
||||||
} else if (strcasecmp(name, "path") == 0) {
|
} else if (strcasecmp(name, "path") == 0) {
|
||||||
mc->mail_areas[mc->mail_area_count]->path = strdup(value);
|
mc->mail_areas[mc->mail_area_count]->path = strdup(value);
|
||||||
|
} else if (strcasecmp(name, "type") == 0) {
|
||||||
|
if (strcasecmp(value, "local") == 0) {
|
||||||
|
mc->mail_areas[mc->mail_area_count]->type = TYPE_LOCAL_AREA;
|
||||||
|
} else if (strcasecmp(value, "echo") == 0) {
|
||||||
|
mc->mail_areas[mc->mail_area_count]->type = TYPE_ECHOMAIL_AREA;
|
||||||
|
} else if (strcasecmp(value, "netmail") == 0) {
|
||||||
|
mc->mail_areas[mc->mail_area_count]->type = TYPE_NETMAIL_AREA;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
mc->mail_area_count++;
|
mc->mail_area_count++;
|
||||||
}
|
}
|
||||||
|
18
bbs.h
18
bbs.h
@ -7,6 +7,19 @@
|
|||||||
#define VERSION_MINOR 1
|
#define VERSION_MINOR 1
|
||||||
#define VERSION_STR "dev"
|
#define VERSION_STR "dev"
|
||||||
|
|
||||||
|
#define NETWORK_FIDO 0
|
||||||
|
|
||||||
|
#define TYPE_LOCAL_AREA 0
|
||||||
|
#define TYPE_NETMAIL_AREA 1
|
||||||
|
#define TYPE_ECHOMAIL_AREA 2
|
||||||
|
|
||||||
|
struct fido_addr {
|
||||||
|
unsigned short zone;
|
||||||
|
unsigned short net;
|
||||||
|
unsigned short node;
|
||||||
|
unsigned short point;
|
||||||
|
};
|
||||||
|
|
||||||
struct last10_callers {
|
struct last10_callers {
|
||||||
char name[17];
|
char name[17];
|
||||||
char location[33];
|
char location[33];
|
||||||
@ -25,16 +38,19 @@ struct mail_area {
|
|||||||
char *path;
|
char *path;
|
||||||
int read_sec_level;
|
int read_sec_level;
|
||||||
int write_sec_level;
|
int write_sec_level;
|
||||||
|
int type;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mail_conference {
|
struct mail_conference {
|
||||||
char *name;
|
char *name;
|
||||||
char *path;
|
char *path;
|
||||||
int networked;
|
int networked;
|
||||||
|
int nettype;
|
||||||
int realnames;
|
int realnames;
|
||||||
int sec_level;
|
int sec_level;
|
||||||
int mail_area_count;
|
int mail_area_count;
|
||||||
struct mail_area **mail_areas;
|
struct mail_area **mail_areas;
|
||||||
|
struct fido_addr *fidoaddr;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct file_sub {
|
struct file_sub {
|
||||||
@ -95,7 +111,7 @@ struct user_record {
|
|||||||
|
|
||||||
|
|
||||||
extern void runbbs(int sock, char *config);
|
extern void runbbs(int sock, char *config);
|
||||||
|
extern struct fido_addr *parse_fido_addr(const char *str);
|
||||||
extern void s_putchar(int socket, char c);
|
extern void s_putchar(int socket, char c);
|
||||||
extern void s_putstring(int socket, char *c);
|
extern void s_putstring(int socket, char *c);
|
||||||
extern void s_displayansi(int socket, char *file);
|
extern void s_displayansi(int socket, char *file);
|
||||||
|
@ -11,6 +11,7 @@ Email Path = /home/andrew/MagickaBBS/msgs/email
|
|||||||
|
|
||||||
[mail conferences]
|
[mail conferences]
|
||||||
Local Mail = config/localmail.ini
|
Local Mail = config/localmail.ini
|
||||||
|
IllusionNet = config/illusionnet.ini
|
||||||
|
|
||||||
[file directories]
|
[file directories]
|
||||||
General Files = config/filesgen.ini
|
General Files = config/filesgen.ini
|
||||||
|
15
config_default/illusionnet.ini
Normal file
15
config_default/illusionnet.ini
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
[main]
|
||||||
|
Visible Sec Level = 10
|
||||||
|
Networked = true
|
||||||
|
Real Names = false
|
||||||
|
|
||||||
|
[network]
|
||||||
|
type = fido
|
||||||
|
fido node = 867:61/2
|
||||||
|
|
||||||
|
[General]
|
||||||
|
Read Sec Level = 10
|
||||||
|
Write Sec Level = 10
|
||||||
|
Path = /home/andrew/MagickaBBS/msgs/il_general
|
||||||
|
; local / echo or netmail
|
||||||
|
Type = Echo
|
@ -7,8 +7,10 @@ Real Names = false
|
|||||||
Read Sec Level = 10
|
Read Sec Level = 10
|
||||||
Write Sec Level = 10
|
Write Sec Level = 10
|
||||||
Path = /home/andrew/MagickaBBS/msgs/general
|
Path = /home/andrew/MagickaBBS/msgs/general
|
||||||
|
Type = Local
|
||||||
|
|
||||||
[Testing]
|
[Testing]
|
||||||
Read Sec Level = 10
|
Read Sec Level = 10
|
||||||
Write Sec Level = 10
|
Write Sec Level = 10
|
||||||
Path = /home/andrew/MagickaBBS/msgs/testing
|
Path = /home/andrew/MagickaBBS/msgs/testing
|
||||||
|
Type = Local
|
||||||
|
117
mail_menu.c
117
mail_menu.c
@ -273,7 +273,7 @@ void read_message(int socket, struct user_record *user, int mailno) {
|
|||||||
int lines = 0;
|
int lines = 0;
|
||||||
char c;
|
char c;
|
||||||
char *replybody;
|
char *replybody;
|
||||||
|
struct fido_addr *from_addr = NULL;
|
||||||
jb = open_jam_base(conf.mail_conferences[user->cur_mail_conf]->mail_areas[user->cur_mail_area]->path);
|
jb = open_jam_base(conf.mail_conferences[user->cur_mail_conf]->mail_areas[user->cur_mail_area]->path);
|
||||||
if (!jb) {
|
if (!jb) {
|
||||||
printf("Error opening JAM base.. %s\n", conf.mail_conferences[user->cur_mail_conf]->mail_areas[user->cur_mail_area]->path);
|
printf("Error opening JAM base.. %s\n", conf.mail_conferences[user->cur_mail_conf]->mail_areas[user->cur_mail_area]->path);
|
||||||
@ -301,6 +301,11 @@ void read_message(int socket, struct user_record *user, int mailno) {
|
|||||||
memset(to, 0, jsp->Fields[z]->DatLen + 1);
|
memset(to, 0, jsp->Fields[z]->DatLen + 1);
|
||||||
memcpy(to, jsp->Fields[z]->Buffer, jsp->Fields[z]->DatLen);
|
memcpy(to, jsp->Fields[z]->Buffer, jsp->Fields[z]->DatLen);
|
||||||
}
|
}
|
||||||
|
if (jsp->Fields[z]->LoID == JAMSFLD_OADDRESS) {
|
||||||
|
memset(buffer, 0, jsp->Fields[z]->DatLen + 1);
|
||||||
|
memcpy(buffer, jsp->Fields[z]->Buffer, jsp->Fields[z]->DatLen);
|
||||||
|
from_addr = parse_fido_addr(buffer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -378,6 +383,9 @@ void read_message(int socket, struct user_record *user, int mailno) {
|
|||||||
free(subject);
|
free(subject);
|
||||||
free(to);
|
free(to);
|
||||||
free(from);
|
free(from);
|
||||||
|
if (from_addr != NULL) {
|
||||||
|
free(from_addr);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -404,6 +412,48 @@ void read_message(int socket, struct user_record *user, int mailno) {
|
|||||||
jsf.Buffer = (uchar *)subject;
|
jsf.Buffer = (uchar *)subject;
|
||||||
JAM_PutSubfield(jsp, &jsf);
|
JAM_PutSubfield(jsp, &jsf);
|
||||||
|
|
||||||
|
if (conf.mail_conferences[user->cur_mail_conf]->mail_areas[user->cur_mail_area]->type == TYPE_ECHOMAIL_AREA) {
|
||||||
|
jmh.Attribute |= MSG_TYPEECHO;
|
||||||
|
|
||||||
|
if (conf.mail_conferences[user->cur_mail_conf]->nettype == NETWORK_FIDO) {
|
||||||
|
sprintf(buffer, "%d:%d/%d.%d", conf.mail_conferences[user->cur_mail_conf]->fidoaddr->zone,
|
||||||
|
conf.mail_conferences[user->cur_mail_conf]->fidoaddr->net,
|
||||||
|
conf.mail_conferences[user->cur_mail_conf]->fidoaddr->node,
|
||||||
|
conf.mail_conferences[user->cur_mail_conf]->fidoaddr->point);
|
||||||
|
jsf.LoID = JAMSFLD_OADDRESS;
|
||||||
|
jsf.HiID = 0;
|
||||||
|
jsf.DatLen = strlen(buffer);
|
||||||
|
jsf.Buffer = (uchar *)buffer;
|
||||||
|
JAM_PutSubfield(jsp, &jsf);
|
||||||
|
}
|
||||||
|
} else if (conf.mail_conferences[user->cur_mail_conf]->mail_areas[user->cur_mail_area]->type == TYPE_NETMAIL_AREA) {
|
||||||
|
jmh.Attribute |= MSG_TYPENET;
|
||||||
|
jmh.Attribute |= MSG_KILLSENT;
|
||||||
|
if (conf.mail_conferences[user->cur_mail_conf]->nettype == NETWORK_FIDO) {
|
||||||
|
sprintf(buffer, "%d:%d/%d.%d", conf.mail_conferences[user->cur_mail_conf]->fidoaddr->zone,
|
||||||
|
conf.mail_conferences[user->cur_mail_conf]->fidoaddr->net,
|
||||||
|
conf.mail_conferences[user->cur_mail_conf]->fidoaddr->node,
|
||||||
|
conf.mail_conferences[user->cur_mail_conf]->fidoaddr->point);
|
||||||
|
jsf.LoID = JAMSFLD_OADDRESS;
|
||||||
|
jsf.HiID = 0;
|
||||||
|
jsf.DatLen = strlen(buffer);
|
||||||
|
jsf.Buffer = (uchar *)buffer;
|
||||||
|
JAM_PutSubfield(jsp, &jsf);
|
||||||
|
|
||||||
|
if (from_addr != NULL) {
|
||||||
|
|
||||||
|
sprintf(buffer, "%d:%d/%d.%d", from_addr->zone,
|
||||||
|
from_addr->net,
|
||||||
|
from_addr->node,
|
||||||
|
from_addr->point);
|
||||||
|
jsf.LoID = JAMSFLD_DADDRESS;
|
||||||
|
jsf.HiID = 0;
|
||||||
|
jsf.DatLen = strlen(buffer);
|
||||||
|
jsf.Buffer = (uchar *)buffer;
|
||||||
|
JAM_PutSubfield(jsp, &jsf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
z = JAM_LockMB(jb, 100);
|
z = JAM_LockMB(jb, 100);
|
||||||
@ -418,6 +468,9 @@ void read_message(int socket, struct user_record *user, int mailno) {
|
|||||||
free(to);
|
free(to);
|
||||||
free(from);
|
free(from);
|
||||||
printf("Failed to lock msg base!\n");
|
printf("Failed to lock msg base!\n");
|
||||||
|
if (from_addr != NULL) {
|
||||||
|
free(from_addr);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -447,7 +500,9 @@ void read_message(int socket, struct user_record *user, int mailno) {
|
|||||||
if (subject != NULL) {
|
if (subject != NULL) {
|
||||||
free(subject);
|
free(subject);
|
||||||
}
|
}
|
||||||
|
if (from_addr != NULL) {
|
||||||
|
free(from_addr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int mail_menu(int socket, struct user_record *user) {
|
int mail_menu(int socket, struct user_record *user) {
|
||||||
@ -480,6 +535,7 @@ int mail_menu(int socket, struct user_record *user) {
|
|||||||
ulong jam_crc;
|
ulong jam_crc;
|
||||||
unsigned int lastmsg,currmsg;
|
unsigned int lastmsg,currmsg;
|
||||||
int lines;
|
int lines;
|
||||||
|
struct fido_addr *from_addr;
|
||||||
|
|
||||||
while (!domail) {
|
while (!domail) {
|
||||||
s_displayansi(socket, "mailmenu");
|
s_displayansi(socket, "mailmenu");
|
||||||
@ -510,7 +566,17 @@ int mail_menu(int socket, struct user_record *user) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (conf.mail_conferences[user->cur_mail_conf]->mail_areas[user->cur_mail_area]->type == TYPE_NETMAIL_AREA) {
|
||||||
|
s_putstring(socket, "\r\nADDR: ");
|
||||||
|
s_readstring(socket, buffer, 32);
|
||||||
|
from_addr = parse_fido_addr(buffer);
|
||||||
|
if (!from_addr) {
|
||||||
|
s_putstring(socket, "\r\n\r\nInvalid Address\r\n");
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
sprintf(buffer, "\r\nMailing to %d:%d/%d.%d\r\n", from_addr->zone, from_addr->net, from_addr->node, from_addr->point);
|
||||||
|
}
|
||||||
|
}
|
||||||
to = strdup(buffer);
|
to = strdup(buffer);
|
||||||
s_putstring(socket, "\r\nSUBJECT: ");
|
s_putstring(socket, "\r\nSUBJECT: ");
|
||||||
s_readstring(socket, buffer, 25);
|
s_readstring(socket, buffer, 25);
|
||||||
@ -557,6 +623,48 @@ int mail_menu(int socket, struct user_record *user) {
|
|||||||
jsf.Buffer = (uchar *)subject;
|
jsf.Buffer = (uchar *)subject;
|
||||||
JAM_PutSubfield(jsp, &jsf);
|
JAM_PutSubfield(jsp, &jsf);
|
||||||
|
|
||||||
|
if (conf.mail_conferences[user->cur_mail_conf]->mail_areas[user->cur_mail_area]->type == TYPE_ECHOMAIL_AREA) {
|
||||||
|
jmh.Attribute |= MSG_TYPEECHO;
|
||||||
|
|
||||||
|
if (conf.mail_conferences[user->cur_mail_conf]->nettype == NETWORK_FIDO) {
|
||||||
|
sprintf(buffer, "%d:%d/%d.%d", conf.mail_conferences[user->cur_mail_conf]->fidoaddr->zone,
|
||||||
|
conf.mail_conferences[user->cur_mail_conf]->fidoaddr->net,
|
||||||
|
conf.mail_conferences[user->cur_mail_conf]->fidoaddr->node,
|
||||||
|
conf.mail_conferences[user->cur_mail_conf]->fidoaddr->point);
|
||||||
|
jsf.LoID = JAMSFLD_OADDRESS;
|
||||||
|
jsf.HiID = 0;
|
||||||
|
jsf.DatLen = strlen(buffer);
|
||||||
|
jsf.Buffer = (uchar *)buffer;
|
||||||
|
JAM_PutSubfield(jsp, &jsf);
|
||||||
|
}
|
||||||
|
} else if (conf.mail_conferences[user->cur_mail_conf]->mail_areas[user->cur_mail_area]->type == TYPE_NETMAIL_AREA) {
|
||||||
|
jmh.Attribute |= MSG_TYPENET;
|
||||||
|
jmh.Attribute |= MSG_KILLSENT;
|
||||||
|
if (conf.mail_conferences[user->cur_mail_conf]->nettype == NETWORK_FIDO) {
|
||||||
|
sprintf(buffer, "%d:%d/%d.%d", conf.mail_conferences[user->cur_mail_conf]->fidoaddr->zone,
|
||||||
|
conf.mail_conferences[user->cur_mail_conf]->fidoaddr->net,
|
||||||
|
conf.mail_conferences[user->cur_mail_conf]->fidoaddr->node,
|
||||||
|
conf.mail_conferences[user->cur_mail_conf]->fidoaddr->point);
|
||||||
|
jsf.LoID = JAMSFLD_OADDRESS;
|
||||||
|
jsf.HiID = 0;
|
||||||
|
jsf.DatLen = strlen(buffer);
|
||||||
|
jsf.Buffer = (uchar *)buffer;
|
||||||
|
JAM_PutSubfield(jsp, &jsf);
|
||||||
|
|
||||||
|
if (from_addr != NULL) {
|
||||||
|
|
||||||
|
sprintf(buffer, "%d:%d/%d.%d", from_addr->zone,
|
||||||
|
from_addr->net,
|
||||||
|
from_addr->node,
|
||||||
|
from_addr->point);
|
||||||
|
jsf.LoID = JAMSFLD_DADDRESS;
|
||||||
|
jsf.HiID = 0;
|
||||||
|
jsf.DatLen = strlen(buffer);
|
||||||
|
jsf.Buffer = (uchar *)buffer;
|
||||||
|
JAM_PutSubfield(jsp, &jsf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
z = JAM_LockMB(jb, 100);
|
z = JAM_LockMB(jb, 100);
|
||||||
@ -834,6 +942,9 @@ int mail_menu(int socket, struct user_record *user) {
|
|||||||
JAM_PutSubfield(jsp, &jsf);
|
JAM_PutSubfield(jsp, &jsf);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
z = JAM_LockMB(jb, 100);
|
z = JAM_LockMB(jb, 100);
|
||||||
if (z == 0) {
|
if (z == 0) {
|
||||||
|
16
users.c
16
users.c
@ -234,6 +234,22 @@ struct user_record *check_user_pass(int socket, char *loginname, char *password)
|
|||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (user->cur_mail_conf > conf.mail_conference_count) {
|
||||||
|
user->cur_mail_conf = 0;
|
||||||
|
}
|
||||||
|
if (user->cur_file_dir > conf.file_directory_count) {
|
||||||
|
user->cur_file_dir = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (user->cur_mail_area > conf.mail_conferences[user->cur_mail_conf]->mail_area_count) {
|
||||||
|
user->cur_mail_area = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (user->cur_file_sub > conf.file_directories[user->cur_file_sub]->file_sub_count) {
|
||||||
|
user->cur_file_sub = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return user;
|
return user;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user