c107fc194f69e733eaff58e585899a97dad0f7ec chinhli Mon May 7 01:51:00 2012 -0700 Send activation mail to user diff --git src/hg/hgLogin/hgLogin.c src/hg/hgLogin/hgLogin.c index 8f06ff8..7155704 100644 --- src/hg/hgLogin/hgLogin.c +++ src/hg/hgLogin/hgLogin.c @@ -82,31 +82,31 @@ "<div id=\"confirmationBox\" class=\"centeredContainer formBox\">" "\n" "<h2>UCSC Genome Browser</h2>" "<p id=\"confirmationMsg\" class=\"confirmationTxt\">An email has been sent to " " <span id=\"emailaddress\">%s</span> containing %s...</p>" "\n" "<p><a href=\"hgLogin?hgLogin.do.displayLoginPage=1\">Return to Login</a></p>" , email , obj ); } void sendMail(char *email, char *subject, char *msg) { char *hgLoginHost = wikiLinkHost(); char *obj = cartUsualString(cart, "hgLogin_helpWith", ""); -char cmd[256]; +char cmd[1024]; safef(cmd,sizeof(cmd), "echo '%s' | mail -s \"%s\" %s" , msg, subject, email); int result = system(cmd); if (result == -1) { hPrintf( "<h2>UCSC Genome Browser</h2>" "<p align=\"left\">" "</p>" "<h3>Error emailing %s to: %s</h3>" "Click <a href=hgLogin?hgLogin.do.displayAccHelpPage=1>here</a> to return.<br>" , obj , email ); } @@ -172,75 +172,147 @@ encryptNewPwd(password, encPwd, sizeof(encPwd)); safef(query,sizeof(query), "update gbMembers set lastUse=NOW(),newPassword='%s', newPasswordExpire=DATE_ADD(NOW(), INTERVAL 7 DAY), passwordChangeRequired='Y' where userName='%s'", sqlEscapeString(encPwd), sqlEscapeString(username)); sqlUpdate(conn, query); sendNewPassword(conn, username, password); return; } void sendNewPassword(struct sqlConnection *conn, char *username, char *password) /* email user new password */ { struct sqlResult *sr; char query[256]; -/* find all the user names assocaited with this email address */ +/* find email address assocaited with this username */ safef(query,sizeof(query),"select email from gbMembers where userName='%s'", username); char *email = sqlQuickString(conn, query); if (!email || sameString(email,"")) { freez(&errMsg); errMsg = cloneString("Email address not found."); displayAccHelpPage(conn); return; } mailNewPassword(username, email, password); sqlFreeResult(&sr); } void mailNewPassword(char *username, char *email, char *password) /* send user new password */ { char subject[256]; char msg[256]; char signature[256]="\nUCSC Genome Browser \nhttp://www.genome.ucsc.edu "; safef(subject, sizeof(subject),"Greeting form UCSC Genome Browser"); safef(msg, sizeof(msg), "New password for user %s: \n\n %s \n", username, password); safecat (msg, sizeof(msg), signature); sendMail(email, subject, msg); } /*************** to-do below *********************/ +void setupNewAccount(struct sqlConnection *conn, char *email, char *username) +/* Send an activation mail to user */ +{ +char query[256]; +char *token = generateRandomPassword(); +// char encToken[45] = ""; +// encryptNewPwd(token, encToken, sizeof(encToken)); + + int i; + unsigned char result[MD5_DIGEST_LENGTH]; + char tokenMD5[MD5_DIGEST_LENGTH*2 + 1]; + i = MD5_DIGEST_LENGTH; + // /*DEBUG*/ printf("MD5_DIGEST_LENGT is -- %d\n",i); + MD5((unsigned char *) token, strlen(token), result); + // output +/****************************************************** DEBUG + printf("result array:\n"); + for(i = 0; i < MD5_DIGEST_LENGTH; i++) + printf("%02x", result[i]); + printf("\n"); +************************************************************/ + // Convert the tokenMD5 value to string + // /* DEBUG */ printf("Convert result to tokenMD5 .......\n"); + for(i = 0; i < MD5_DIGEST_LENGTH; i++) + { + sprintf(&tokenMD5[i*2], "%02x", result[i]); + } +safef(query,sizeof(query), "update gbMembers set lastUse=NOW(),emailToken='%s', emailTokenExpires=DATE_ADD(NOW(), INTERVAL 7 DAY), accountActivated='N' where userName='%s'" +// , sqlEscapeString(encToken) +, sqlEscapeString(tokenMD5) +, sqlEscapeString(username) +); +sqlUpdate(conn, query); +// sendActivateMail(email, username, encToken); +sendActivateMail(email, username, tokenMD5); +return; +} + +void sendActivateMail(char *email, char *username, char *encToken) +/* Send activation mail with token to user*/ +{ +char subject[256]; +char msg[4064]; +char activateURL[256]; +char *hgLoginHost = wikiLinkHost(); +safef(activateURL, sizeof(activateURL), + "http://%s/cgi-bin/hgLogin?do.activateAccount=1&user=%s&token=%s\n" +, sqlEscapeString(hgLoginHost) +, sqlEscapeString(username) +, sqlEscapeString(encToken) +); + +char signature[256]="\nUCSC Genome Browser \nhttp://www.genome.ucsc.edu "; +safef(subject, sizeof(subject),"Greeting form UCSC Genome Browser"); +safef(msg, sizeof(msg), +"You have sign up an account at UCSC Genome Browser with username \"%s\". \n Please click the following link to activate the account -- \n\n%s\n\n" +, username +, activateURL +); +safecat (msg, sizeof(msg), signature); +sendMail(email, subject, msg); +} + void activateAccount(struct sqlConnection *conn) /* activate account */ { // struct sqlResult *sr; // char **row; char query[256]; -char *token = cgiUsualString("hgLogin_activateAccount", ""); -safef(query,sizeof(query),"Token is %s ", token); -if (!sameString(token,"")) +char *token = cgiUsualString("token", ""); +char *username = cgiUsualString("user",""); +safef(query,sizeof(query), + "select emailToken from gbMembers where userName='%s'", username); +char *emailToken = sqlQuickString(conn, query); +hPrintf("<p>emailToken in DB: %s token: %s</P>", emailToken, token); +if (sameString(emailToken, token)) { + safef(query,sizeof(query), "update gbMembers set lastUse=NOW(), dateActivated=NOW(), emailToken='', emailTokenExpires='', accountActivated='Y' where userName='%s'" + , username + ); + sqlUpdate(conn, query); +} else { freez(&errMsg); - errMsg = cloneString(query); + errMsg = cloneString("Token does not match."); +} displayLoginPage(conn); return; } -} /* -------- password functions ---- */ void cryptWikiWay(char *password, char *salt, char* result) // encrypt password as mediawiki does: ':B:'.$salt.':'. md5($salt.'-'.md5($password ) { int i; unsigned char result1[MD5_DIGEST_LENGTH]; unsigned char result2[MD5_DIGEST_LENGTH]; char firstMD5[MD5_DIGEST_LENGTH*2 + 1]; char secondMD5[MD5_DIGEST_LENGTH*2 + 1]; i = MD5_DIGEST_LENGTH; // /*DEBUG*/ printf("MD5_DIGEST_LENGT is -- %d\n",i); MD5((unsigned char *) password, strlen(password), result1); // output /****************************************************** DEBUG @@ -765,31 +837,31 @@ { freez(&errMsg); errMsg = cloneString("Passwords do not match."); signupPage(conn); return; } /* pass all the checks, OK to create the account now */ char encPwd[45] = ""; encryptNewPwd(password, encPwd, sizeof(encPwd)); safef(query,sizeof(query), "insert into gbMembers set " "userName='%s',password='%s',email='%s', " "lastUse=NOW(),accountActivated='N'", sqlEscapeString(user),sqlEscapeString(encPwd),sqlEscapeString(email)); sqlUpdate(conn, query); - +setupNewAccount(conn, email, user); /* send out activate code mail, and display the main confirmation box */ /* and comback here to contine back to URL */ hPrintf( "<h2>UCSC Genome Browser</h2>\n" "<p align=\"left\">\n" "</p>\n" "<h3>User %s successfully added.</h3>\n" , user ); /* TODO: cleanup the hgLogin_xxxx vars in the cart */ backToHgSession(2); } void displayAccHelpPage(struct sqlConnection *conn) @@ -899,31 +971,30 @@ displayAccHelpPage(conn); return; } else { safef(query,sizeof(query), "select password from gbMembers where userName='%s'", username); char *password = sqlQuickString(conn, query); if (!password) { freez(&errMsg); errMsg = cloneString("Username not found."); displayAccHelpPage(conn); return; } } lostPassword(conn, username); - //sendNewPassword(conn, username, password); return; } // cartRemove(cart, "hgLogin_helpWith"); // cartRemove(cart, "hgLogin_email"); // cartRemove(cart, "hgLogin_userName"); displayAccHelpPage(conn); return; } void clearNewPasswordFields(struct sqlConnection *conn, char *username) /* clear the newPassword fields */ { char query[256]; safef(query,sizeof(query), "update gbMembers set lastUse=NOW(),newPassword='', newPasswordExpire='', passwordChangeRequired='N' where userName='%s'", sqlEscapeString(username)); @@ -1244,31 +1315,31 @@ if (cartVarExists(cart, "debug")) debugShowAllMembers(conn); else if (cartVarExists(cart, "hgLogin.do.changePasswordPage")) changePasswordPage(conn); else if (cartVarExists(cart, "hgLogin.do.changePassword")) changePassword(conn); else if (cartVarExists(cart, "hgLogin.do.displayUserInfo")) displayUserInfo(conn); else if (cartVarExists(cart, "hgLogin.do.displayAccHelpPage")) displayAccHelpPage(conn); else if (cartVarExists(cart, "hgLogin.do.accountHelp")) accountHelp(conn); else if (cartVarExists(cart, "hgLogin.do.activateAccount")) activateAccount(conn); else if (cartVarExists(cart, "hgLogin.do.displayMailSuccess")) - displayMailSuccess(conn); + displayMailSuccess(); else if (cartVarExists(cart, "hgLogin.do.displayLoginPage")) displayLoginPage(conn); else if (cartVarExists(cart, "hgLogin.do.displayLogin")) displayLogin(conn); else if (cartVarExists(cart, "hgLogin.do.displayLogout")) displayLogoutSuccess(); else if (cartVarExists(cart, "hgLogin.do.signup")) signup(conn); else signupPage(conn); hDisconnectCentral(&conn); cartRemovePrefix(cart, "hgLogin.do.");