/** * This handles user registration. * * The form must have the following fields: * + USER 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(session) { var code = ''; var complete = false; var processed = false; var ready = false; function init(session) { log(LOG_DEBUG,' - Register init()'); ready = true; } // Called before processing for a field Object.defineProperty(this, 'getName', { get: function () { return 'Control-Registration'; } }); Object.defineProperty(this, 'isComplete', { get: function () { return complete && processed; } }); this.handle = function(read) { // Dont allow existing users to re-register if (user.number) { session.baselineSend('ALREADY_MEMBER',false); return (read === '*') ? read : ''; } log(LOG_DEBUG,'Control REGISTER handle() start. ('+read+')'); if (cf === undefined) { log(LOG_DEBUG,' - CF not defined, returning'); return read; } log(LOG_DEBUG,'- Field '+cf.name+'('+JSON.stringify(cf)+')'); if ((cf.name === 'TOKEN') && (read === '#' || read === "\r")) { if (cf.value === code) { complete = true; } else { session.baselineSend('INVALID_CODE',false); session.cursorOn(cf.c+cf.value.length,cf.r); session.attr(cf.attribute); read = ''; } } log(LOG_DEBUG,'- Field Value ['+cf.value+'] ('+code+')'); return read; } this.prefield = function() { log(LOG_DEBUG,'- prefield: Field '+cf.name+'('+JSON.stringify(cf)+')'); // Make sure we got an email if (cf.name === 'TOKEN') { if (! code.length) { log(LOG_DEBUG,' - BASELINE '+cf.name+'('+JSON.stringify(cf)+')'); session.baselineSend('TOKEN_EMAIL',false); var email = session.fieldValue('EMAIL'); var uid = session.fieldValue('USER'); var name = session.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)) { session.baselineSend('INVALID_EMAIL',false); return; } if (! system.check_name(uid)) { log(LOG_DEBUG,' - Cannot use user_id: ('+uid+')'); session.baselineSend('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 { session.baselineSend('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 + "\r\n\r\n"; msg += 'Please use the above code to validate your login to '+system.name+'.'; //log(LOG_DEBUG,' - HDR:'+JSON.stringify(hdrs)); //log(LOG_DEBUG,' - MSG:'+JSON.stringify(msg)); 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(); } session.baselineSend('TOKEN_SENT',false); log(LOG_DEBUG,'SENT EMAIL TOKEN ('+code+') ['+JSON.stringify(hdrs)+']'); } } this.process = function() { log(LOG_DEBUG,'Creating user: ['+session.fieldValue('EMAIL')+'] ['+session.fieldValue('USER')+']'); try { var newuser = system.new_user(session.fieldValue('USER')); } catch (e) { session.baselineSend('USER_EXISTS',false); log(LOG_ERROR,"New user couldn't be created (user created while signing up)"); log(LOG_ERROR,JSON.stringify(e)); processed = true; return this.isComplete; } if (typeof newuser === 'number') { session.baselineSend('USER_CREATE_ERROR',false); log(LOG_ERROR,"New user couldn't be created (error code "+newuser+")"); processed = true; return this.isComplete; } newuser.security.password = ''; if (bbs.login(newuser.alias,null)) { user.number = newuser.number; user.security.password = session.fieldValue('PASS'); user.name = session.fieldValue('FULLNAME'); user.handle = session.fieldValue('USER'); user.location = session.fieldValue('CITY')+', '+session.fieldValue('COUNTRY'); user.zipcode = session.fieldValue('PCODE'); user.netmail = session.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; processed = true; return this.isComplete; } else { session.baselineSend('LOGIN_ERROR',false); log(LOG_INFO,"bbs.login() failed"); user.comment = 'Initial login failed!'; newuser.settings |= USER_DELETED; delete newuser; processed = true; return this.isComplete; } } // @todo Doesnt appear to be used this.ready = function() { log(LOG_DEBUG,'register:ready = '+JSON.stringify(ready)); return ready; } init.apply(this,arguments); }