/** * This handles user registration. * * The form must have the following fields: * + UID The user's user id to login * + EMAIL The users's email address - to receive tokens * + FULLNAME The user's full name * + PASS The users's preferred password * + CITY The user's city * + COUNTRY The user's country - 3 letter ISO code * + PCODE THe user's postal code */ var CONTROL_REGISTER = '1'; var EMAIL_REGEX = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; var cValChars='ACDEFHJKLMNPQRTUVWXY23456789!@$%&'; log(LOG_DEBUG,'+ Control REGISTER loaded'); function register() { var code = ''; var complete = false; // Called before processing for a field Object.defineProperty(this, 'getName', { get: function () { return 'Control-Registration'; } }); Object.defineProperty(this, 'isComplete', { get: function () { return complete; } }); this.handle=function(read) { // Dont allow existing users to re-register if (user.number) { fo.sendBaseline('ALREADY_MEMBER',false); return read === '*' ? read : ''; } log(LOG_DEBUG,'Control REGISTER handle() start. ('+read+')'); log(LOG_DEBUG,'- Field '+cf.fname+'('+JSON.stringify(cf)+')'); if ((cf.fname === 'TOKEN') && (read === '#' || read === "\r")) { if (cf.fvalue === code) { complete = true; } else { fo.sendBaseline('INVALID_CODE',false); fo.cursorOn(cf.c+cf.fvalue.length,cf.r); fo.attr(cf.attribute); read = ''; } } log(LOG_DEBUG,'- Field Value ['+cf.fvalue+'] ('+code+')'); return read; } // Make sure we got an email this.prefield=function() { log(LOG_DEBUG,'- prefield: Field '+cf.fname+'('+JSON.stringify(cf)+')'); if (cf.fname === 'TOKEN') { if (! code.length) { log(LOG_DEBUG,' - BASELINE '+cf.fname+'('+JSON.stringify(cf)+')'); fo.sendBaseline('TOKEN_EMAIL',false); var email = fo.fieldValue('EMAIL'); var uid = fo.fieldValue('UID'); var name = fo.fieldValue('FULLNAME'); log(LOG_DEBUG,' - VALIDATE EMAIL TO ('+JSON.stringify(system.matchuserdata(U_NETMAIL,email))+')'); // Validate Email hasnt been used // Validate USER_ID hasnt been used if ((email.indexOf('@') === -1) || ! EMAIL_REGEX.test(email) || (system.matchuserdata(U_NETMAIL,email) !== 0)) { fo.sendBaseline('INVALID_EMAIL',false); return; } if (! system.check_name(uid)) { log(LOG_DEBUG,' - Cannot use user_id: ('+uid+')'); fo.sendBaseline('INVALID_UID',false); return; } var msgbase = new MsgBase('mail'); for (var i=0;i<6;i++) { code += cValChars.substr(parseInt(Math.random()*cValChars.length),1); } var hdrs = new Object(); hdrs.to=name; hdrs.to_net_type=netaddr_type(email); if (hdrs.to_net_type !== NET_NONE) { hdrs.to_net_addr = email; } else { fo.sendBaseline('CANNOT_SEND_TOKEN',false); return; } hdrs.from=system.name; hdrs.from_net_addr='sysop@'+system.inet_addr; hdrs.from_net_type=NET_INTERNET; hdrs.subject='Registration TOKEN for '+system.name; if (msgbase.open !== undefined && msgbase.open() === false) { console.print("\r\n\1n\1h\1rERROR: \1y" + msgbase.last_error + "\1n \r\n"); console.pause(); msgbase.close(); bbs.hangup(); return; } var msg="CODE: " + code + "\n\n"; msg += 'Please use the above code to validate your login to '+system.name+'.'; if (! msgbase.save_msg(hdrs,msg)) { console.print("\r\n\1n\1h\1rERROR: \1y" + msgbase.last_error + "\1n \r\n"); console.pause(); msgbase.close(); bbs.hangup(); return; } msgbase.close(); } fo.sendBaseline('TOKEN_SENT',false); log(LOG_DEBUG,'SENT EMAIL TOKEN ('+code+') ['+JSON.stringify(hdrs)+']'); } } this.process=function() { log(LOG_DEBUG,'Creating user: '+fo.fieldValue('EMAIL')); try { var newuser = system.new_user(fo.fieldValue('UID')); } catch (e) { fo.sendBaseline('USER_EXISTS',false); log(LOG_ERROR,"New user couldn't be created (user created while signing up)"); log(LOG_ERROR,JSON.stringify(e)); return; } if (typeof newuser === 'number') { fo.sendBaseline('USER_CREATE_ERROR',false); log(LOG_ERROR,"New user couldn't be created (error code "+newuser+")"); return; } newuser.security.password = ''; if (bbs.login(newuser.alias,null)) { user.number = newuser.number; user.security.password = fo.fieldValue('PASS'); user.name = fo.fieldValue('FULLNAME'); user.handle = fo.fieldValue('UID'); user.location = fo.fieldValue('CITY')+', '+fo.fieldValue('COUNTRY'); user.zipcode = fo.fieldValue('PCODE'); user.netmail = fo.fieldValue('EMAIL'); user.comment = 'ANSITEX registered user'; bbs.user_sync(); bbs.logon(); log(LOG_INFO,"Created user record #"+user.number+": "+user.alias); action = ACTION_EXIT; return; } else { fo.sendBaseline('LOGIN_ERROR',false); log(LOG_INFO,"bbs.login() failed"); user.comment = 'Initial login failed!'; newuser.settings |= USER_DELETED; delete newuser; return; } return 'processed'; } } this;