pages/DatabaseConfig.nsi
author Dan
Wed, 27 May 2009 01:17:11 -0400
changeset 2 0c0d5dadfca3
parent 0 67e1cc6cd929
child 3 0cce88c7cf7c
permissions -rw-r--r--
Added LockWindow calls to all custom page exit paths to smooth transitions

!macro ShowRange hwnd low high value
  !define tmp_id ${__LINE__}
  StrCpy $R0 ${low}
  loop.${tmp_id}:
    GetDlgItem $R1 ${hwnd} $R0
    ShowWindow $R1 ${value}
    IntOp $R0 $R0 + 1
    IntCmp $R0 ${high} loop.${tmp_id} loop.${tmp_id}
    
  !undef tmp_id
!macroend
!define ShowRange "!insertmacro ShowRange"

Page custom DatabaseConfigCreate DatabaseConfigLeave " - Database configuration"

Function DatabaseConfigCreate
  StrCmp $XPUI_ABORTED 1 0 +2
    Return
  !insertmacro XPUI_INSTALLOPTIONS_EXTRACT_AS "pages\DatabaseConfig.ini" "DatabaseConfig.ini"
  !insertmacro XPUI_HEADER_TEXT "Database configuration" "Configure how $(^Name) will access your database."
  WriteINIStr "$PLUGINSDIR\DatabaseConfig.ini" "Field 9" "Text" \
    "$(^Name) needs database access to work properly. Setup can create a database for you if you provide \
     $db_dbmsname's administration password, or you can choose to enter credentials for a database that already exists."

  !insertmacro XPUI_INSTALLOPTIONS_INITDIALOG "DatabaseConfig.ini"
  Pop $XPUI_HWND

  ${ShowRange} $XPUI_HWND 1204 1207 ${SW_HIDE}
  ${ShowRange} $XPUI_HWND 1210 1213 ${SW_HIDE}

  !insertmacro XPUI_INSTALLOPTIONS_SHOW
FunctionEnd

Function DatabaseConfigLeave
  StrCmp $XPUI_ABORTED 1 0 +2
    Return
    
  ReadINIStr $0 "$PLUGINSDIR\DatabaseConfig.ini" "Settings" "State"
  StrCmp $0 1 RadioButtonClicked
  StrCmp $0 2 RadioButtonClicked
  StrCmp $0 3 UseManualClicked
  Goto NextClicked
  
  RadioButtonClicked:
    LockWindow on
    ReadINIStr $0 "$PLUGINSDIR\DatabaseConfig.ini" "Field 1" "State"
    IntCmp $0 0 SetUseExisting
    
      ; Show root password
      GetDlgItem $0 $XPUI_HWND 1203
      ShowWindow $0 ${SW_SHOW}
      GetDlgItem $0 $XPUI_HWND 1209
      ShowWindow $0 ${SW_SHOW}
    
      GetDlgItem $0 $XPUI_HWND 1202 ; Checkbox
      SendMessage $0 ${BM_SETCHECK} ${BST_UNCHECKED} 0
      EnableWindow $0 1
      ${ShowRange} $XPUI_HWND 1204 1207 ${SW_HIDE}
      ${ShowRange} $XPUI_HWND 1210 1213 ${SW_HIDE}
      LockWindow off
      Abort
    
    SetUseExisting:
    
      ; Hide root password
      GetDlgItem $0 $XPUI_HWND 1203
      ShowWindow $0 ${SW_HIDE}
      GetDlgItem $0 $XPUI_HWND 1209
      ShowWindow $0 ${SW_HIDE}
      
      GetDlgItem $0 $XPUI_HWND 1202 ; Checkbox
      SendMessage $0 ${BM_SETCHECK} ${BST_CHECKED} 0
      EnableWindow $0 0
      ${ShowRange} $XPUI_HWND 1204 1207 ${SW_SHOW}
      ${ShowRange} $XPUI_HWND 1210 1213 ${SW_SHOW}
      LockWindow off
      Abort
    
  UseManualClicked:
    ReadINIStr $0 "$PLUGINSDIR\DatabaseConfig.ini" "Field 3" "State"
    IntOp $0 $0 * ${SW_SHOW}
    ${ShowRange} $XPUI_HWND 1204 1207 $0
    ${ShowRange} $XPUI_HWND 1210 1213 $0
    Abort
  
  NextClicked:

    ; Figure out how we want to go about this.
    StrCpy $db_needroot 0
    ReadINIStr $0 "$PLUGINSDIR\DatabaseConfig.ini" "Field 1" "State"
    IntCmp $0 0 UseCustomLogin
    
      ; Validate based on root password.
      StrCpy $db_needroot 1
      ReadINIStr $db_rootpass "$PLUGINSDIR\DatabaseConfig.ini" "Field 4" "State"
      ${db_connect} $1 "$db_rootuser" "$db_rootpass"
      IntCmp $1 0 +3
        MessageBox MB_OK|MB_ICONEXCLAMATION "The $db_dbmsname root password you entered is incorrect. Please re-enter it."
        Abort
        
      ; Does the user have their own credentials?
      ReadINIStr $0 "$PLUGINSDIR\DatabaseConfig.ini" "Field 3" "State"
      IntCmp $0 0 GenerateRandomLogin
    
    UseCustomLogin:
    
      ; Pull database settings from dialog
      ReadINIStr $db_name "$PLUGINSDIR\DatabaseConfig.ini" "Field 5" "State"
      ReadINIStr $db_user "$PLUGINSDIR\DatabaseConfig.ini" "Field 6" "State"
      ReadINIStr $db_password "$PLUGINSDIR\DatabaseConfig.ini" "Field 7" "State"
      ReadINIStr $R0 "$PLUGINSDIR\DatabaseConfig.ini" "Field 8" "State"
      
      ; Check password length
      ; but don't if the user entered credentials that already exist
      IntCmp $db_needroot 0 SkipLengthCheck
        StrLen $R1 $R0
        IntCmp $R1 6 +3 0 +3
          MessageBox MB_OK|MB_ICONEXCLAMATION "Please choose a database password that is at least 6 characters in length."
          Abort
          
      SkipLengthCheck:
      ; Check password/confirm fields
      StrCmp $db_password $R0 +3
        MessageBox MB_OK|MB_ICONEXCLAMATION "The passwords you entered do not match. Please enter them again."
        Abort
        
      ; If we're root, we can assume the login doesn't exist yet, so skip the validation
      IntCmp $db_needroot 0 +3
        LockWindow on
        Return
        
      ${db_connect} $R0 $db_user $db_password
      IntCmp $R0 0 +3
        ; Database auth failed
        MessageBox MB_OK|MB_ICONEXCLAMATION "The username and password you entered are invalid. Please enter them again."
        Abort
        
      ; This can be an error-prone process because entering credentials manually will keep
      ; the installer from touching the database. If tables already exist, Enano's installer
      ; will throw an error. Confirm this with the user.
      MessageBox MB_YESNO|MB_ICONQUESTION "Do you really want to use manual database settings?$\r$\n\
                                           $\r$\n\
                                           Setup will not attempt to modify your existing database. If there is \
                                           already an installation of $(^Name) in the database, the installer will \
                                           fail. This option is recommended only for advanced users." IDYES +2
        Abort ; on No
      
      LockWindow on
      Return
      
    GenerateRandomLogin:
      StrCpy $db_name "bn_enanocms"
      StrCpy $db_user "bn_enanocms"
      Call GenerateRandomPassword
      Pop $db_password
      LockWindow on
      Return
  
FunctionEnd

Function GenerateRandomPassword
  SetOutPath $PLUGINSDIR
  File "inst-resources\randompass.php"
  nsExec::ExecToStack '"$stack_instdir\php\php.exe" "$PLUGINSDIR\randompass.php"'
  Pop $R0
FunctionEnd