#include "content.hpp" #include "user.hpp" #include "strusCms.hpp" #include #include #include #include #include namespace apps { user::user( strusCms &cms ) : master( cms ) { cms.dispatcher( ).assign( "/login", &user::login, this ); cms.mapper( ).assign( "login" ); cms.dispatcher( ).assign( "/logout", &user::logout, this ); cms.mapper( ).assign( "logout" ); } void user::login( ) { content::user c( cms ); ini( c ); if( request( ).request_method( ) == "POST" && session( ).is_set( "prelogin" ) ) { c.login.load( context( ) ); if( c.login.validate( ) ) { session( ).reset_session( ); session( ).erase( "prelogin" ); session( )["username"] = c.login.username.value( ); session( ).expose( "username" ); response( ).set_redirect_header( cms.root( ) ); } } session( ).set( "prelogin", "" ); render( "login", c ); } void user::logout( ) { content::user c( cms ); session( ).clear( ); ini( c ); render( "logout", c ); } // TODO: make this a salted hash bool user::check_login( std::string user, std::string password ) { if( user.empty( ) || password.empty( ) ) { return false; } cppdb::session sql( cms.conn ); cppdb::result r; r = sql << "SELECT id, password FROM user WHERE username=?" << user << cppdb::row; if( r.empty( ) ) { return false; } int id; r >> id; std::string pass; r >> pass; if( password != pass ) { return false; } std::time_t now_time = std::time( 0 ); std::tm now = *std::localtime( &now_time ); cppdb::statement stmt; stmt = sql << "INSERT INTO login(user_id, last_login) VALUES(?, ?)" << id << now; stmt.exec( ); return true; } void user::ini( content::user &c ) { master::ini( c ); c.captcha = ">> CAPTCHA <<"; } } // namespace apps namespace content { login_form::login_form( apps::strusCms &cms ) : cppcms::form( ), cms( cms ) { username.message( "Your login" ); username.error_message( "The login is illegal" ); password.message( "Your password" ); password.error_message( "Your password is illegal" ); captcha.message( "Enter the correct captcha" ); captcha.error_message( "Captcha didn't match" ); submit.value( "Log in" ); add( username ); add( password ); add( captcha ); add( submit ); username.non_empty( ); password.non_empty( ); captcha.non_empty( ); } bool login_form::validate( ) { if( !form::validate( ) ) { return false; } if( !cms.user.check_login( username.value( ), password.value( ) ) ) { username.valid( false ); password.valid( false ); booster::ptime::sleep( booster::ptime( 5, 0 ) ); return false; } return true; } user::user( apps::strusCms &cms ) : login( cms ) { } } // namespace content