diff --git a/backend/AppDB.php b/backend/AppDB.php index fc733395fa467d7258e0cc1167d2db320a179720..3ab44fb71fce10574fecad7687f6aab49ef8dc1c 100644 --- a/backend/AppDB.php +++ b/backend/AppDB.php @@ -146,6 +146,18 @@ class AppDB extends Database $uid = $ret[ 0 ]; $this->query( "UPDATE person SET name=E'" . pg_escape_string( $name ) . "',password=E'" . pg_escape_string( md5( $username . ':' . $password ) ) . "', active=true WHERE id = " . $uid . ";" ); } + public function updateUserPassword( $uid, $name, $newpassword ) + { + $this->checkAdmin(); + + $res = $this->query( "SELECT * FROM person WHERE id = " . ( int ) $uid . " AND username = E'" . pg_escape_string( $name ) . "';" ); + if( count( $res ) ) + { + $this->query( "UPDATE person SET password=E'" . pg_escape_string( $newpassword ) . "', must_change_pwd=true WHERE id = " . ( int ) $uid . ";" ); + } else { + throw new Exception( "Invalid user parameters" ); + } + } public function getUser( $id, $withAssignments = false ) { $this->checkAdmin(); diff --git a/backend/TE/MainFrame.php b/backend/TE/MainFrame.php index 07715cbba785e991ee387d1ad60a056935d99355..5a520a08f32ce0cb4a6904b0db27c6e2314f0e50 100644 --- a/backend/TE/MainFrame.php +++ b/backend/TE/MainFrame.php @@ -93,6 +93,8 @@ class MainFrame extends Node $rs->getPage()->addScript( Application::get( 'jslib_chosen' ) ); $rs->getPage()->addStyleSheet( Application::get( 'csslib_chosen' ) ); + $rs->getPage()->addScript( Application::get( 'jslib_md5' ) ); + $rs->getPage()->addStyleSheet( 'css/app.css' ); $settings = array (); diff --git a/js/backend.admin.js b/js/backend.admin.js index 4083db01d8baa2081db2bf6477b4700a6fdd55a6..d6afce4d348f2181c8fda9a7a5d0328c6b563c6b 100644 --- a/js/backend.admin.js +++ b/js/backend.admin.js @@ -982,6 +982,23 @@ Pianos4Backend.AdminUser = function( selector, params ) */ ); + if( ! user.tutor ) + { + var reset = $( '
' ) + .css( 'margin-top', '10px' ) + .css( 'margin-bottom', '10px' ) + .append( + $( '' ) + .text( 'Reset user password' ) + .button() + .click( function( e ) + { + Pianos4Backend.ResetUserPassword( user ); + } ) + ) + .appendTo( div ); + } + var resdiv = $( '
' ); var results = $( '
' ).addClass( 'ui-widget pianos4_frame' ).appendTo( div ).append( $( '
' ).addClass( 'ui-widget-header ui-corner-top' ).text( 'Results' ) ) @@ -2264,3 +2281,125 @@ Pianos4Backend.MessageManager = function( parent, params ) } } + +Pianos4Backend.ResetUserPassword = function( user ) +{ + var resetui = $( '
' ) + .css( 'padding-top', '20px' ); + + $( '
' ) + .text( "Change password for the user '" + user.name + "':" ) + .append( + $( '
' ) + .css( 'display', 'grid' ) + .css( 'grid-template-columns', '1fr 2fr' ) + .css( 'grid-gap', '2px' ) + .css( 'height', 'calc(100% - 20px)' ) + .css( 'width', '100%' ) + .css( 'margin-top', '2em' ) + .append( $( '' ).text( 'New password' ) ) + .append( + $( '' ) + .attr( 'type', 'password' ) + .attr( 'id', 'newpassword' ) + .on( 'keydown', function( e ) + { + if ( e.which == 13 ) + { + e.preventDefault(); + validate(); + } + } ) + ) + .append( $( '' ).text( 'Re-type password' ) ) + .append( + $( '' ) + .attr( 'type', 'password' ) + .attr( 'id', 'newpasswordconfirm' ) + .on( 'keydown', function( e ) + { + if ( e.which == 13 ) + { + e.preventDefault(); + validate(); + } + } ) + ) + ) + .appendTo( resetui ); + + var validate = function() + { + var pass = $( '#newpassword' ).val(); + var conf = $( '#newpasswordconfirm' ).val(); + var error = false; + + if( pass == "" || conf == "" ) + { + toastr.error( "No empty password allowed" ); + error = true; + } + + if( pass != conf ) + { + toastr.error( "Password and confirmation field not equal" ); + error = true; + } + + if( ! error ) + { + var h = hex_md5( user.name + ':' + pass ); + + $.ajax( { + url: '?action=rpc&method=updateUserPassword', + data: { + uid: user.id, + name: user.name, + newpassword: h + }, + type: "POST", + dataType: 'json', + + success: function( data ) + { + if( ! data.error ) + { + toastr.success( "Password updated!" ); + $( '#changeuserpasswordui' ).dialog( 'close' ); + } else { + toastr.error( data.message, "Server side error" ); + } + }, + error: function( data ) + { + toastr.error( "Network error" ); + } + } ); + } + } + + var dlgopts = { + autoOpen: true, + modal: true, + width: 500, + height: 250, + resizable: true, + title: "Reset user password", + buttons: { + 'OK': function() + { + validate(); + }, + 'Close': function() + { + $( this ).dialog( 'close' ); + }, + } + } + + $( '
' ) + .attr( 'id', 'changeuserpasswordui' ) + .addClass( 'pianos4_dialog' ) + .append( resetui ) + .dialog( dlgopts ); +}