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