Commit Graph

1410 Commits

Author SHA1 Message Date
Armin Novak
eedf45583a Using sprintf_s now. 2015-03-30 18:17:07 +02:00
Armin Novak
0adab13719 Now returning const char* 2015-03-30 18:09:02 +02:00
Armin Novak
cf941304b3 Fixed windows _snprintf. 2015-03-30 18:05:46 +02:00
Armin Novak
827b4f76ca Added test for freerdp version functions. 2015-03-30 17:57:16 +02:00
Armin Novak
8f228163a8 Added version and build info functions
Added functions to get
 * Version String
 * Build Time String
 * Git Revision String
and appropriate tests.
2015-03-30 17:51:29 +02:00
Bernhard Miklautz
74c8400789 coding style fixes
Add missing space after if
2015-03-30 17:15:45 +02:00
Bernhard Miklautz
f469e069dc stream: Stream_Ensure*Capacity: change return type
Change the return type of Stream_Ensure*Capacity from void to BOOL to be
able to detect realloc problems easily. Otherwise the only way to detect
this was to check if the capacity after the call was >= the required
size.
In case Stream_Ensure*Capacity fails the old memory is still available
and need to freed outside.

This commit also adds checks to most calls of Stream_Ensure*Capacity to
check if the call was successful.
2015-03-30 16:33:48 +02:00
Marc-André Moreau
851626f296 Merge pull request #2492 from bmiklautz/malloc_wrap
Fix compiler warnings and code hardening
2015-03-30 09:35:36 -04:00
Norbert Federa
abeb79f2bb nego: fixed X.224 Connection Request PDU parsing
The X.224 Connection Request PDU might contain an optional cookie or
routing token before the optional RDP Negotiation Request (rdpNegReq).
If present, both of these fields must be terminated by a 0x0D0A
two-byte sequence. It seems that until now FreeRDP has incorrectly
assumed that a token or cookie must always be present.
If that was not the case, FreeRDP was searching for 0x0D0A until it
arrived at the end of the stream which prevented the remaining data
(RDP Negotiation Request, RDP Correlation Info) from being parsed.
2015-03-30 13:07:03 +02:00
Bernhard Miklautz
aa2181dcf2 Merge pull request #2483 from akallabeth/feat/freerdp_set_last_error_name
Feat/freerdp last error name
2015-03-26 16:42:54 +01:00
Bernhard Miklautz
7f3326d41c Fix compiler warnings
gcc 4.7.2
* warning: value computed is not used [-Wunused-value]
* warning: unused variable ‘oss’ [-Wunused-variable]
2015-03-25 17:38:21 +01:00
Bernhard Miklautz
3c7662517c hardening
Start to add missing checks for:
* *alloc
* *_New
2015-03-25 17:38:21 +01:00
Martin Fleisz
8d783bd2f0 Fix server side NLA 2015-03-23 08:33:14 +01:00
Marc-André Moreau
cb8e61cf99 libfreerdp-core: fix rdg.c header include 2015-03-19 12:13:37 -04:00
Marc-André Moreau
69f4d78785 libfreerdp-core: fix rdg.h header include 2015-03-19 12:08:30 -04:00
Marc-André Moreau
6202f48c12 libfreerdp-core: add configurable TSG/RGB fallback, fix edge cases 2015-03-19 11:44:47 -04:00
Marc-André Moreau
a2ff1e8348 Merge branch 'gateway' of https://github.com/dvincent-devolutions/FreeRDP into gateway 2015-03-19 09:41:50 -04:00
Denis Vincent
08a3d40ef8 libfreerdp-core: minor code corrections 2015-03-19 09:17:56 -04:00
Armin Novak
3a429e5add Removed unused define. 2015-03-19 14:17:48 +01:00
Armin Novak
48d8058f9b fixed log message arguments. 2015-03-19 11:11:43 +01:00
Armin Novak
56dc61cc06 Added error name and string functions.
Added new functions allowing to get a string representation of an error code
and a description of the error for connect and base error classes.
2015-03-19 11:05:16 +01:00
Denis Vincent
205ccb70c8 libfreerdp-core: added fallback to RPC. 2015-03-18 16:13:32 -04:00
Marc-André Moreau
1380895a2a libfreerdp-core: fix RDG http receive 2015-03-18 09:48:21 -04:00
Marc-André Moreau
3c4bee3d95 libfreerdp-core: fix RDG valgrind issues 2015-03-17 16:54:45 -04:00
Marc-André Moreau
dc913d9f2c libfreerdp-core: fix some RDG valgrind issues 2015-03-17 16:09:17 -04:00
Marc-André Moreau
360e2c5e4e libfreerdp-core: fix rdg event handles 2015-03-17 15:13:11 -04:00
Marc-André Moreau
bdf17450e5 Merge branch 'gateway' of https://github.com/dvincent-devolutions/FreeRDP into gateway 2015-03-17 14:54:04 -04:00
Denis Vincent
144d0d9b23 libfreerdp-core: Initial RDG support. 2015-03-17 14:54:16 -04:00
Marc-André Moreau
c21bff5415 Merge branch 'master' of github.com:FreeRDP/FreeRDP 2015-03-16 08:01:54 -04:00
Jean-Louis Dupond
ede7993fe8 libfreerdp-core: Initialize values correctly 2015-03-15 14:09:16 +01:00
Jean-Louis Dupond
8a0fe0861d fix size error introduced in commit 99b14815a5 2015-03-15 11:50:10 +01:00
Marc-André Moreau
afdd55fa81 Merge branch 'master' of github.com:FreeRDP/FreeRDP 2015-03-13 15:30:31 -04:00
Zhang Zhaolong
4b618852e4 core/gateway: fix memory leak of packet.
Signed-off-by: Zhang Zhaolong <zhangzl2013@126.com>
2015-03-13 11:26:22 +08:00
Zhang Zhaolong
93ae1d997b core: fix double close on fp.
Signed-off-by: Zhang Zhaolong <zhangzl2013@126.com>
2015-03-13 11:21:12 +08:00
Marc-André Moreau
5ab34dfa3e Merge pull request #2456 from zhangzl2013/fix-realloc
Fix incorrect usage of realloc
2015-03-12 07:33:27 -04:00
Zhang Zhaolong
99b14815a5 core: fix incorrect usage of realloc.
realloc can handle the case that its first parameter is NULL.

Signed-off-by: Zhang Zhaolong <zhangzl2013@126.com>
2015-03-11 13:40:20 +08:00
Marc-André Moreau
8ee4cbdffd Merge branch 'gateway' of https://github.com/dvincent-devolutions/FreeRDP 2015-02-26 09:08:56 -05:00
Marc-André Moreau
1416ef8017 libfreerdp-core: fix tsg receiving of text/html content 2015-02-24 16:39:00 -05:00
Denis Vincent
baab23fd14 libfreerdp-core: Make tsg out channel recycling event driven 2015-02-24 15:34:41 -05:00
bjcollins
d4a9a2d3a8 Remove override redirect flag for fullscreen with keyboard grab enabled. Window manager should always know about the main window.
Small cleanup of passing around decorations flag.
Limit PercentScreen to single monitor vs. entire desktop. IMO - this is better behavior in a multimonitor environment.

Handle fullscreen windows better:
1. Ensure that size hints are set to allow resizing before setting a window to fullscreen as some window managers do not behave properly.
2. Handle fullscreen toggles without destroying and recreating window.
3. Use NET_WM_STATE_FULLSCREEN Extended Window Manager Hint for fullscreen functionality
4. Use the NET_WM_FULLSCREEN_MONITORS Extended Window Manager Hint when appropriate
5. When a single monitor fullscreen is requested - use the current monitor(as determined from mouse location)
6. Handle cases where there is no local monitor at coordinate 0,0. The Windows server expect there to be a monitor at this location, so we maintain offset if necessary between our local primary monitor and the server side primary monitor located at 0,0.
2015-02-23 11:22:28 -06:00
Mike McDonald
6dd333c4c8 Modified virtual channel open (as a result of an MCS channel join) to do a case-insensitive comparison of the virtual channel name. 2015-02-23 09:24:43 -05:00
Norbert Federa
1fd5508afd Merge pull request #2416 from zavadovsky/transport_dead_end_fix
libfreerdp-core: fix dead-end state in transport_read_pdu()
2015-02-23 12:56:26 +01:00
Zavadovsky Yan
ab8aedd801 libfreerdp-core: add comments for previous fix 2015-02-23 13:57:46 +03:00
Zavadovsky Yan
2be175cec4 libfreerdp-core: fix dead-end state in transport_read_pdu()
Situation: we have fragmented TPKT PDU without two last bytes
(or one last byte - for fast-path) in network stack.

First call to transport_read_pdu() works normally, read
available bytes and exit with status 0 - no whole PDU readed.

Before second call this missed bytes arrive.
Optionally with next PDU.

In second call header parsing code unconditionally read this
two bytes(one byte) despite this is not header bytes.
And increase stream position, so stream now contains whole PDU.

This cause (pduLength - Stream_GetPosition(s)) calculation to be 0.
So transport_read_layer_bytes()-->transport_read_layer() return 0
and transport_read_pdu() exits with "not enough data is available"
status.

If next PDU isn't available next calls to transport_read_pdu()
give same result.
If next PDU arrive - (pduLength - Stream_GetPosition(s)) will be
less than 0. Stream position will grow, grow and grow on each call.
And transport_read_pdu() never signals that PDU is readed.

Caught on Android FreeRDP client with high RDP traffic (several MBytes/s).
2015-02-22 00:28:22 +03:00
Bernhard Miklautz
388d014888 core/tcp: set TCP_USER_TIMEOUT if available
Keepalive settings are usually (depending on the implementation) only
used if the TCP connection is idle.
If the network is interrupted/disconnected/... click or keyboard input
generates outgoing traffic therefore the connection isn't idle
anymore and keepalives might not be used causing the connection to
stay open and the client to stall.

Linux 2.6.36 added a TCP_USER_TIMEOUT TCP socket option that lets a
program specify the maximum time transmitted data may remain
unacknowledged before TCP will close the corresponding connection with
ETIMEDOUT.

Setting TCP_USER_TIMEOUT allows us to detect a network problem (like
cable disconnect) even if the connection isn't idle.
2015-02-20 13:22:01 +01:00
Marc-André Moreau
65b2842792 libfreerdp-core: improve RTS PDU receiving 2015-02-19 16:06:20 -05:00
Marc-André Moreau
b5f1958b69 libfreerdp-core: cleanup channel recycling 2015-02-19 15:06:57 -05:00
Marc-André Moreau
dfee7710e1 Merge branch 'gateway' of https://github.com/dvincent-devolutions/FreeRDP into gateway 2015-02-19 14:11:12 -05:00
Denis Vincent
3e90726bac libfreerdp-core: add TS Gateway out channel recycling support 2015-02-19 13:41:00 -05:00
Marc-André Moreau
44d06888bb libfreerdp-core: fix BIO leaks 2015-02-18 15:36:57 -05:00
Marc-André Moreau
2f4a305c67 libfreerdp-core: fix tsg_get_event_handles 2015-02-18 13:50:03 -05:00
Marc-André Moreau
e9fe5bace6 Merge branch 'master' of github.com:FreeRDP/FreeRDP 2015-02-18 13:42:28 -05:00
Norbert Federa
5f525e4f8d core: fix refreshRect/suppressOutput capabilities
refreshRectSupport and suppressOutputSupport of the General
Capability Set (MS-RDPBCGR 2.2.7.1.1) are server-only flags
that indicate whether the Refresh Rect or Suppress Output
PDUs are supported by the server.

Therefore in rdp_read_general_capability_set() we must only
change the respective settings if we are not in server mode.
2015-02-18 19:33:19 +01:00
Marc-André Moreau
f9885da81c Merge branch 'master' of github.com:FreeRDP/FreeRDP 2015-02-18 09:51:11 -05:00
Marc-André Moreau
f86f5bc252 Merge pull request #2397 from hardening/nego_fix2
Fix disconnection when negociation has failed
2015-02-18 09:50:46 -05:00
Marc-André Moreau
0e57706de5 libfreerdp-core: cleanup connect error codes, fix Win32 NLA 2015-02-17 21:01:27 -05:00
Marc-André Moreau
c2a107ac9d libfreerdp-core: initial support for tsg silent reauth 2015-02-17 16:36:01 -05:00
Marc-André Moreau
3b622d15d1 libfreerdp-core: refactor TsProxy* calls 2015-02-17 16:15:57 -05:00
Marc-André Moreau
b8b94327c8 libfreerdp-core: improve tsg debug output and reauth sequence 2015-02-17 14:34:42 -05:00
Marc-André Moreau
668b2c1811 libfreerdp-core: fix tsg buffer flushing 2015-02-17 10:54:39 -05:00
Marc-André Moreau
7639addb40 libfreerdp-core: partial tsg reauth support 2015-02-16 15:35:51 -05:00
Bernhard Miklautz
0b902eeb5d wtsapi: add WTSStartRemoteControlSessionEx
WTSStartRemoteControlSession doesn't allow to specify additional flags
therefore add a new extended version WTSStartRemoteControlSessionEx
with an additional "flags" parameter.

The following flags are defined:

REMOTECONTROL_FLAG_DISABLE_KEYBOARD - disable keyboard input
REMOTECONTROL_FLAG_DISABLE_MOUSE    - disable mouse input
REMOTECONTROL_FLAG_DISABLE_INPUT    - disable input (keyboard and mouse)
2015-02-16 12:16:54 +01:00
Marc-André Moreau
ffe24e8cfb libfreerdp-core: improve TSProxyCreateTunnelRequest 2015-02-15 18:22:49 -05:00
Marc-André Moreau
9c7b7ab561 libfreerdp-core: make NLA event-driven 2015-02-15 16:04:59 -05:00
Marc-André Moreau
eddfee56a3 libfreerdp-core: prepare client-side NLA for event-driven structure 2015-02-15 14:54:10 -05:00
Marc-André Moreau
ab5fdcc3f1 libfreerdp-core: NLA cleanup 2015-02-15 11:10:14 -05:00
Marc-André Moreau
991f7b347d libfreerdp-core: further abstract multiple connections used internally by tsg from rdpTransport 2015-02-15 10:06:17 -05:00
Marc-André Moreau
edfc5120b7 libfreerdp-core: replace rdpTcp by BufferedSocket BIO 2015-02-14 10:14:13 -05:00
Marc-André Moreau
e904195e49 libfreerdp-core: more rdpTcp refactoring 2015-02-13 16:51:08 -05:00
Marc-André Moreau
e241330daf libfreerdp-core: rewrite tls_write_all to use front BIO only 2015-02-13 16:02:37 -05:00
Marc-André Moreau
c001a69d50 libfreerdp-core: move wait_read/wait_write operations under BIO layer 2015-02-13 15:22:27 -05:00
Marc-André Moreau
b7a619ff8a libfreerdp-core: move some rdpTcp operations under BIO layer 2015-02-13 14:26:02 -05:00
David FORT
bb9ba34f1d Fix disconnection when negociation has failed
This patch fixes a bug with mstsc connecting to a RDP security only FreeRDP server.
It seems like the mstsc shipped with Windows Seven considers packets after the nego_failure
packet as an error. So after trying to do TLS, depending on the timing, mstsc can print an
error message instead of retrying to connect with RDP security. With this patch, we
don't send the MCS disconnect message when the negociation has failed.
2015-02-13 18:25:50 +01:00
Marc-André Moreau
69b93c322d libfreerdp-core: fix transport crash, reduce rdpTcp usage 2015-02-13 09:27:54 -05:00
Marc-André Moreau
3e414f1840 libfreerdp-core: fix server-side transport_attach crash 2015-02-13 08:41:47 -05:00
Mike McDonald
07a05ae80f Modified server side code to handle an older version of TS_RFX_ICAP [version 0.9 (0x0009), tileSize 128 (0x0080)] sent by older clients. 2015-02-12 22:17:16 -05:00
Marc-André Moreau
889ccefe0d libfreerdp-core: remove TlsIn/TlsOut from rdpTransport 2015-02-12 16:22:25 -05:00
Marc-André Moreau
0d85dfd395 libfreerdp-core: handle TCP/TLS connection at TSG RPC channel level 2015-02-12 14:40:26 -05:00
Marc-André Moreau
4ecff39eb6 libfreerdp-core: more tsg in/out channel refactoring 2015-02-12 14:08:38 -05:00
Marc-André Moreau
8f2b2be9f2 libfreerdp-core: integrate new RTS pdu functions from denis 2015-02-12 13:14:43 -05:00
Marc-André Moreau
c92e82b3dc libfreerdp-core: improve TSG virtual connection and channel management 2015-02-12 12:03:15 -05:00
Marc-André Moreau
d330570e62 Merge branch 'master' of github.com:FreeRDP/FreeRDP 2015-02-12 10:15:14 -05:00
Marc-André Moreau
9263e42120 Merge pull request #2385 from hardening/nego_fix
Fix server-side protocol negociation
2015-02-12 10:12:01 -05:00
Martin Haimberger
b302da2e92 wtsapi: added handler for LogonUser and LogoffUser 2015-02-12 01:31:00 -08:00
David FORT
6a8d21cab9 Fix server-side protocol negociation
Before this patch, RDP security was (wrongly) the fallback when negociating a
security protocol between the client and the server. For example when a client
was claiming TLS-only when connecting to a FreeRDP based-server with RDP security only,
the result of the negociation was that the server started to do RDP security.
The expected behaviour is to send a nego failure packet with error code
SSL_NOT_ALLOWED_BY_SERVER. This patch fixes this.

We also try to handle all cases of failed negociation and return the corresponding
error code.
2015-02-11 21:38:32 +01:00
Marc-André Moreau
75cad064f1 libfreerdp-core: refactor tsg virtual connection, in/out channels 2015-02-11 15:26:22 -05:00
Marc-André Moreau
70fab69347 libfreerdp-core: gateway connection refactoring 2015-02-11 14:27:29 -05:00
Marc-André Moreau
aa8b843250 libfreerdp-core: move stuff down from transport to tsg layer 2015-02-11 11:57:02 -05:00
Marc-André Moreau
46724b0c75 libfreerdp-core: fix tsg crash on disconnect 2015-02-11 10:57:14 -05:00
Marc-André Moreau
94494511cc Merge branch 'master' of github.com:FreeRDP/FreeRDP 2015-02-11 10:05:33 -05:00
David FORT
5c2d5337c0 Fix socket leak when transport is disconnected 2015-02-11 15:47:43 +01:00
David FORT
58f33247bd Fix compilation with valgrind helpers 2015-02-11 15:23:14 +01:00
Marc-André Moreau
22ac46957a xfreerdp: fix egfx multimonitor support 2015-02-10 16:32:07 -05:00
Marc-André Moreau
9b9fbd2ab1 xfreerdp: fix fullscreen mode 2015-02-10 15:15:30 -05:00
Armin Novak
c66d0ccff8 Fixed codecs_free 2015-02-09 17:35:41 +01:00
Armin Novak
e162784e34 Fixed resource cleanup on disconnect. 2015-02-09 17:33:43 +01:00
Marc-André Moreau
3258c887a4 libfreerdp-core: add channel reconnect 2015-02-06 17:35:14 -05:00
Marc-André Moreau
b2d0aa128f libfreerdp-core: refactor client info pdu functions 2015-02-06 16:55:21 -05:00
Marc-André Moreau
9a8f877396 libfreerdp-core: fix auto reconnect cookie security verifier computation 2015-02-06 16:37:28 -05:00
Marc-André Moreau
70e2862c50 libfreerdp-core: improve client core info debug output 2015-02-06 15:44:29 -05:00
Marc-André Moreau
fa06c4d401 libfreerdp-core: improve reconnection 2015-02-06 14:21:26 -05:00
Marc-André Moreau
82d58086db xfreerdp: partial reconnect fixes 2015-02-05 17:01:56 -05:00
Marc-André Moreau
a4979456e5 Merge branch 'master' of github.com:FreeRDP/FreeRDP into gateway 2015-02-04 11:36:05 -05:00
Marc-André Moreau
8f8676a20e Merge pull request #2355 from xsumbe00/master
Fixes some build issues on Solaris 11.
2015-02-04 11:34:02 -05:00
Marc-André Moreau
4af1261132 Merge pull request #2350 from giox069/master
Fix freerdp_channels_free for clients with multiple active connections
2015-02-04 11:27:41 -05:00
Marc-André Moreau
5fbcdf5b3d libfreerdp-core: make tsg rpc connection event-driven, fix race condition on connection 2015-02-04 11:18:27 -05:00
Marc-André Moreau
f8259f94c5 libfreerdp-core: add event-driven RTS connection code 2015-02-03 20:39:47 -05:00
Marc-André Moreau
13d4fa74c4 libfreerdp-core: start event-driven gateway http code 2015-02-03 17:17:17 -05:00
Marc-André Moreau
1bf0e2ee03 libfreerdp-core: add more IN/OUT gateway channel states 2015-02-03 16:33:45 -05:00
Petr Sumbera
b09d865d5c Better to use HAVE_SYS_FILIO_H when we already have it. 2015-02-03 13:29:35 -08:00
Marc-André Moreau
7b25f9130b libfreerdp-core: improve error handling in ts gateway 2015-02-03 14:44:31 -05:00
Hardening
6bf23c1e35 Merge pull request #2358 from nfedera/fix-2015-02-03-01
core/fastpath: removed flawed slow-path conversion
2015-02-03 17:22:21 +01:00
Hardening
aed323e6c2 Merge pull request #2356 from nfedera/fix-2015-02-02-01
core/capabilities: remove misplaced/useless code
2015-02-03 17:15:51 +01:00
Norbert Federa
4c4019203a core/fastpath: removed flawed slow-path conversion
Commit 0357a38e31 modified the function
fastpath_send_update_pdu() to check if the desired update is possible
by checking the payload size against the computed maxLength and the
clients's advertised max request size.
If the check failed that commit added a workaround which simply
copied the payload to a slow path updade.
This workaround is totally flawed and causes protocol errors:
- the fast path update code is not checked and required data format
  conversions are missing
- depending on the fast path update code rdp_send_data_pdu() would
  have to be called with differend data pdu type values but the
  workaround always uses DATA_PDU_TYPE_UPDATE
- the workaround does not check if the total size would exceed
  the maximum possible size for a slow path update

The check if a fast path output is actually possible with the
passed parameters is basically a good idea.
However, if that check fails it would only indicate an error in
the server implementation who must not generate updates that
exceed the client's max request size.
Even though a slow-path conversion would be possible there is
much more involved than simply copying the payload stream.
In addition it is highly doubtful if there is a benefit at all.
Even the oldest rdesktop and windows ce clients do support fast
path and although some lack the multi-fragment update capability
we cannot really send larger updates using slow-path outputs.

For the reasons elucidated above, I have removed the workaround
but kept a modified version of the check if a fast-path output
is possible at all.
2015-02-03 13:51:35 +01:00
Marc-André Moreau
5aea07d401 libfreerdp-core: add better state machine transitions to ts gateway 2015-02-02 18:50:26 -05:00
Marc-André Moreau
e0b0c77ecb libfreerdp-core: improve http parsing 2015-02-02 17:16:32 -05:00
Petr Sumbera
7fee867447 Added ifdef to previous commit. 2015-02-02 10:59:51 -08:00
Norbert Federa
dd9f15450a core/capabilities: remove misplaced/useless code
Commit 0357a38e31 has added some code
without any effect.
That commit added code to rdp_read_capability_sets() to check if
CAPSET_TYPE_MULTI_FRAGMENT_UPDATE was not received which caused
settings->MultifragMaxRequestSize to be set to 0.

- this was done in the wrong place because we do these kind
  of checks in rdp_recv_confirm_active() by consulting the
  variable settings->ReceivedCapabilities[]
- the code had no effect at all because MultifragMaxRequestSize gets
  set to FASTPATH_FRAGMENT_SAFE_SIZE in rdp_recv_confirm_active()
  if the CAPSET_TYPE_MULTI_FRAGMENT_UPDATE was not received.
2015-02-02 18:25:10 +01:00
Marc-André Moreau
e4f99834d0 libfreerdp-core: make tsg threadless 2015-02-02 11:50:56 -05:00
Petr Sumbera
17df42e4b5 Fixes some build issues on Solaris 11. 2015-02-02 08:48:54 -08:00
Marc-André Moreau
bfe1c31529 libfreerdp-core: remove receive queue, make tsg connection sequence more event-driven 2015-02-02 08:19:07 -05:00
Bernhard Miklautz
d625edbe97 gfx/pointer: add support to set pointer
Extend rdp_pointer with function SetPosition. Can then be used by
clients support setting pointer by server which might be used in
shadowing scenarios.
2015-02-02 10:57:31 +01:00
Marc-André Moreau
4239a1d4f4 libfreerdp-core: remove TS Gateway send queue 2015-02-01 20:47:43 -05:00
Marc-André Moreau
4eeabba933 libfreerdp-core: restructure RPC connection sequence 2015-02-01 18:50:21 -05:00
Marc-André Moreau
90a429e43c libfreerdp-core: refactor tsg connection sequence towards better state machine usage 2015-02-01 17:55:24 -05:00
Marc-André Moreau
0a97a5fc4e libfreerdp-core: fix possible lost signal in tsg_connect 2015-02-01 17:06:50 -05:00
Marc-André Moreau
4f173ae52a libfreerdp-core: remove usage of magic 60-byte pad in TsProxyCreateTunnelWriteRequest 2015-02-01 15:58:32 -05:00
Marc-André Moreau
9406ac188c libfreerdp-core: use ringbuffer for TS Gateway receive pipe 2015-02-01 13:09:28 -05:00
Giovanni Panozzo
7ceafe190e Fix channels_free for multiple connected clients
When a client disconnects from a server and its channel structures are removed, the global hash g_OpenHandles should not be destroyed. Only freed channels must be removed from the hash.
2015-02-01 10:57:54 +01:00
Marc-André Moreau
85191391d5 libfreerdp-core: simplify TS Gateway RPC fragment receiving 2015-01-31 16:56:25 -05:00
Marc-André Moreau
5cdc464933 libfreerdp-core: warn but do not fail in freerdp_tcp_set_keep_alive_mode 2015-01-30 11:34:09 -05:00
Marc-André Moreau
7c6948cd5c xfreerdp: make use of freerdp_get_event_handles 2015-01-30 09:47:02 -05:00
Marc-André Moreau
3a906caa4a freerdp: add event handle usage instead of file descriptors 2015-01-29 22:57:58 -05:00
Marc-André Moreau
ef71181897 libfreerdp-core: fix Win32 gateway authentication 2015-01-29 14:07:02 -05:00
Marc-André Moreau
b387708069 libfreerdp-core: fix Win32 socket event handle 2015-01-29 11:35:52 -05:00
Marc-André Moreau
bb67968141 libfreerdp-core: cleanup transport debug output 2015-01-28 15:37:20 -05:00
Marc-André Moreau
977cd21919 libfreerdp-core: don't enable GatewayBypassLocal by default 2015-01-28 15:16:31 -05:00
Marc-André Moreau
a9df86ab16 libfreerdp-core: update gateway code for Windows 2015-01-28 14:54:03 -05:00
Marc-André Moreau
5bf8b1509e libfreerdp-core: improve socket BIO handling 2015-01-28 13:46:17 -05:00
Marc-André Moreau
32a991c165 libfreerdp-core: move socket event and nonblock options to socket BIO 2015-01-27 21:18:26 -05:00
Armin Novak
34b700dd0f Preventing channels from being loaded twice
Skipping channels already loaded in freerdp_channels_client_load
This prevents channels already loaded in a context to be added a
second time to the channel list.
2015-01-20 18:01:33 +01:00
Marc-André Moreau
4fe932f21f libfreerdp-core: cleanup redirection debug output 2015-01-20 10:46:32 -05:00
Armin Novak
cbadeb4dd3 Fixed variable initialisation and cleanup. 2015-01-20 12:31:11 +01:00
Armin Novak
b07cded5d2 Added CHANNEL_EVENT_DISCONNECTED handling.
Additional error checks and logging.
2015-01-20 11:58:45 +01:00
Armin Novak
015bfeb897 Prettiefied WLog messages. 2015-01-20 11:08:41 +01:00
Armin Novak
4f42a7955f Prettiefied WLog messages. 2015-01-20 11:06:26 +01:00
Norbert Federa
344362a8a3 clients: fix "focus in event" issues
The input->FocusInEvent callback implementations (normal and fast-path) have
always sent the mouse position even if the pointer was outside of the freerdp
client area. In addition xfreerdp used the wrong pointer coordinates which
were relative to the root window instead of its own.
On focus-in the pointer position must only be sent if the pointer is
currently within the program's client area. However, the clients had no way
to pass that information to input->FocusInEvent which required an API change.

- removed mouse pointer x, y parameters from input interface's FocusInEvent
- clients are responsible to call input->MouseEvent on focus-in if necessary
- fixed xfreerdp and wfreerdp accordingly
2015-01-16 18:40:57 +01:00
Marc-André Moreau
fa538911ca libfreerdp-core: fix build on Windows 2015-01-15 15:04:35 -05:00
Marc-André Moreau
701186e461 libfreerdp-core: silence false error on server disconnect 2015-01-15 14:52:35 -05:00
Marc-André Moreau
d8ddfd83c3 libfreerdp-core: parse gateway idle timeout + final status code 2015-01-14 16:49:21 -05:00
Marc-André Moreau
94f828a873 libfreerdp-core: fix detection of TS Gateway transport disconnection 2015-01-14 15:39:35 -05:00
Marc-André Moreau
580de466fc Merge branch 'master' of github.com:FreeRDP/FreeRDP 2015-01-14 11:24:13 -05:00
Marc-André Moreau
620694c10a Merge pull request #2301 from akallabeth/disconnect_fix
Disconnect / Reconnect fix
2015-01-14 08:56:54 -05:00
Armin Novak
b3eafca85b Fixed return type for nego_transport_connect and nego_transport_disconnect. 2015-01-14 11:35:19 +01:00
Marc-André Moreau
f79deaff7b libfreerdp-core: partial OUT channel recycling support 2015-01-13 16:35:34 -05:00
Marc-André Moreau
43fe94d939 libfreerdp-core: fix identification of OUT R1/A2 RTS PDU 2015-01-13 15:01:07 -05:00
Marc-André Moreau
fc38dcc775 libfreerdp-core: gateway cleanup 2015-01-13 13:50:46 -05:00
Martin Haimberger
bba342a6be added set_error_info function
if an error_info is set, a TS_SET_ERROR_INFO_PDU
will be sent to the client on disconnect with
the error_info
2015-01-13 08:09:36 -08:00
Armin Novak
b5281b7877 Fixed broken state reset, now gateway works again. 2015-01-13 16:35:06 +01:00
Armin Novak
5f2105b930 Added prototype for freerdp_client_disconnect. 2015-01-13 12:44:16 +01:00
Armin Novak
524e4635fd Fixed typos.
gdi_free now done on disconnect.
2015-01-13 12:00:51 +01:00
Armin Novak
600074373c Fixed rdp_reset. 2015-01-12 13:47:04 +01:00
Armin Novak
e3df1d3d5b Fixed freerdp_disconnect and freerdp_reconnect. 2015-01-12 13:44:34 +01:00
Armin Novak
e0139fc4d8 Added nego_disconnect. 2015-01-12 13:44:04 +01:00
Armin Novak
8a1f9c321c Added nego_disconnect function. 2015-01-12 13:43:29 +01:00
Armin Novak
9274de4921 Fixed rdp_client_disconnect and rdp_reset. 2015-01-12 13:36:38 +01:00
Armin Novak
5d3091bd1c Fixed transport cleanup on disconnect. 2015-01-12 13:32:59 +01:00
Norbert Federa
765b25933e license: fix for corrupted licensing packets
Since commit a228952 FreeRDP generates corrupt licensing packets if the rdp
security layer is used and the peer did not indicate that it is capable of
processing encrypted licensing packets:
That commit changed rdp->sec_flags after the rdp stream was already initialized
with encryption enabled which placed the PDU payload at an incorrect offset.

Instead of directly modifying the rdp->sec_flags this patch temporarily
disables rdp->do_crypt during rdp stream initialization if the client has not
advertised support for encrypted licensing packets.
2015-01-12 11:31:18 +01:00
Marc-André Moreau
51554ff16c channels: patch rdpdr/smartcard valgrind leaks, fix hang on disconnect 2014-12-28 14:56:13 -05:00
Marc-André Moreau
b552aa9363 libfreerdp-core: add support for multiple redirection target addresses 2014-12-27 18:53:27 -05:00
Marc-André Moreau
772a0aaf0c libfreerdp-core: fix TCP connection timeout (non-Windows) 2014-12-27 16:48:32 -05:00
Marc-André Moreau
27a8e50e60 channels: fix drdynvc, patch memory leaks 2014-12-27 15:20:29 -05:00
Marc-André Moreau
6c2ebb2b58 channels: redirection valgrind fixes 2014-12-27 13:50:50 -05:00
Marc-André Moreau
9dd77ae14a libfreerdp-core: add usage of TargetNetAddresses in ip-based redirection when hostname resolution fails 2014-12-26 13:49:25 -05:00
Marc-André Moreau
d5edfa4721 Merge branch 'master' of github.com:FreeRDP/FreeRDP 2014-12-21 14:22:09 -05:00
Vic Lee
7449abefb1 libfreerdp-core: server synchronized access to dvc channel seq. 2014-12-19 12:31:36 +08:00
Bernhard Miklautz
78d68598ed core: fix problem with data for unknown channel
Some buggy server(s) send data for channels that weren't announced or
negotiated. When processing this data FreeRDP had a problem and always
used the last channel in the channels list even if it wasn't responsible
for the data. Depending on how the channel handled the data this could
lead to different kind of problems and also segmentation faults.

Now data for unknown channels is ignored and not processed further.
2014-12-16 16:27:55 +01:00
Marc-André Moreau
736bcf2bd6 libfreerdp-core: fix async input mode for FocusInEvent, KeyboardPauseEvent 2014-12-15 11:35:35 -05:00
Marc-André Moreau
9b28562cc1 libfreerdp-core: fix faulty rdpTransport server-side initialization 2014-12-15 10:23:06 -05:00
Marc-André Moreau
e2f377ae11 libfreerdp-core: fix TSG thread shutdown and input freeze problem 2014-12-15 09:42:04 -05:00
Marc-André Moreau
74bef0edca Merge pull request #2275 from awakecoding/master
TS Gateway Fixes
2014-12-12 09:33:52 -05:00
Marc-André Moreau
aa23c4eaaa libfreerdp-core: fix random TS Gateway disconnects with async modes 2014-12-12 09:08:39 -05:00
Norbert Federa
939f1c639a Standard RDP Security Layer Levels/Method Overhaul
[MS-RDPBCGR] Section 5.3 describes the encryption level and method values for
standard RDP security.

Looking at the current usage of these values in the FreeRDP code gives me
reason to believe that there is a certain lack of understanding of how these
values should be handled.

The encryption level is only configured on the server side in the "Encryption
Level" setting found in the Remote Desktop Session Host Configuration RDP-Tcp
properties dialog and this value is never transferred from the client to the
server over the wire.
The possible options are "None", "Low", "Client Compatible", "High" and
"FIPS Compliant". The client receices this value in the Server Security Data
block (TS_UD_SC_SEC1), probably only for informational purposes and maybe to
give the client the possibility to verify if the server's decision for the
encryption method confirms to the server's encryption level.
The possible encryption methods are "NONE", "40BIT", "56BIT", "128BIT" and
"FIPS" and the RDP client advertises the ones it supports to the server in the
Client Security Data block (TS_UD_CS_SEC).
The server's configured encryption level value restricts the possible final
encryption method.
Something that I was not able to find in the documentation is the priority
level of the individual encryption methods based on which the server makes its
final method decision if there are several options.
My analysis with Windows Servers reveiled that the order is 128, 56, 40, FIPS.
The server only chooses FIPS if the level is "FIPS Comliant" or if it is the
only method advertised by the client.

Bottom line:
* FreeRDP's client side does not need to set settings->EncryptionLevel
(which was done quite frequently).
* FreeRDP's server side does not have to set the supported encryption methods
list in settings->EncryptionMethods

Changes in this commit:

Removed unnecessary/confusing changes of EncryptionLevel/Methods settings

Refactor settings->DisableEncryption
* This value actually means "Advanced RDP Encryption (NLA/TLS) is NOT used"
* The old name caused lots of confusion among developers
* Renamed it to "UseRdpSecurityLayer" (the compare logic stays untouched)

Any client's setting of settings->EncryptionMethods were annihilated
* All clients "want" to set all supported methods
* Some clients forgot 56bit because 56bit was not supported at the time the
code was written
* settings->EncryptionMethods was overwritten anyways in nego_connect()
* Removed all client side settings of settings->EncryptionMethods
The default is "None" (0)
* Changed nego_connect() to advertise all supported methods if
settings->EncryptionMethods is 0 (None)
* Added a commandline option /encryption-methods:comma separated list of the
values "40", "56", "128", "FIPS". E.g. /encryption-methods:56,128
* Print warning if server chooses non-advertised method

Verify received level and method in client's gcc_read_server_security_data
* Only accept valid/known encryption methods
* Verify encryption level/method combinations according to MS-RDPBCGR 5.3.2

Server implementations can now set settings->EncryptionLevel
* The default for settings->EncryptionLevel is 0 (None)
* nego_send_negotiation_response() changes it to ClientCompatible in that case
* default to ClientCompatible if the server implementation set an invalid level

Fix server's gcc_write_server_security_data
* Verify server encryption level value set by server implementations
* Choose rdp encryption method based on level and supported client methods
* Moved FIPS to the lowest priority (only used if other methods are possible)

Updated sample server
* Support RDP Security (RdpKeyFile was not set)
* Added commented sample code for setting the security level
2014-12-12 02:17:12 +01:00
Marc-André Moreau
cc2321d359 libfreerdp-core: fix leak and use after free in tsg ListDictionary usage 2014-12-11 17:08:22 -05:00
Marc-André Moreau
d8e10ac04a freerdp: patch leaks reported by valgrind when using TS Gateway 2014-12-11 11:25:34 -05:00
Bernhard Miklautz
7b413fb951 nego: print message when bypassing gateway
When "detect" is used as gateway usage method (which is the default)
it is tried to by-pass gateway connection for local hosts.
The detection might take some time therefore print a message that people
are aware that a detection is tried.

Fixes #2171
2014-12-08 19:00:05 +01:00
Norbert Federa
3baaa9a523 Merge pull request #2256 from llyzs/llyzs
libfreerdp-core: enable ipv6 listener.
2014-12-05 16:06:23 +01:00
Vic Lee
bcee2ec3cd libfreerdp-core: enable ipv6 listener. 2014-12-05 10:06:35 +08:00
Marc-André Moreau
fdd2dc7601 freerdp: patch valgrind leaks, cleanup 2014-12-03 14:17:27 -05:00
Marc-André Moreau
01ac15a879 libfreerdp-core: fix crash on failed redirect 2014-12-03 11:48:27 -05:00
Marc-André Moreau
6ccce86140 Merge branch 'master' of github.com:FreeRDP/FreeRDP
Conflicts:
	winpr/libwinpr/thread/thread.c
2014-12-03 10:10:50 -05:00
Marc-André Moreau
c17a831367 Merge pull request #2240 from nfedera/fix-2014-12-01-01
xfreerdp: pinch/pan fixes and smart-sizing
2014-12-02 14:04:49 -05:00
Norbert Federa
25f66d2e6d xfreerdp: added smart sizing, mt gesture fixes
- removed setting ScalingFactor
- added settings SmartSizingWidth and SmartSizingHeight
- changed option /smart-sizing to optionally support <width>x<height>
- consolidated transformation of input event coordinates
- rdp8 gfx ignored scaling and panning offsets: fixed
- never resize window on panning/pinching
- simplified keyboard multitouch gesture debugging emulation
- disabled keyboard multitouch gesture emulation debug code via define
2014-12-01 11:56:44 +01:00
Bernhard Miklautz
e139bd0fb8 core client side: set flag to crypt license
Client side code always tells the server that it is capable of processing
encrypted licensing packages (SEC_LICENSE_ENCRYPT_SC) but didn't set
the recently added flag to indicate that.

Fixes #2196
2014-12-01 11:12:34 +01:00
Mario Lombardo
3c634f91db Rename tcp-functions as they are conflicting with qemu functions 2014-11-29 21:14:39 +01:00
Marc-André Moreau
a323a0823d Merge branch 'master' of github.com:FreeRDP/FreeRDP 2014-11-28 11:23:53 -05:00
Bernhard Miklautz
daa3e7c7f8 tsg: fix possible free of initialized memory 2014-11-27 15:08:07 +01:00
Bernhard Miklautz
5066a5e455 tsg: rpc_send_enqueue_pdu always free buffer
rpc_send_enqueue_pdu returns -1 on error but the type of error isn't
distinguishable. Therefore make sure that the buffer gets always freed.
The only exception to this is when the pdu was already queued. Then the
dequeuing function should take care of freeing the buffer when
processing the pdu.
2014-11-27 14:39:47 +01:00
Bernhard Miklautz
96ae2df5a4 tsg: unwind recursion in tsg_read 2014-11-26 19:46:32 +01:00
Bernhard Miklautz
c0525574c8 transport: handle all return values of tsg_read
tsg_read can also return 0 which means that no data (complete PDU) is
currently available. This case wasn't handled properly.

Fixes #2056
2014-11-26 19:46:32 +01:00
Bernhard Miklautz
81a6c43938 tsg: fix segfault
Revert false positive from commit 585d9101b7
buffer shouldn't be freed since it is set and used in a stream.
2014-11-26 19:46:32 +01:00
Marc-André Moreau
d95af00117 Merge branch 'awakecoding' of github.com:vworkspace/FreeRDP 2014-11-25 11:20:07 -05:00
Marc-André Moreau
1c88822ccb libfreerdp-core: treat GCC data block 0xC009 as CS_MULTITRANSPORT 2014-11-19 21:00:28 -05:00
Marc-André Moreau
3f5aa863cb libfreerdp-core: fix server-side activated state 2014-11-19 14:21:23 -05:00
Marc-André Moreau
d6e6db05e9 libfreerdp-core: sanitize NSCodec capabilities 2014-11-19 09:39:47 -05:00
Marc-André Moreau
8a7a71a7b6 Merge pull request #2213 from akallabeth/wlog_callback_appender
Wlog callback appender
2014-11-17 09:41:58 -05:00
Armin Novak
e61acfe6b4 Fixed null pointer dereference. 2014-11-17 01:26:31 +01:00
Armin Novak
bc963c43d8 Fixed double free. 2014-11-17 01:13:47 +01:00
Armin Novak
727a7a9aed Fixed memory leaks. 2014-11-17 01:08:38 +01:00
Armin Novak
9ea898a3c2 Fixed memory leaks. 2014-11-17 01:07:07 +01:00
Armin Novak
2958a2c0c5 Fixed memory leaks. 2014-11-17 01:00:55 +01:00
Armin Novak
037c612c33 Fixed memory leak. 2014-11-17 00:58:43 +01:00
Armin Novak
458f948c7a Fixed memory leak. 2014-11-17 00:41:06 +01:00
Armin Novak
aa92017d86 Fixed memory leak. 2014-11-17 00:36:50 +01:00
Armin Novak
a594a15220 Fixed memory leaks. 2014-11-17 00:28:17 +01:00
Armin Novak
bde7b156a8 Fixed uninitialized data warning. 2014-11-17 00:05:12 +01:00
Armin Novak
9e5be6f7e8 Fixed API nonnull warning. 2014-11-17 00:00:09 +01:00
Armin Novak
585d9101b7 Fixed memory leaks. 2014-11-16 23:06:03 +01:00
Armin Novak
8d4589b1e1 Replaced fprintf error messages with WLog. 2014-11-16 12:21:38 +01:00
Marc-André Moreau
496ce10637 Merge branch 'master' of github.com:FreeRDP/FreeRDP 2014-11-15 12:37:29 -05:00
Norbert Federa
be7a10e660 core: use zero padding in suppress output pdu
Some legacy rdp servers seem to expect a zero padding after the
allowDisplayUpdates byte, probably because they incorrectly parse the
value as uint32.
2014-11-14 11:25:05 +01:00
Marc-André Moreau
ddedc574f3 freerdp: remove tcp, uds utils 2014-11-12 14:06:34 -05:00
Marc-André Moreau
0e7c95c421 freerdp: remove deprecated eventing system 2014-11-12 13:18:18 -05:00
Marc-André Moreau
589c21d819 libfreerdp-utils: remove rail utils 2014-11-12 10:18:53 -05:00
Marc-André Moreau
68ee5df7d9 winpr: fix build warnings 2014-11-11 11:21:34 -05:00
Marc-André Moreau
a48ed7239d Merge branch 'master' of github.com:FreeRDP/FreeRDP
Conflicts:
	libfreerdp/core/update.c
2014-11-11 09:55:48 -05:00
Marc-André Moreau
e685acdbc5 Merge pull request #2194 from hopToDev/master
Added SIGPIPE handling for iOS.
2014-11-11 09:43:38 -05:00
Martin Fleisz
53f38d3e89 Merge pull request #2189 from llyzs/llyzs
Support Continuous Auto-Detection.
2014-11-11 08:42:48 +01:00
Vic Lee
36f0281ff8 libfreerdp-core: auto-detect defines. 2014-11-11 10:14:44 +08:00
Mehul Dhorda
256eab682b Added SIGPIPE handling for iOS. 2014-11-10 11:52:29 -08:00
Marc-André Moreau
b7c6e9c050 Merge pull request #2188 from hopToDev/master
Ignore T.128 FlowPDU in Share Control header
2014-11-10 13:54:12 -05:00
Mike McDonald
7d5963a1e6 Fixed crash caused by trying to cast and dereference a NULL hChannel. 2014-11-07 18:06:14 -05:00
Mehul Dhorda
e8b8ae1900 Added comment to clarify flow control PDU fields. 2014-11-07 14:58:58 -08:00
Vic Lee
8eaeeebecc libfreerdp-core: support continuous auto-detection. 2014-11-07 16:18:49 +08:00
Marc-André Moreau
a538e791b3 shadow: add improved pointer updates 2014-11-06 17:25:41 -05:00
Mehul Dhorda
29c42cfc0e Fixed incorrect values for PDUTypeFlow.
Swapped values for PDU_TYPE_FLOW_RESPONSE and PDU_TYPE_FLOW_STOP to
match the T.128 spec.
2014-11-06 10:08:58 -08:00
Mehul Dhorda
f64d620a3b Ignore T.128 FlowPDU in Share Control header
According to the Microsoft RDP specification, T.128 flow control PDUs
should be ignored when reading Share Control headers.
(http://msdn.microsoft.com/en-us/library/cc240576.aspx). This patch
checks if we got a flow control PDU (length = 0x8000) and advances the
stream to ignore the PDU.
2014-11-05 11:32:46 -08:00
Marc-André Moreau
c5c9423ccf winpr: fix Win32 build warnings 2014-11-04 10:44:55 -05:00
Hardening
e04f90eada Offer to disable bulk compression when using remoteFx
This patch adds a skipCompression field in surface commands struct so that
we can disable bulk compression with remoteFx.
2014-11-04 16:14:53 +01:00
Vic Lee
18428a43d0 libfreerdp-core: distinguish continuous/connect-time autodetect. 2014-11-04 13:41:04 +08:00
Hardening
7b108f1aa8 Merge pull request #2141 from zhangzl2013/polyline
fix polyline.
2014-10-31 22:15:13 +01:00
Norbert Federa
62dbcac0c7 xfreerdp: fix glyph index primary drawing order
The fOpRedundant field of the GlyphIndex primary drawing order
(MS-RDPEGDI, chapter 2.2.2.2.1.1.2.13) was neglected which resulted in some
severe text rendering errors.
2014-10-29 20:56:26 +01:00
Vic Lee
152d525a05 libfreerdp-core: server-side auto-detect feature. 2014-10-29 00:49:49 +08:00
Vic Lee
0e7797ffca libfreerdp-core: server-side mcs message channel. 2014-10-29 00:49:27 +08:00
Marc-André Moreau
02646b349f Merge branch 'master' of github.com:FreeRDP/FreeRDP
Conflicts:
	libfreerdp/core/gcc.c
2014-10-25 10:29:06 -04:00
Norbert Federa
9c2e90df7d core: fix pointer caps, slowpath kbd and a gcc fix
* According to MS-RDPBCGR 2.2.7.1.5 the pointerCacheSize is optional
  and its absence or a zero value indicates missing client support for
  the New Pointer Update.

* Added and fixed some comments regarding the meaning of the KBDFLAGS_DOWN
  keyboard flag and how it is currently used in the code.
  "Fixed" the slow path keyboard input to generate the same keyboard flags
  as the corresponding fast path code.

* Some arbitrary value was used for the ConnectPDULength in the GCC
  Conference Create Response. According to MS-RDPBCGR 4.1.4 this value must
  be ignored by the client so we encode a zero value instead.
2014-10-22 12:27:07 +02:00
Bernhard Miklautz
4dcc0957f1 Fix build on windows
Problem was introduces by a non pull request push for ipv6 support
2014-10-22 12:16:40 +02:00
Mike McDonald
5fa6fa7013 Merge branch 'master' of https://github.com/awakecoding/FreeRDP into awakecoding-staging 2014-10-20 14:42:46 -04:00
Jean-Louis Dupond
0dc0e01568 Add ipv6 client support 2014-10-17 12:08:39 +02:00
Marc-André Moreau
1d47b16f3c Merge branch 'master' of github.com:FreeRDP/FreeRDP 2014-10-14 20:59:37 -04:00