diff --git a/f_install/install.php b/f_install/install.php index fab1e230..ee2b48ea 100644 --- a/f_install/install.php +++ b/f_install/install.php @@ -4,8 +4,6 @@ require(ROOT.'/f_func/class._Time.php'); use utilphp\util as util; -session_start(); - ?> @@ -109,14 +107,16 @@ session_start();
- +
+ +
- +
diff --git a/f_install/j_create_admin.php b/f_install/j_create_admin.php new file mode 100644 index 00000000..a1069fe9 --- /dev/null +++ b/f_install/j_create_admin.php @@ -0,0 +1,79 @@ +false, + 'reason'=>'입력값이 설정되지 않았습니다.' + ]); +} + +if(strlen($password)!=128){ + returnJson([ + 'result'=>false, + 'reason'=>'올바르지 않은 비밀번호 해시 포맷입니다.' + ]); +} + +if(!$SETTING->isExist()){ + returnJson([ + 'result'=>false, + 'reason'=>'DB 설정이 완료되지 않았습니다.' + ]); +} + +require(__DIR__.'/../f_config/DB.php'); +$rootDB = getRootDB(); + +//초기 관리자 계정은 딱 하나만 있어야하므로, 중요함. +$rootDB->query('LOCK TABLES member WRITE, member_log WRITE'); + +$memberCnt = $rootDB->queryFirstField('SELECT count(`NO`) from member'); +if($memberCnt > 0){ + returnJson([ + 'result'=>'false', + 'reason'=>'이미 계정이 생성되어 있습니다' + ]); +} + +$userSalt = bin2hex(random_bytes(8)); +$finalPassword = hashPassword($userSalt, $password); +$nowDate = _Time::DatetimeNow(); + +$rootDB->insert('member',[ + 'oauth_type' => 'NONE', + 'id' => $username, + 'email' => null, + 'pw' => $finalPassword, + 'salt' => $userSalt, + 'grade'=> 5, + 'name'=>$nickname, + 'reg_date'=>$nowDate +]); +$userID = $rootDB->insertId(); + +$rootDB->insert('member_log', [ + 'member_no'=>$userID, + 'date'=>$nowDate, + 'action_type'=>'reg', + 'action'=>json_encode([ + 'type'=>'none', + 'aux'=>'admin', + 'id'=>$username, + 'name'=>$nickname + ], JSON_UNESCAPED_UNICODE) +]); + +returnJson([ + 'result'=>true, + 'reason'=>'success' +]); \ No newline at end of file diff --git a/f_install/j_install_status.php b/f_install/j_install_status.php index feaf219b..1b9f2078 100644 --- a/f_install/j_install_status.php +++ b/f_install/j_install_status.php @@ -4,7 +4,6 @@ require('_common.php'); require(__DIR__.'/../f_config/SETTING.php'); use utilphp\util as util; -session_start(); function dbConnFail($params){ returnJson([ @@ -34,7 +33,8 @@ $rootDB->error_handler = 'dbSQLFail'; $memberCnt = $rootDB->queryFirstField('SELECT count(`NO`) from MEMBER'); if($memberCnt === 0){ returnJson([ - 'step'=>'admin' + 'step'=>'admin', + 'globalSalt'=>getGlobalSalt() ]); } diff --git a/f_install/j_setup_db.php b/f_install/j_setup_db.php index 6f6e554a..e716e698 100644 --- a/f_install/j_setup_db.php +++ b/f_install/j_setup_db.php @@ -4,7 +4,6 @@ require('_common.php'); require(__DIR__.'/../f_config/SETTING.php'); use utilphp\util as util; -session_start(); function dbConnFail($params){ returnJson([ @@ -142,5 +141,5 @@ if($result !== true){ returnJson([ 'result'=>true, - 'reason'=>'NYI' + 'reason'=>'success' ]); \ No newline at end of file diff --git a/f_install/sql/common_schema.sql b/f_install/sql/common_schema.sql index 47ce8c26..ff4224c7 100644 --- a/f_install/sql/common_schema.sql +++ b/f_install/sql/common_schema.sql @@ -21,7 +21,7 @@ ENGINE=InnoDB DEFAULT CHARSET=UTF8; CREATE TABLE `member` ( `NO` INT(11) NOT NULL AUTO_INCREMENT, `oauth_id` BIGINT(20) NULL DEFAULT NULL, - `oauth_type` ENUM('NONE','KAKAO') NULL DEFAULT NULL, + `oauth_type` ENUM('NONE','KAKAO') NOT NULL, `ID` VARCHAR(64) NOT NULL, `EMAIL` VARCHAR(64) NULL DEFAULT NULL, `PW` CHAR(128) NOT NULL, diff --git a/js/install.js b/js/install.js index b919b94f..3c4f2ddf 100644 --- a/js/install.js +++ b/js/install.js @@ -15,6 +15,7 @@ function changeInstallMode(){ if(result.step == 'admin'){ $('#db_form_card').hide(); $('#admin_form_card').show(); + $('#global_salt').val(result.globalSalt); return; } if(result.step == 'done'){ @@ -35,6 +36,8 @@ function changeInstallMode(){ return; } + alert('알 수 없는 오류' + result); + }); } @@ -66,7 +69,7 @@ $(document).ready( function () { unhighlight: function (element, errorClass, validClass) { $( element ).addClass( "is-valid" ).removeClass( "is-invalid" ); } - }) + }); $('#db_form').submit(function(e){ e.preventDefault(); if(!$("#db_form").valid()){ @@ -102,4 +105,103 @@ $(document).ready( function () { }); }); + + $( "#admin_form" ).validate( { + rules: { + username: { + required: true, + minlength: 4, + maxlength: 64, + }, + password: { + required: true, + minlength: 6 + }, + confirm_password: { + required: true, + minlength: 6, + equalTo: "#password" + }, + nickname:{ + required: true, + maxlength: 6, + } + }, + messages: { + username: { + required: "유저명을 입력해주세요", + minlength: "{0}글자 이상 입력하셔야 합니다", + maxlength: '{0}자를 넘을 수 없습니다' + }, + password: { + required: "비밀번호를 입력해주세요", + minlength: "비밀번호는 적어도 {0}글자 이상이어야 합니다" + }, + confirm_password: { + required: "비밀번호를 입력해주세요", + minlength: "비밀번호는 적어도 {0}글자 이상이어야 합니다", + equalTo: "비밀번호가 일치하지 않습니다" + }, + nickname: { + required: "닉네임을 입력해주세요", + maxlength: '닉네임은 {0}자를 넘을 수 없습니다' + } + }, + errorElement: "div", + errorPlacement: function ( error, element ) { + // Add the `help-block` class to the error element + error.addClass( "invalid-feedback" ); + + if ( element.prop( "type" ) === "checkbox" ) { + error.insertAfter( element.parent( "label" ) ); + } else { + error.insertAfter( element ); + } + }, + highlight: function ( element, errorClass, validClass ) { + $( element ).addClass( "is-invalid" ).removeClass( "is-valid" ); + }, + unhighlight: function (element, errorClass, validClass) { + $( element ).addClass( "is-valid" ).removeClass( "is-invalid" ); + } + }); + + $('#admin_form').submit(function(e){ + e.preventDefault(); + if(!$("#admin_form").valid()){ + return; + } + + var raw_password = $('#password').val(); + var salt = $('#global_salt').val(); + console.log(salt + raw_password + salt); + var hash_pw = sha512(salt + raw_password + salt); + + $.ajax({ + cache:false, + type:'post', + url:'j_create_admin.php', + dataType:'json', + data:{ + username:$('#username').val(), + password:hash_pw, + nickname:$('#nickname').val() + } + }).then(function(result){ + var deferred = $.Deferred(); + + if(!result.result){ + alert(result.reason); + deferred.reject('fail'); + } + else{ + deferred.resolve(); + } + + return deferred.promise(); + }).then(function(){ + changeInstallMode(); + }); + + }); }); \ No newline at end of file