#requires -version 5 <# .SYNOPSIS warpbox: command line uploader for Warpbox .DESCRIPTION Set the server once, then upload anything: setx WARPBOX_HOST "https://your.warpbox.host" warpbox .\report.pdf Install (PowerShell): iwr "$env:WARPBOX_HOST/static/api/warpbox.ps1" -OutFile $HOME\warpbox.ps1 # add a function to your $PROFILE: function warpbox { & "$HOME\warpbox.ps1" @args } Auth: set the token once so it never lands in your command history. setx WARPBOX_TOKEN "wbx_your_token" Create a token under Account, Access tokens. .EXAMPLE .\warpbox.ps1 .\report.pdf .EXAMPLE .\warpbox.ps1 -Password 123 -Expiry 2d .\photo.png .\clip.mp4 #> [CmdletBinding()] param( [Alias('p')][string]$Password, [Alias('e')][string]$Expiry, [Alias('n')][int]$MaxDownloads, [Alias('o')][switch]$Obfuscate, [string]$Server = $env:WARPBOX_HOST, [string]$Auth = $env:WARPBOX_TOKEN, [string]$AuthFile, [switch]$Json, [switch]$Help, [Parameter(ValueFromRemainingArguments = $true)][string[]]$Files ) if ($Help -or -not $Files) { Write-Host 'warpbox: upload files to Warpbox' Write-Host 'USAGE: warpbox.ps1 [-Password pw] [-Expiry 2d] [-MaxDownloads n] [-Obfuscate] [-Json] [file ...]' Write-Host 'SERVER: set WARPBOX_HOST in your environment (setx WARPBOX_HOST "https://your.host")' Write-Host 'AUTH: set WARPBOX_TOKEN in your environment (setx WARPBOX_TOKEN "wbx_...")' if (-not $Files -and -not $Help) { exit 2 } else { exit 0 } } if (-not $Server) { Write-Error 'warpbox: no server set. Use -Server or set WARPBOX_HOST' exit 2 } if ($AuthFile) { $Auth = (Get-Content -Raw $AuthFile).Trim() } function ConvertTo-Minutes($v) { if ($v -match '^(\d+)([mhdw]?)$') { $n = [int]$Matches[1] switch ($Matches[2]) { 'h' { return $n * 60 } 'd' { return $n * 1440 } 'w' { return $n * 10080 } default { return $n } } } return $v } # Expand wildcards (PowerShell does not expand them in arguments). $expanded = @() foreach ($f in $Files) { $hits = Get-ChildItem -Path $f -File -ErrorAction SilentlyContinue if ($hits) { $expanded += $hits.FullName } else { $expanded += $f } } $curlArgs = @('-fS') foreach ($f in $expanded) { $curlArgs += @('-F', "file=@$f") } if ($Password) { $curlArgs += @('-F', "password=$Password") } if ($Expiry) { $curlArgs += @('-F', "expires_minutes=$(ConvertTo-Minutes $Expiry)") } if ($MaxDownloads) { $curlArgs += @('-F', "max_downloads=$MaxDownloads") } if ($Obfuscate) { $curlArgs += @('-F', 'obfuscate_metadata=on') } if ($Auth) { $curlArgs += @('-H', "Authorization: Bearer $Auth") } if ($Json) { $curlArgs += @('-H', 'Accept: application/json') } $curlArgs += "$($Server.TrimEnd('/'))/api/v1/upload" & curl.exe @curlArgs