Michael Jumper
a76e307176
GUACAMOLE-249: RDP "DisableEncryption" settings flag has been inverted and renamed to "UseRdpSecurityLayer".
2019-09-29 14:25:47 -07:00
Michael Jumper
6886665f65
GUACAMOLE-249: Comment out usage of old event interface.
2019-09-29 14:15:41 -07:00
Michael Jumper
703ce5c223
GUACAMOLE-249: Remove usage of old FreeRDP channels interface.
2019-09-29 14:15:13 -07:00
Michael Jumper
ad7ab67571
GUACAMOLE-249: The freerdp/gdi/gdi.h header is required to access contents of rdpGdi struct.
2019-09-22 14:58:23 -07:00
Michael Jumper
9fa9adbd58
GUACAMOLE-249: Migrate to libwinpr "CF_*" constants for clipboard formats.
...
The "CB_FORMAT_*" constants which used to be defined by FreeRDP no
longer exist.
2019-09-22 14:58:23 -07:00
Michael Jumper
3b560044bc
GUACAMOLE-249: Correct prototype of certificate verification callback. If accepting the certificate, request that FreeRDP not store it.
2019-09-22 14:49:30 -07:00
Michael Jumper
82664b4e6b
GUACAMOLE-249: Correct prototypes of GDI handlers.
2019-09-22 14:49:30 -07:00
Michael Jumper
fbfbaff540
GUACAMOLE-249: Correct prototypes of pointer handlers.
2019-09-22 14:49:30 -07:00
Michael Jumper
e4a68d776f
GUACAMOLE-249: Correct prototypes of glyph handlers.
2019-09-22 14:49:30 -07:00
Michael Jumper
9b08a716d6
GUACAMOLE-249: Comment out remaining usage of SVC.
2019-09-22 14:49:03 -07:00
Michael Jumper
554251cc72
GUACAMOLE-249: Remove usage of CLRCONV.
2019-09-22 14:49:00 -07:00
Michael Jumper
17d31d94b7
GUACAMOLE-249: Remove all legacy FreeRDP compatibility.
2019-09-22 14:48:56 -07:00
Michael Jumper
a5b62aa82e
GUACAMOLE-249: Migrate to newer API (partial).
2019-09-22 14:48:26 -07:00
Michael Jumper
43269920db
GUACAMOLE-630: Clarify usage of argv-related guac_user_callback implementations.
2019-08-07 20:16:01 -07:00
Michael Jumper
f56df8b8be
GUACAMOLE-630: Automatically send current color scheme and font to users joining SSH, telnet, and Kubernetes connections.
2019-08-04 12:52:00 -07:00
Michael Jumper
ccfcfb116d
GUACAMOLE-630: Persist details of color scheme and font changes.
2019-08-04 12:44:43 -07:00
Michael Jumper
4dabea37af
GUACAMOLE-630: Allow guac_terminal_parse_color_scheme() to dictate color scheme format.
2019-08-04 11:55:45 -07:00
Michael Jumper
0516d599cf
GUACAMOLE-630: Disallow NULL color schemes.
...
A color scheme string should always be provided, even if blank.
Disallowing NULL allows assumptions to be made which simplifies the
logic surrounding persisting provided configuration values.
2019-08-04 11:45:41 -07:00
Michael Jumper
b5191caddc
GUACAMOLE-630: Accept pre-defined color schemes in all cases, not just during terminal creation.
2019-08-04 11:37:42 -07:00
Michael Jumper
0c7898c55a
GUACAMOLE-630: Expose terminal font/color configuration changes to connected clients.
2019-08-03 19:53:07 -07:00
Virtually Nick
e25f83d629
GUACAMOLE-623: Merge add support for adjusting terminal for Kubernetes via "argv".
2019-08-03 17:14:30 -04:00
Michael Jumper
e6835795f0
GUACAMOLE-623: Add support for setting terminal font for Kubernetes via "argv".
2019-08-03 14:04:30 -07:00
Michael Jumper
ca073db5b6
GUACAMOLE-629: Add convenience functions for immediately sending the current value of a connection parameter.
2019-07-30 14:05:50 -07:00
Michael Jumper
c3a295e9b7
GUACAMOLE-629: Add convenience function for automatically splitting data across a series of blob instructions.
2019-07-30 14:05:50 -07:00
Michael Jumper
c47aa0cea1
GUACAMOLE-629: Define constant for maximum blob size.
2019-07-30 13:34:24 -07:00
Michael Jumper
c1b8250300
GUACAMOLE-629: Move constants for Guacamole protocol to dedicated "*-constants.h" header.
2019-07-30 13:33:18 -07:00
Michael Jumper
a763d47bc7
GUACAMOLE-629: Add support for sending "argv" instructions from server to client.
2019-07-30 13:06:46 -07:00
Nick Couchman
26bb10a486
GUACAMOLE-422: Add empty handler and trace logging for nop instruction.
2019-07-23 14:29:50 -04:00
fgiuba
55add063c5
GUACAMOLE-547: Add missing space between brackets.
2019-07-11 13:37:03 +02:00
fgiuba
9228d2637a
GUACAMOLE-547: Do not ignore password from settings.
2019-07-11 13:37:03 +02:00
Nick Couchman
1baa91f852
GUACAMOLE-547: Minor changes to function documentation.
2019-06-19 12:38:05 -04:00
Nick Couchman
22874e2388
GUACAMOLE-547: Document return value of credential handler.
2019-06-18 17:59:33 -04:00
Nick Couchman
3511991e2f
GUACAMOLE-547: Fixes for style and documentation.
2019-06-18 07:52:05 -04:00
Nick Couchman
9a51d513f2
GUACAMOLE-547: Provide documentation for the new callback function.
2019-06-18 07:37:02 -04:00
Nick Couchman
3d15454097
GUACAMOLE-547: Use a call-back function for getting the password.
2019-06-18 07:37:02 -04:00
Nick Couchman
4641da06ac
GUACAMOLE-547: Relocate NULL check and log when NONE succeeds.
2019-06-18 07:37:02 -04:00
Nick Couchman
b7dca0ed16
GUACAMOLE-547: Add support for SSH NONE authentication method.
2019-06-18 07:37:02 -04:00
Nick Couchman
bf741a46d6
GUACAMOLE-422: Minor style and debug changes.
2019-04-27 21:37:26 -04:00
Nick Couchman
93a240b8ad
GUACAMOLE-422: Add debugging and check argument count.
2019-04-24 22:21:18 -04:00
Nick Couchman
4b43de963e
GUACAMOLE-422: Break handshake out into separate function; NULL out timezone when not received.
2019-04-22 11:49:46 -04:00
Nick Couchman
588e0f194a
GUACAMOLE-422: Fix return documentation on opcode handler function.
2019-04-19 15:50:29 -04:00
Nick Couchman
ab12b2aa8e
GUACAMOLE-422: More substantial comment for protocol version; NULL out timezone at beginning of handshake.
2019-04-19 15:48:14 -04:00
Nick Couchman
98cb7ccf67
GUACAMOLE-422: Fix comment and style.
2019-04-17 15:12:46 -04:00
Nick Couchman
75c0deac1f
GUACAMOLE-422: Update comment style for consistency.
2019-04-17 15:03:27 -04:00
Nick Couchman
54f88531d4
GUACAMOLE-422: Try to avoid memory leaks with mimetypes.
2019-04-17 15:00:46 -04:00
Nick Couchman
340aef5362
GUACAMOLE-422: Update to remove first argument
2019-04-17 14:41:35 -04:00
Nick Couchman
379fce2d77
GUACAMOLE-422: Rename new opcode handler function.
2019-04-11 17:21:36 -04:00
Nick Couchman
c750b18f60
GUACAMOLE-422: Handle sending version internally.
2019-04-11 17:18:27 -04:00
Nick Couchman
2f57564f5d
GUACAMOLE-422: Remove duplicate code and migrate handshake to user handlers.
2019-04-11 17:18:27 -04:00
Nick Couchman
2b68925ec9
GUACAMOLE-422: Add protocol version as initial item passed back in args.
2019-04-11 17:18:27 -04:00
Nick Couchman
0ee47e0186
GUACAMOLE-422: Change handshake to ignore order of opcodes.
2019-04-11 17:18:27 -04:00
Nick Couchman
5480b288e8
GUACAMOLE-422: Remove NULL check for parser argv.
2019-04-11 17:18:27 -04:00
Nick Couchman
5caa8a25f7
GUACAMOLE-422: SSH parameter should use handshake for default.
2019-04-11 17:18:27 -04:00
Nick Couchman
6fae0b4b23
GUACAMOLE-422: Use timezone from handshake when parameter does not exist.
2019-04-11 17:18:27 -04:00
Nick Couchman
f70aa4939f
GUACAMOLE-422: Add client timezone to handshake.
2019-04-11 17:16:43 -04:00
Michael Jumper
0c25782036
GUACAMOLE-637: Add missing libguac include path to RDP and common-ssh tests.
2019-04-09 23:36:03 -07:00
James Muehlner
dd4c3968d1
GUACAMOLE-637: Merge migration to new libguac string functions.
2019-04-09 21:49:16 -07:00
Michael Jumper
f8ec709e33
GUACAMOLE-637: Correct naming of SFTP unit tests.
2019-04-07 16:51:53 -07:00
Michael Jumper
cda7bca126
GUACAMOLE-637: Add RDP filesystem and SFTP unit tests for path depth.
2019-04-07 16:51:33 -07:00
Michael Jumper
6e2be38ae2
GUACAMOLE-637: Add path depth limits to generated paths in unit tests.
2019-04-07 16:36:16 -07:00
Michael Jumper
986f7f5d64
GUACAMOLE-637: Use same logic for RDP filesystem path normalization as SFTP.
2019-04-07 16:30:27 -07:00
Michael Jumper
1591980579
GUACAMOLE-637: Simplify SFTP path normalization logic. Correct behavior to match documentation.
2019-04-07 16:14:00 -07:00
Michael Jumper
591e494dfd
GUACAMOLE-637: Add unit tests for RDP filesystem path normalization.
2019-04-07 13:56:52 -07:00
Michael Jumper
f19754cfa6
GUACAMOLE-637: Add unit tests for SFTP path normalization.
2019-04-07 13:50:53 -07:00
Michael Jumper
24ab5ca85b
GUACAMOLE-637: Remove unnecessary .gitignore files. Universally exclude test output. Remove duplicated exclusions.
2019-04-07 11:50:43 -07:00
Michael Jumper
a0d030a7ae
GUACAMOLE-729: Update libtool version info for libguac (interfaces added and changed).
2019-02-09 11:20:06 -08:00
Virtually Nick
7065ff5586
GUACAMOLE-712: Merge add Danish to RDP
2019-02-06 09:01:33 -05:00
netromnetrom
aeb9b99a6c
Merge pull request #2 from netromnetrom/patch-1
...
Patch 1
2019-02-06 12:01:19 +01:00
Michael Jumper
c6feef6c86
GUACAMOLE-637: Clarify purpose of initial empty path component. Fix normalization logic to ensure that empty component is always present.
2019-01-23 20:28:09 -08:00
Michael Jumper
350d8e5995
GUACAMOLE-637: Document failsafe behavior of guac_strlcat() in the event the destination buffer is not terminated as required.
2019-01-23 19:02:19 -08:00
Michael Jumper
ba8fd17394
GUACAMOLE-637: "concatentation" ... not "contatenation".
2019-01-23 18:53:06 -08:00
Michael Jumper
9fb713d804
GUACAMOLE-637: Correct grammar of documentation for guac_strl*() unit tests.
2019-01-23 18:51:53 -08:00
Michael Jumper
b7761e9a2e
GUACAMOLE-637: The $^
variable is non-portable and specific to GNU Make. As otherwise POSIX-compliant platforms may not provide this variable, we shouldn't use it here.
2019-01-23 18:44:45 -08:00
Michael Jumper
789e3883d6
GUACAMOLE-637: Not all systems place Perl in /usr/bin. The line #!/usr/bin/env perl
should be used for portability.
2019-01-23 18:44:45 -08:00
Michael Jumper
e6c5da315e
GUACAMOLE-637: Add unit tests for guac_strljoin().
2019-01-23 18:44:45 -08:00
Michael Jumper
258946cd88
GUACAMOLE-637: Correctly handle string lengths as size_t (unsigned).
2019-01-23 18:44:45 -08:00
Michael Jumper
068f33aaef
GUACAMOLE-637: Add unit tests for guac_strlcat().
2019-01-23 18:44:45 -08:00
Michael Jumper
dec3642905
GUACAMOLE-637: Add unit tests for guac_strlcpy().
2019-01-23 18:44:45 -08:00
Michael Jumper
fdd3292f09
GUACAMOLE-637: Simplify path translation logic. Update to use guac_strl*(). Fix return values.
2019-01-23 18:44:45 -08:00
Michael Jumper
3549da0dd1
GUACAMOLE-637: Replace usages of strncat() with guac_strlcat().
2019-01-23 18:44:45 -08:00
Michael Jumper
e5c1147cf6
GUACAMOLE-637: Replace usages of strncpy() with guac_strlcpy().
2019-01-23 18:44:45 -08:00
Michael Jumper
5bf6a1479c
GUACAMOLE-637: Add convenience function for joining an array of strings using a given delimiter.
2019-01-23 18:44:45 -08:00
Michael Jumper
a78f254611
GUACAMOLE-637: Add strlcat() implementation. Use libc strlcat() if available.
2019-01-23 18:44:45 -08:00
Michael Jumper
d7909a77aa
GUACAMOLE-637: Add strlcpy() implementation. Use libc strlcpy() if available.
2019-01-23 18:44:45 -08:00
Michael Jumper
f6953e1317
GUACAMOLE-637: Use proper namespaced path for Guacamole headers within libguac source.
2019-01-23 18:44:45 -08:00
netromnetrom
7b7c8a1b02
Update Makefile.am
2019-01-22 16:24:56 +01:00
netromnetrom
a06edb9deb
Update and rename dk_dk_qwerty.keymap to da_dk_qwerty.keymap
2019-01-22 14:36:05 +01:00
Michael Jumper
d73b86b4b7
GUACAMOLE-661: Mark "nest" instruction and socket as deprecated.
2019-01-07 09:37:08 -08:00
Michael Jumper
cc4671d7a1
GUACAMOLE-662: Correct handling of buffering within nested socket.
...
The nested socket implementation seems to have never been properly
updated since guac_socket was changed to rely on implementation-specific
buffering. This meant that absolutely every write resulted in a nest
instruction being sent to the parent socket.
Data should instead be built up within the internal buffer, with each
flush writing as much of the internal buffer as possible within a nest
instruction, leaving any partial UTF-8 characters at the end of the
buffer for later completion with future writes.
2019-01-06 17:09:35 -08:00
Michael Jumper
47ad6f4b59
GUACAMOLE-662: Properly initialize nested socket index (fixes GUACAMOLE-510).
2019-01-06 17:09:35 -08:00
Nick Couchman
aba7b987d3
GUACAMOLE-662: Merge fix handling of unit tests within buid.
2019-01-06 19:42:12 -05:00
Michael Jumper
b6477ea7ae
GUACAMOLE-354: Merge RDP keymap for Swiss-German keyboards.
2018-12-04 10:58:34 -08:00
Andrin
01142e6dd8
GUACAMOLE-354: Fixed keyboard name.
2018-12-04 08:30:36 +01:00
Andrin
9486ec7cc4
GUACAMOLE-354: Add Swiss-German keymap for RDP
2018-11-20 14:10:36 +01:00
Michael Jumper
476b431041
GUACAMOLE-662: Migrate tests to test runners generated by new convenience script. Remove unnecessary test runners.
2018-11-17 18:06:40 -08:00
Michael Jumper
867e63b524
GUACAMOLE-638: avcodec_register_all() should be used only if not deprecated.
2018-11-12 16:36:15 -08:00
Nick Couchman
7b1ba3f269
GUACAMOLE-422: Fix spelling mistake.
2018-11-12 12:09:51 -05:00
Nick Couchman
d1b3695282
GUACAMOLE-422: Fix type in strerror()
2018-11-12 11:56:57 -05:00
Nick Couchman
f61539c4e7
GUACAMOLE-422: Quick fixes for style and logging.
2018-11-12 11:55:07 -05:00
Nick Couchman
9a944637be
GUACAMOLE-422: Fix function declaration for pushing settings.
2018-11-11 17:25:12 -05:00
Nick Couchman
4bd19160de
GUACAMOLE-422: Add logging for RDP timzeone.
2018-11-11 17:22:03 -05:00
Nick Couchman
b3be9eb869
GUACAMOLE-422: Revert addition of logging for setting TZ variable.
2018-11-11 16:07:20 -05:00
Nick Couchman
0b71559017
GUACAMOLE-422: Add errno header.
2018-11-11 15:48:02 -05:00
Nick Couchman
e2b4de9d95
GAUCAMOLE-422: Add warning messages when TZ cannot be set.
2018-11-11 15:45:24 -05:00
Nick Couchman
d7ed452d69
GUACAMOLE-422: Update comments on timezone settings.
2018-11-11 15:30:17 -05:00
Nick Couchman
5536b836ad
GUACAMOLE-422: Add support for passing through TZ in SSH.
2018-11-11 14:11:40 -05:00
Nick Couchman
ffdc98d024
GUACAMOLE-422: Support timezone redirection in RDP via TZ variable.
2018-11-11 14:09:23 -05:00
Nick Couchman
381c5d1a76
GUACAMOLE-630: Merge allow font parameters of active terminal session to be changed.
2018-11-11 14:03:58 -05:00
Michael Jumper
5683be0ea3
GUACAMOLE-630: Allow SSH/telnet font family and size to be updated.
2018-11-10 14:22:23 -08:00
Michael Jumper
9e28de70ec
GUACAMOLE-630: Separate setting of font family/size from terminal display initialization.
2018-11-10 14:22:23 -08:00
Nick Couchman
d2cb7a9ce9
GUACAMOLE-630: Merge allow color scheme of active terminals to be changed.
2018-11-10 10:45:56 -05:00
Michael Jumper
0cf24219d8
GUACAMOLE-630: Define maximum "argv" stream length for SSH and telnet with symbolic constants.
2018-11-09 20:27:28 -08:00
Michael Jumper
edbdd08476
GUACAMOLE-649: Allow SSH connection to continue despite failure to set LANG environment variable.
2018-11-08 19:29:32 -08:00
Michael Jumper
454682979e
GUACAMOLE-649: Add support for setting LANG environment variable via SSH.
2018-11-04 21:20:47 -08:00
Michael Jumper
f293c5e9c0
GUACAMOLE-630: Do not entirely reset terminal state when color scheme is changed.
2018-10-22 23:23:27 -07:00
Michael Jumper
dcab540839
GUACAMOLE-630: Persist semantics of default foreground/background with dedicated palette pseudo-indexes.
2018-10-22 23:23:27 -07:00
Michael Jumper
2f16eadb35
GUACAMOLE-630: Allow color scheme to be changed from webapp via argv streams.
2018-10-22 23:23:27 -07:00
Michael Jumper
6f9f2189f2
GUACAMOLE-630: Separate color scheme parsing into own files.
2018-10-22 23:23:27 -07:00
Michael Jumper
6f49194640
Merge 1.0.0 changes back to master.
2018-10-16 09:05:37 -07:00
Nick Couchman
34c088882b
GUACAMOLE-527: Correct issue with order of VNC SFTP settings.
2018-10-16 09:27:45 -04:00
Michael Jumper
d851f10a48
GUACAMOLE-353: Clarify applicability of ASF header when transcluded into generated build files.
2018-10-02 20:37:49 -07:00
Michael Jumper
7374b29364
GUACAMOLE-623: Start terminal once Kubernetes connection is ready (necessary since merge of GUACAMOLE-622).
2018-09-27 09:33:31 -07:00
Michael Jumper
9c593bde89
GUACAMOLE-623: Kill connection if libwebsockets is destroying the underlying WebSocket.
...
Older versions of libwebsockets will not necessarily invoke close events
under all circumstances, and will instead sometimes summarily destroy
the WebSocket. Thankfully there is another event for that, and newer
versions of libwebsockets continue to define that event. We can hook
into both to handle disconnect.
2018-09-26 22:31:25 -07:00
Michael Jumper
44d3433ea9
GUACAMOLE-623: Explicitly bypass certificate checks if requested.
...
For older versions of libwebsockets, simply requesting that OpenSSL
ignore the verification result is insufficient, as libwebsockets
manually checks and confirms the verification result, producing an error
in all but specific cases.
2018-09-26 22:01:46 -07:00
Michael Jumper
7ee624844a
GUACAMOLE-623: Remove unnecessary initialization of pwsi.
...
The pwsi member was previously used to ensure the lws structure was made
available to invocations of the event callback early in the connection
lifecycle such that the underlyin guac_client could always be retrieved.
Since the migration to guac_kubernetes_lws_current_client, this is not
necessary, and isn't supported in older versions of libwebsockets
anyway.
2018-09-26 21:52:53 -07:00
Michael Jumper
b48a1b3a5d
GUACAMOLE-623: Use libwebsockets' dummy callback only if defined.
2018-09-26 21:51:07 -07:00
Michael Jumper
d8618b0682
GUACAMOLE-623: Support older libwebsockets SSL initialization.
2018-09-26 21:50:19 -07:00
Nick Couchman
760f7a649a
GUACAMOLE-629: Merge add support for updating connection parameters of in-progress connections.
2018-09-26 08:47:32 -04:00
Nick Couchman
2d6ce1a5fd
GUACAMOLE-632: Merge dynamic JPEG/WebP quality scaling.
2018-09-26 08:45:32 -04:00
Michael Jumper
61df2956b3
GUACAMOLE-623: Clean up logging (libwebsockets adds newline characters).
2018-09-25 21:30:52 -07:00
Michael Jumper
83a531bc89
GUACAMOLE-623: Add support for SSL.
2018-09-25 21:30:52 -07:00
Michael Jumper
2e50573531
GUACAMOLE-623: Move I/O-related functions into separate files.
2018-09-25 21:30:52 -07:00
Michael Jumper
5e3aec6df2
GUACAMOLE-623: Add missing documentation for URL character test.
2018-09-25 21:30:51 -07:00
Michael Jumper
371eed1f93
GUACAMOLE-623: Add missin includes. Remove unnecessary includes.
2018-09-25 21:30:51 -07:00
Michael Jumper
c5f67a31dc
GUACAMOLE-623: Add configure test for LWS_CALLBACK_CLIENT_CLOSED (only defined in recent libwebsockets and required if present).
2018-09-25 21:30:51 -07:00
Michael Jumper
ed56093888
GUACAMOLE-623: Generate Kubernetes API endpoint dynamically.
2018-09-25 21:30:51 -07:00
Michael Jumper
34f8f8b30d
GUACAMOLE-623: Redirect libwebsockets logging to guacd's debug level log.
2018-09-25 21:30:51 -07:00
Michael Jumper
fe7edce569
GUACAMOLE-623: Add support for terminal resize. Redraw Kubernetes container upon connect.
2018-09-25 21:30:51 -07:00
Michael Jumper
b7c938c239
GUACAMOLE-623: Send typed data to Kubernetes via the STDIN channel.
2018-09-25 21:30:51 -07:00
Michael Jumper
f35517b3ff
GUACAMOLE-623: Add outbound message buffer.
2018-09-25 21:30:51 -07:00
Michael Jumper
cbe593503f
GUACAMOLE-623: Do not return -1 from libwebsockets callback. Doing so results in automatic cleanup of part of the context, resulting in a segfault when lws_context_destroy() is invoked.
2018-09-25 21:30:51 -07:00
Michael Jumper
f72877bf0d
GUACAMOLE-623: Handle data received from Kubernetes.
2018-09-25 21:30:51 -07:00
Michael Jumper
7165fa949d
GUACAMOLE-623: Stub out implementation of WebSocket client for Kubernetes.
2018-09-25 21:30:51 -07:00
Michael Jumper
519c90a887
GUACAMOLE-623: Default to unencrypted Kubernetes connections.
2018-09-25 21:30:51 -07:00
Michael Jumper
5bae422b29
GUACAMOLE-623: libwebsockets requires an integer port number.
2018-09-25 21:30:51 -07:00
Michael Jumper
b8bd0e4c6a
GUACAMOLE-623: Add base skeleton for Kubernetes protocol support.
2018-09-25 21:30:51 -07:00
Michael Jumper
45e8503ead
GUACAMOLE-632: Dynamically scale JPEG/WebP quality depending on measured processing lag.
2018-09-25 13:28:21 -07:00
Michael Jumper
8456c050ea
GUACAMOLE-629: Add support for updating connection parameters of in-progress connections.
2018-09-25 11:40:08 -07:00
Nick Couchman
54fda21366
GUACAMOLE-622: Merge withold first terminal frame until connection is verified.
2018-09-21 20:26:47 -04:00
Michael Jumper
622a849bae
GUACAMOLE-628: Correct RDP scancode mapping for right control key.
2018-09-21 16:25:11 -07:00