util  Check-in [5e680bdd13]

Overview
Comment:add clipserv
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 5e680bdd135eea1f3007b2e0bbb400fbac6eaee6ad07499e78c0bfde77e4c91a
User & Date: lexi on 2019-07-21 06:15:31
Other Links: manifest | tags
Context
2019-07-21
06:35
add clipserv check-in: 6a5d1f9f67 user: lexi tags: trunk
06:15
add clipserv check-in: 5e680bdd13 user: lexi tags: trunk
2019-07-20
23:37
udpate xpriv to use sysv shmem by default; give iaia an option to generate its own types, and allow selecting between 7-bit and 8-bit encodings for ascii (defaulting to 8-bit); update mkpw to work with new iaia; update ord to add flag controlling byte length (7 or 8) for iaia's ascii mode check-in: 6a14de1811 user: lexi tags: trunk
Changes

Added clipserv/ansi.b version [96ef78cae7].



















































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
; [ʞ] ansi.b
;  ~ lexi hale <lexi@hale.su>
;  © AGPLv3
;  ? a terminal text formatter for boron
;  > do read/text %ansi.b
;  @ vim: ft=rebol

stdin:  open 0
stdout: open 1
stderr: open 2

fmt-code-stack: []

in-list: func [i lst] [ either (find lst i) [true] [false] ]

ansi: context [
	escape: to-string #{1B5B}
	fmt: "m" with: ";"
	style: context [
		hl: "1" ul: "4" rv: "7" sl: "3" dim: "2" 
	]
	color: context [
		red: "1"    green: "2"
		yellow: "3" blue: "4"
		purple: "5" cyan: "6"
		white: "7" black: "0"
	]
	fg: color   bg: color

	frame: context [
		kind: none
		value: none
	]
]

fmt-push: func[k v] [ any [
	all [
		f-kind: in ansi k
		f-val: in (do f-kind) v
		
		frame: make ansi/frame [
			kind: f-kind
			value: f-val
		]

		append fmt-code-stack frame
	] throw 'bad-argument
]]

fmt-pop: does [ pop fmt-code-stack ]

fmt-seq: func[/local] [
	active-styles: []
	active-colors: context [
		fg: none
		bg: none
	]

	foreach frame fmt-code-stack [
		either eq? frame/kind 'style [
			ifn in-list frame/value active-styles [
				append active-styles frame/value
			] 
		] /* or */ [
			ck: in active-colors (unbind frame/kind)
			set ck frame/value
		]
	]

	style-string: rejoin (map i active-styles [join ";" (do i)])

	key: context [
		plain: context [ fg: "3" bg: "4" ]
		bright: context [ fg: "9" bg: "10" ]
	]
	foreach i [fg bg] [
		code: do (in key/plain i)
		color: do (in active-colors i)
		if color [
			style-string: join style-string rejoin
				[";" code do color]
		]
	]

	free active-styles

	rejoin [ ansi/escape style-string ansi/fmt ]
]

fmt: func [lst] [
	depth: 0
	evaluated: map term (join lst fmt-seq) [
		case [
			paren? term [
				fmt-push (first term) (second term)
				++ depth fmt-seq
			]
			word? term [ do term ]
			block? term [ fmt term ]
			string? term [ term ]
		]
	]
	loop depth [fmt-pop]
	rejoin evaluated
]

Added clipserv/clip.b version [589ffdd50a].











































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#!/usr/bin/env -S boron -sp
; [ʞ] clipserv.b 
;  ~ lexi hale <lexi@hale.su>
;  # boron
;  @ vim: ft=rebol
;  ? a tool for transmitting clipboard from one
;    host to another over the network. WARNING:
;    simple nonce authentication is used but the
;    clipboard is sent IN THE CLEAR 

do read/text %ansi.b

verbose: no
readonly: no
port: "42069"
key: #{981A7879}

proto: context [
	writecb: #{3E}
	readcb: #{C5}
]

debug: func [x] [
	if verbose [
		x: either block? x [rejoin x] [x]

		write stderr fmt [
			[(fg red) "["] [(style hl) "debug"] " " x [(fg red) "]"] "^/"
		]
	]
]

entropy-sink: open %/dev/urandom
rand-block: func[sz] [ read/part entropy-sink sz ]
key-hash: func[k z /local] [
	cksum: checksum join k z
	slice cksum 0,4
]

debug "parsing arguments"

usage: does [
	write stderr fmt [[(style hl)"usage:"]
		" ./clip.b get <hostname> | send <hostname>" ]
]

flag: func [f /extern verbose readonly] [
	debug ["found flag " i]
	do select [
		"-v" [ verbose: yes ]
		"-q" [ verbose: no ]
		"-r" [ readonly: yes ]
	] f
]

set-clipboard: func[c] [ execute/in "xsel -bi" c ]

get-clipboard: func[/local] [ 
	clip-out: ""
	execute/out "xsel -bo" clip-out
	clip-out
]

start-server: func[/local] [
	debug ["serving clipboard from " hostname none ]
	sock: open join "tcp://:" port
	forever [
		connection: read wait sock
		nonce: rand-block 4
		expect-key: (key-hash nonce key)
		write connection nonce
		debug [ "sent nonce " nonce ";"
			"expecting password " expect-key ";"]

		client-message: read wait connection
		client-key: slice client-message 0,4
		client-command: slice client-message 4,1
		client-body: slice client-message 5,-1

		debug [ "received pw " client-key ]
		either eq? client-key expect-key [
			debug [ "admitted access" ]
			debug [ "got command " client-command ]
			case [
				eq? client-command proto/readcb [
					debug {sending clipboard to client}
					write connection get-clipboard
				]
				eq? client-command proto/writecb [
					new-clipboard: to-string client-body
					debug ["got cb " new-clipboard]
					set-clipboard new-clipboard
				]
				true [ write connection "bad command" ]
			]
		] [
			debug "denied access"
			write connection "access denied"
		]
		close connection
		debug [ "closed connection" ]
	]
]

send-clip: func[host] [
	debug ["sending clipboard to " host ]
	sock: open rejoin ["tcp://" host ":" port]
	nonce: read wait sock
	debug [ "got nonce " nonce ]
	client-key: key-hash nonce key
	debug [ "sending password " client-key ]
	msg: rejoin [
		client-key
		proto/writecb
		get-clipboard #{00}
	]
	write sock msg
]
get-clip: func[host] [
	debug ["getting clipboard from " host ]
	sock: open rejoin ["tcp://" host ":" port]
	nonce: read wait sock
	debug [ "got nonce " nonce ]
	client-key: key-hash nonce key
	debug [ "sending password " client-key ]
	msg: rejoin [ client-key proto/readcb ]
	write sock msg
	clipboard: read wait sock
	print ["server response: " to-string clipboard]
]

main: func [argv checked-flags] [
	case [
		none? argv [ usage ]
		parse argv ["get"  host: string!] [ get-clip  host ]
		parse argv ["send" host: string!] [ send-clip host ]
		parse argv ["serve"] [ start-server ]
		not checked-flags [
			new-args: []
			foreach i argv [
				either eq? first i '-' [ flag i ] [
					new-args: join new-args i ] ]
			main new-args yes
		]
		true [ usage ]
	]
]

main args no