diff --git a/programs/network/pasta/pasta.asm b/programs/network/pasta/pasta.asm new file mode 100644 index 0000000000..2a38678103 --- /dev/null +++ b/programs/network/pasta/pasta.asm @@ -0,0 +1,267 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; Copyright (C) KolibriOS team 2014. All rights reserved. ;; +;; Distributed under terms of the GNU General Public License ;; +;; ;; +;; pasta.asm - Paste text to paste.kolibrios.org from a file or ;; +;; from clipboard. ;; +;; ;; +;; GNU GENERAL PUBLIC LICENSE ;; +;; Version 2, June 1991 ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +format binary as "" +use32 + org 0x0 + + db 'MENUET01' ; header + dd 0x01 ; header version + dd START ; entry point + dd IM_END ; image size + dd I_END+0x1000 ; required memory + dd I_END+0x1000 ; esp + dd param + dd 0 ; I_Path + + +include '../../macros.inc' +include '../../proc32.inc' +include '../../dll.inc' +include '../../develop/libraries/http/http.inc' + +virtual at 0 + http_msg http_msg +end virtual + + +START: + mcall 68, 11 ; init heap so we can allocate memory dynamically + +; load libraries + stdcall dll.Load, @IMPORT + test eax, eax + jnz error + +; Got parameters? + cmp byte[param], 0 + je clipboard + +; Yep, try to read the file. + mcall 68, 12, 32768 + test eax, eax + jz error + mov [file_struct.buf], eax + mov [clipboard_data], eax + mcall 70, file_struct + cmp eax, 6 + jne error + mov [clipboard_data_length], ebx + mov eax, [clipboard_data] + + jmp escape + +clipboard: + +; Get number of slots on the clipboard + mcall 54, 0 + cmp eax, -1 + je error + +; Get last item on clipboard + mov ecx, eax + dec ecx + inc ebx + mcall 54 + cmp eax, -1 + je error + +; Verify if we can work with it + cmp dword[eax + 4], 0 ; text ? + jne error + mov [clipboard_data], eax + mov ecx, dword[eax] + sub ecx, 8 + mov [clipboard_data_length], ecx + + mov eax, [clipboard_data] + add eax, 12 + +escape: +; Escape all characters that need escaping + invoke HTTP_escape, eax + test eax, eax + jz error + mov [clipboard_data_length], ebx + + push eax + mcall 68, 13, [clipboard_data] + pop [clipboard_data] + +; Connect to the server + invoke HTTP_get, sz_url, 0 + test eax, eax + jz error + mov [identifier], eax + + .again: + invoke HTTP_process, [identifier] + test eax, eax + jnz .again + + invoke HTTP_find_header_field, [identifier], sz_set_cookie + mov edi, cookie + test eax, eax + jz .no_cookie + + mov esi, eax + .cookie_loop: + lodsb + stosb + cmp al, 13 + je .cookie_end + cmp al, 10 + je .cookie_end + cmp al, 0 + je .cookie_end + jmp .cookie_loop + .cookie_end: + dec edi + .no_cookie: + mov ax, 0x0a0d + stosw + xor al, al + stosb + + invoke HTTP_free, [identifier] + + mov ecx, [clipboard_data_length] + add ecx, sz_paste_head.length + sz_paste_tail.length + invoke HTTP_post, sz_url, sz_cookie, sz_ctype, ecx + test eax, eax + jz error + mov [identifier], eax + + mov ecx, [eax + http_msg.socket] + mcall 75, 6, , sz_paste_head, sz_paste_head.length, 0 + mcall 75, 6, , [clipboard_data], [clipboard_data_length], 0 + mcall 75, 6, , sz_paste_tail, sz_paste_tail.length, 0 + + .again2: + invoke HTTP_process, [identifier] + test eax, eax + jnz .again2 + + mov ebp, [identifier] + cmp [ebp + http_msg.status], 302 ; found + jne error + + invoke HTTP_find_header_field, [identifier], sz_location + test eax, eax + jz error + + push eax + mov esi, sz_failed + mov edi, paste_url + mov ecx, 2 + rep movsd + pop esi + .url_loop: + lodsb + stosb + cmp al, 13 + je .url_end + cmp al, 10 + je .url_end + cmp al, 0 + je .url_end + jmp .url_loop + .url_end: + dec edi + lea ecx, [edi - paste_url + 4] + mov eax, '" -t' + stosd + mov ax, 'O' + stosw + mov [notify_struct.msg], paste_url + mcall 70, notify_struct + + mcall 54, 3 ; Delete last slot in the clipboard + + mov dword[paste_url-4], ecx + mov dword[paste_url+0], 0 ; Text + mov dword[paste_url+4], 1 ; cp0866 + mcall 54, 2, , paste_url-4 ; Write URL to the clipboard + + invoke HTTP_free, [identifier] + mcall -1 + +error: + mov [notify_struct.msg], sz_failed + mcall 70, notify_struct + + mcall -1 + + +;--------------------------------------------------------------------- +; Data area +;----------------------------------------------------------------------------- +align 4 +@IMPORT: + +library lib_http, 'http.obj' + +import lib_http, \ + HTTP_get, 'get', \ + HTTP_process, 'process', \ + HTTP_free, 'free', \ + HTTP_stop, 'stop', \ + HTTP_post, 'post', \ + HTTP_find_header_field, 'find_header_field', \ + HTTP_escape, 'escape' + +IM_END: + +file_struct: + dd 0 ; read file + dd 0 ; offset + dd 0 ; reserved + dd 32768 ; max file size + .buf dd 0 ; buffer ptr + db 0 + dd param + +notify_struct: + dd 7 ; run application + dd 0 + .msg dd paste_url + dd 0 + dd 0 + db '/sys/@notify', 0 + +sz_url db 'http://paste.kolibrios.org/', 0 +sz_set_cookie db 'set-cookie', 0 +sz_location db 'location', 0 +sz_ctype db 'application/x-www-form-urlencoded', 0 +sz_failed db '"Pasta',13,10,'Paste failed!" -E', 0 + +sz_paste_head db 'code=' +.length = $ - sz_paste_head +sz_paste_tail db '%0D%0A&language=text&webpage=' +.length = $ - sz_paste_tail + +sz_cookie db 'Cookie: ' +cookie db 0 + rb 1024 + +paste_url rb 1024 +param rb 1024 + +identifier dd 0 +clipboard_data dd 0 +clipboard_data_length dd 0 + +I_END: + + +