Option Explicit

Dim shell, fso, baseDir, configDir, configFile, exampleFile
Dim hostname, accessTcpHost, accessTcpPort, accessTcpUrl
Dim sshUser, sshHost, sshPort, socksHost, socksPort, baltaUrl
Dim firefoxPath, cloudflaredPath, sshPath
Dim message, output, oldAccessTcpPort

Set shell = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")

baseDir = fso.GetParentFolderName(WScript.ScriptFullName)
configDir = fso.BuildPath(baseDir, "config")
configFile = fso.BuildPath(configDir, "cloudflare-access.env")
exampleFile = fso.BuildPath(configDir, "cloudflare-access.example.env")

If Not fso.FolderExists(configDir) Then
    fso.CreateFolder(configDir)
End If

If Not fso.FileExists(configFile) Then
    If fso.FileExists(exampleFile) Then
        fso.CopyFile exampleFile, configFile, True
    End If
End If

hostname = ReadValue(configFile, "CLOUDFLARED_HOSTNAME", "ssh-rip.beneditoonline.org")
accessTcpHost = ReadValue(configFile, "ACCESS_TCP_HOST", "127.0.0.1")
accessTcpPort = ReadValue(configFile, "ACCESS_TCP_PORT", "3443")
accessTcpUrl = ReadValue(configFile, "ACCESS_TCP_URL", accessTcpHost & ":" & accessTcpPort)
ParseAccessTcpUrl accessTcpUrl, accessTcpHost, accessTcpPort
accessTcpUrl = accessTcpHost & ":" & accessTcpPort
sshUser = ReadValue(configFile, "SSH_USER", "lucas")
sshHost = ReadValue(configFile, "SSH_HOST", "127.0.0.1")
sshPort = ReadValue(configFile, "SSH_PORT", "3443")
socksPort = ReadValue(configFile, "LOCAL_SOCKS_PORT", "1080")
socksHost = ReadValue(configFile, "LOCAL_SOCKS_HOST", "127.0.0.1")
baltaUrl = ReadValue(configFile, "BALTA_URL", "https://ripp.beneditoonline.org/")
firefoxPath = ReadValue(configFile, "FIREFOX_PATH", "")
cloudflaredPath = ReadValue(configFile, "CLOUDFLARED_PATH", "")
sshPath = ReadValue(configFile, "SSH_PATH", "")

message = "Este assistente pede apenas dados de configuracao." & vbCrLf & vbCrLf & _
          "Use os valores padrao se nao souber o que preencher."
MsgBox message, 64, "Rato - configuracao"

hostname = InputBox("Endereco do Cloudflare Access:", "Rato - hostname", hostname)
If Trim(hostname) = "" Then WScript.Quit 1

accessTcpUrl = InputBox("Listener local do Cloudflare Access:", "Rato - access tcp", accessTcpUrl)
If Trim(accessTcpUrl) = "" Then WScript.Quit 1
oldAccessTcpPort = accessTcpPort
If Not ParseAccessTcpUrl(accessTcpUrl, accessTcpHost, accessTcpPort) Then
    MsgBox "Listener local invalido. Use host:porta, por exemplo 127.0.0.1:3443.", 48, "Rato"
    WScript.Quit 1
End If
accessTcpUrl = accessTcpHost & ":" & accessTcpPort
If Trim(sshPort) = Trim(oldAccessTcpPort) Then
    sshPort = accessTcpPort
End If

sshUser = InputBox("Usuario SSH:", "Rato - usuario SSH", sshUser)
If Trim(sshUser) = "" Then WScript.Quit 1

sshHost = InputBox("Host SSH local:", "Rato - host SSH", sshHost)
If Trim(sshHost) = "" Then WScript.Quit 1

sshPort = InputBox("Porta SSH local:", "Rato - porta SSH", sshPort)
If Trim(sshPort) = "" Then WScript.Quit 1
If Not IsValidPort(sshPort) Then
    MsgBox "Porta SSH invalida. Use um numero entre 1 e 65535.", 48, "Rato"
    WScript.Quit 1
End If

socksHost = InputBox("Host local SOCKS5:", "Rato - SOCKS5 host", socksHost)
If Trim(socksHost) = "" Then WScript.Quit 1

socksPort = InputBox("Porta local SOCKS5:", "Rato - SOCKS5", socksPort)
If Trim(socksPort) = "" Then WScript.Quit 1
If Not IsValidPort(socksPort) Then
    MsgBox "Porta invalida. Use um numero entre 1 e 65535.", 48, "Rato"
    WScript.Quit 1
End If

baltaUrl = InputBox("Link do Balta:", "Rato - Balta", baltaUrl)
If Trim(baltaUrl) = "" Then WScript.Quit 1

firefoxPath = InputBox("Caminho do Firefox, se precisar. Se nao souber, deixe em branco:", "Rato - Firefox", firefoxPath)
cloudflaredPath = InputBox("Caminho do cloud.exe/cloudflared/hehe, se precisar. Se nao souber, deixe em branco:", "Rato - cloud", cloudflaredPath)
sshPath = InputBox("Caminho do ssh.exe, se precisar. Se nao souber, deixe em branco:", "Rato - ssh", sshPath)

output = "CLOUDFLARED_HOSTNAME=" & CleanValue(hostname) & vbCrLf & _
         "ACCESS_TCP_HOST=" & CleanValue(accessTcpHost) & vbCrLf & _
         "ACCESS_TCP_PORT=" & CleanValue(accessTcpPort) & vbCrLf & _
         "ACCESS_TCP_URL=" & CleanValue(accessTcpUrl) & vbCrLf & _
         "SSH_USER=" & CleanValue(sshUser) & vbCrLf & _
         "SSH_HOST=" & CleanValue(sshHost) & vbCrLf & _
         "SSH_PORT=" & CleanValue(sshPort) & vbCrLf & _
         "LOCAL_SOCKS_PORT=" & CleanValue(socksPort) & vbCrLf & _
         "LOCAL_SOCKS_HOST=" & CleanValue(socksHost) & vbCrLf & _
         "BALTA_URL=" & CleanValue(baltaUrl) & vbCrLf & _
         "FIREFOX_PATH=" & CleanValue(firefoxPath) & vbCrLf & _
         "CLOUDFLARED_PATH=" & CleanValue(cloudflaredPath) & vbCrLf & _
         "SSH_PATH=" & CleanValue(sshPath) & vbCrLf

WriteText configFile, output

MsgBox "Configuracao salva." & vbCrLf & vbCrLf & _
       "Agora clique em 1-checar.vbs e depois em 2-ligar.vbs.", 64, "Rato"

Function ReadValue(path, key, fallback)
    Dim file, line, pos, name, value

    ReadValue = fallback
    If Not fso.FileExists(path) Then Exit Function

    Set file = fso.OpenTextFile(path, 1, False)
    Do Until file.AtEndOfStream
        line = Trim(file.ReadLine)
        If Len(line) > 0 Then
            If Left(line, 1) <> "#" Then
                pos = InStr(line, "=")
                If pos > 0 Then
                    name = Trim(Left(line, pos - 1))
                    value = Trim(Mid(line, pos + 1))
                    If UCase(name) = UCase(key) Then
                        ReadValue = value
                        Exit Do
                    End If
                End If
            End If
        End If
    Loop
    file.Close
End Function

Function CleanValue(value)
    CleanValue = Replace(Trim(value), Chr(34), "")
End Function

Function ParseAccessTcpUrl(value, ByRef host, ByRef port)
    Dim trimmed, pos

    ParseAccessTcpUrl = False
    trimmed = Trim(value)
    pos = InStrRev(trimmed, ":")
    If pos <= 1 Then Exit Function
    If pos >= Len(trimmed) Then Exit Function

    host = Trim(Left(trimmed, pos - 1))
    port = Trim(Mid(trimmed, pos + 1))
    If host = "" Then Exit Function
    If Not IsValidPort(port) Then Exit Function

    ParseAccessTcpUrl = True
End Function

Function IsValidPort(value)
    Dim port, re

    IsValidPort = False
    value = Trim(value)
    If value = "" Then Exit Function

    Set re = New RegExp
    re.Pattern = "^[0-9]+$"
    re.IgnoreCase = True
    If Not re.Test(value) Then Exit Function

    port = CLng(value)
    If port < 1 Then Exit Function
    If port > 65535 Then Exit Function

    IsValidPort = True
End Function

Sub WriteText(path, text)
    Dim file
    Set file = fso.CreateTextFile(path, True, False)
    file.Write text
    file.Close
End Sub
