Public Sub CreateMultipartJob(Link As String, NameValues As Map, Files As List) As HttpJob
Dim boundary As String = "---------------------------1461124740692"
TempCounter = TempCounter + 1
Dim TempFileName As String = "post-" & TempCounter
Dim stream As OutputStream = File.OpenOutput(xui.DefaultFolder, TempFileName, False)
Dim b() As Byte
Dim eol As String = Chr(13) & Chr(10)
Dim empty As Boolean = True
If NameValues <> Null And NameValues.IsInitialized Then
For Each key As String In NameValues.Keys
Dim value As String = NameValues.Get(key)
empty = MultipartStartSection (stream, empty)
Dim s As String = _
$"--${boundary}
Content-Disposition: form-data; name="${key}"
${value}"$
b = s.Replace(CRLF, eol).GetBytes("UTF8")
stream.WriteBytes(b, 0, b.Length)
Next
End If
If Files <> Null And Files.IsInitialized Then
For Each fd As MultipartFileData In Files
empty = MultipartStartSection (stream, empty)
Dim s As String = _
$"--${boundary}
Content-Disposition: form-data; name="${fd.KeyName}"; filename="${fd.FileName}"
Content-Type: ${fd.ContentType}
"$
b = s.Replace(CRLF, eol).GetBytes("UTF8")
stream.WriteBytes(b, 0, b.Length)
Dim in As InputStream = File.OpenInput(fd.Dir, fd.FileName)
File.Copy2(in, stream)
Next
End If
empty = MultipartStartSection (stream, empty)
s = _
$"--${boundary}--
"$
b = s.Replace(CRLF, eol).GetBytes("UTF8")
stream.WriteBytes(b, 0, b.Length)
Dim job As HttpJob
job.Initialize("", Me)
stream.Close
Dim length As Int = File.Size(xui.DefaultFolder, TempFileName)
Dim in As InputStream = File.OpenInput(xui.DefaultFolder, TempFileName)
Dim cin As CountingInputStream
cin.Initialize(in)
Dim req As OkHttpRequest = job.GetRequest
req.InitializePost(Link, cin, length)
req.SetContentType("multipart/form-data; boundary=" & boundary)
req.SetContentEncoding("UTF8")
TrackProgress(cin, length)
job.Tag = TempFileName
CallSubDelayed2(HttpUtils2Service, "SubmitJob", job)
Return job
End Sub
Private Sub MultipartStartSection (stream As OutputStream, empty As Boolean) As Boolean
If empty = False Then
stream.WriteBytes(Array As Byte(13, 10), 0, 2)
Else
empty = False
End If
Return empty
End Sub
Private Sub TrackProgress (cin As CountingInputStream, length As Int)
TrackerIndex = TrackerIndex + 1
Dim MyIndex As Int = TrackerIndex
Do While MyIndex = TrackerIndex
Log($"$1.2{cin.Count * 100 / length}%"$)
If cin.Count = length Then Exit
Sleep(100)
Loop
End Sub
Multiplatform - B4X
Needs the Library B4XEncryption
Sub EncryptText(text As String, password As String) As Byte()
Dim c As B4XCipher
Return c.Encrypt(text.GetBytes("utf8"), password)
End Sub
Sub DecryptText(EncryptedData() As Byte, password As String) As String
Dim c As B4XCipher
Dim b() As Byte = c.Decrypt(EncryptedData, password)
Return BytesToString(b, 0, b.Length, "utf8")
End Sub
Dim encryptedData() As Byte = EncryptText("confidential", "123456")
Log(DecryptText(encryptedData, "123456"))
Multiplatform - B4X
in PHP
0 ? mcrypt_create_iv( 16 ) : "" );
$temp .= hash_hmac( 'sha256', $plaintext, $mac_key, true );
$temp .= hash_hmac( 'sha256', $meta, $mac_key, true );
$mac = hash_hmac( 'sha256', $temp, $mac_key, true );
$siv = substr( $mac, 0, 16 );
// Encrypt the message
$enc = mcrypt_encrypt( 'rijndael-128', $enc_key, $plaintext, 'ctr', $siv );
return base64_encode( $siv . $nonce . $enc );
}
/**
* Decrypts an encrypted string
*
* @param string $key Encryption key, also used during encryption
* @param string $encrypted Encrypted string to be decrypted
* @param mixed $meta Associated data that must be the same as when encrypted
*
* @return string Decrypted string or `null` if key/meta has been tampered with
*/
function decrypt( $key, $ciphertext, $meta = '' ) {
// Generate valid key
$key = hash_pbkdf2( 'sha256', $key, '', 10000, 0, true );
// Serialize metadata
$meta = serialize($meta);
// Derive two subkeys from the original key
$mac_key = hash_hmac( 'sha256', 'mac', $key, true );
$enc_key = hash_hmac( 'sha256', 'enc', $key, true );
$enc_key = substr( $enc_key, 0, 32 );
// Unpack MAC, nonce and encrypted message from the ciphertext
$enc = base64_decode( $ciphertext );
$siv = substr( $enc, 0, 16 );
$nonce = substr( $enc, 16, 16 );
$enc = substr( $enc, 16 + 16 );
// Decrypt message
$plaintext = mcrypt_decrypt( 'rijndael-128', $enc_key, $enc, 'ctr', $siv );
// Verify MAC, return null if message is invalid
$temp = $nonce;
$temp .= hash_hmac( 'sha256', $plaintext, $mac_key, true );
$temp .= hash_hmac( 'sha256', $meta, $mac_key, true );
$mac = hash_hmac( 'sha256', $temp, $mac_key, true );
if ( $siv !== substr( $mac, 0, 16 ) ) return null;
return $plaintext;
}
/**
* Encrypts a string
*
* Do not use this function, it is only here for historical reference
*
* @param string $key Encryption key, also required for decryption
* @param string $raw Raw string to be encrypted
*
* @return string Raw data encrypted with key
*/
// function encrypt($key, $raw) {
// return base64_encode(mcrypt_encrypt(
// MCRYPT_RIJNDAEL_256,
// md5($key),
// $raw,
// MCRYPT_MODE_CBC,
// md5(md5($key))
// ));
// }
/**
* Decrypts an encrypted string
*
* Do not use this function, it is only here for historical reference
*
* @param string $key Encryption key, also used during encryption
* @param string $encrypted Encrypted string to be decrypted
*
* @return string Decrypted string or `null` if key/meta has been tampered with
*/
// function decrypt($key, $encrypted) {
// return rtrim(
// mcrypt_decrypt(
// MCRYPT_RIJNDAEL_256,
// md5($key),
// base64_decode($encrypted),
// MCRYPT_MODE_CBC,
// md5(md5($key))
// )
// );
// }
************
'Rich', 'email' => 'rich@richjenks.com' ];
$encrypted = encrypt($key, $raw, $meta);
$decrypted = decrypt($key, $encrypted, $meta);
echo 'KEY:';
var_dump($key);
echo 'RAW:';
var_dump($raw);
echo 'META:';
var_dump($meta);
echo 'ENCRYPTED:';
var_dump($encrypted);
echo 'DENCRYPTED:';
var_dump($decrypted);
Other Web
abc… Letters
123… Digits
\d Any Digit
\D Any Non-digit character
. Any Character
\. Period
[abc] Only a, b, or c
[^abc] Not a, b, nor c
[a-z] Characters a to z
[0-9] Numbers 0 to 9
\w Any Alphanumeric character
\W Any Non-alphanumeric character
{m} m Repetitions
{m,n} m to n Repetitions
* Zero or more repetitions
+ One or more repetitions
? Optional character
\s Any Whitespace
\S Any Non-whitespace character
^…$ Starts and ends
(…) Capture Group
(a(bc)) Capture Sub-group
(.*) Capture all
(abc|def) Matches abc or def
Web
https://regexone.com/
Web
Easily write regular expressions and use them on your code.
https://ihateregex.io/
Collection of free APIs that you can use on your projects.
https://github.com/public-apis/public-apis
Web
library of SVG images and illustrations that you can use on your projects
https://undraw.co/
Web
For website 5 times faster
https://responsively.app/
Web