Browse Source

Merge branch 'master' into dev

Source commit: 2089e3599f48c335fc82c135c37e503ab99f8023
Martin Prikryl 3 năm trước cách đây
mục cha
commit
a19db8e599

+ 2 - 0
source/putty/defs.h

@@ -129,6 +129,8 @@ typedef struct Seat Seat;
 typedef struct SeatVtable SeatVtable;
 typedef struct SeatPromptResult SeatPromptResult;
 
+typedef struct cmdline_get_passwd_input_state cmdline_get_passwd_input_state;
+
 typedef struct TermWin TermWin;
 typedef struct TermWinVtable TermWinVtable;
 

+ 7 - 0
source/putty/proxy/proxy.c

@@ -238,6 +238,13 @@ static void proxy_negotiate(ProxySocket *ps)
                                 #endif
                                 );
         ps->pn->reconnect = false;
+        /* If the negotiator has asked us to reconnect, they are
+         * expecting that on the next call their input queue will
+         * consist entirely of data from the _new_ connection, without
+         * any remaining data buffered from the old one. (If they'd
+         * wanted the latter, they could have read it out of the input
+         * queue before asking us to close the connection.) */
+        bufchain_clear(&ps->pending_input_data);
         } // WINSCP
     }
 

+ 7 - 1
source/putty/putty.h

@@ -2144,6 +2144,7 @@ void term_pwron(Terminal *, bool);
 void term_clrsb(Terminal *);
 void term_mouse(Terminal *, Mouse_Button, Mouse_Button, Mouse_Action,
                 int, int, bool, bool, bool);
+void term_cancel_selection_drag(Terminal *);
 void term_key(Terminal *, Key_Sym, wchar_t *, size_t, unsigned int,
               unsigned int);
 void term_lost_clipboard_ownership(Terminal *, int clipboard);
@@ -2531,10 +2532,15 @@ void printer_finish_job(printer_job *);
  * zero out password arguments in the hope of not having them show up
  * avoidably in Unix 'ps'.
  */
+struct cmdline_get_passwd_input_state { bool tried; };
+#define CMDLINE_GET_PASSWD_INPUT_STATE_INIT { .tried = false }
+extern const cmdline_get_passwd_input_state cmdline_get_passwd_input_state_new;
+
 int cmdline_process_param(const char *, char *, int, Conf *);
 void cmdline_run_saved(Conf *);
 void cmdline_cleanup(void);
-SeatPromptResult cmdline_get_passwd_input(prompts_t *p);
+SeatPromptResult cmdline_get_passwd_input(
+    prompts_t *p, cmdline_get_passwd_input_state *state, bool restartable);
 bool cmdline_host_ok(Conf *);
 bool cmdline_verbose(void);
 bool cmdline_loaded_session(void);

+ 13 - 5
source/putty/settings.c

@@ -1309,6 +1309,8 @@ static int sessioncmp(const void *av, const void *bv)
     return strcmp(a, b);               /* otherwise, compare normally */
 }
 
+bool sesslist_demo_mode = false;
+
 void get_sesslist(struct sesslist *list, bool allocate)
 {
     int i;
@@ -1318,12 +1320,18 @@ void get_sesslist(struct sesslist *list, bool allocate)
     if (allocate) {
         strbuf *sb = strbuf_new();
 
-        if ((handle = enum_settings_start()) != NULL) {
-            while (enum_settings_next(handle, sb))
-                put_byte(sb, '\0');
-            enum_settings_finish(handle);
+        if (sesslist_demo_mode) {
+            put_asciz(sb, "demo-server");
+            put_asciz(sb, "demo-server-2");
+        } else {
+            if ((handle = enum_settings_start()) != NULL) {
+                while (enum_settings_next(handle, sb))
+                    put_byte(sb, '\0');
+                enum_settings_finish(handle);
+            }
+            put_byte(sb, '\0');
         }
-        put_byte(sb, '\0');
+
         list->buffer = strbuf_to_str(sb);
 
         /*

+ 3 - 0
source/putty/ssh/connection2.c

@@ -185,6 +185,7 @@ void ssh2_queue_global_request_handler(
         snew(struct outstanding_global_request);
     ogr->handler = handler;
     ogr->ctx = ctx;
+    ogr->next = NULL;
     if (s->globreq_tail)
         s->globreq_tail->next = ogr;
     else
@@ -387,6 +388,8 @@ static bool ssh2_connection_filter_queue(struct ssh2_connection_state *s)
                 s->globreq_head = s->globreq_head->next;
                 sfree(tmp);
             }
+            if (!s->globreq_head)
+                s->globreq_tail = NULL;
 
             pq_pop(s->ppl.in_pq);
             break;

+ 4 - 4
source/putty/ssh/mainchan.c

@@ -303,8 +303,8 @@ static void mainchan_request_response(Channel *chan, bool success)
              * If there's no remote_cmd2 configured, then we have no
              * fallback command, so we've run out of options.
              */
-            ssh_sw_abort(mc->ppl->ssh,
-                         "Server refused to start a shell/command");
+            ssh_sw_abort_deferred(mc->ppl->ssh,
+                                  "Server refused to start a shell/command");
         }
         return;
     }
@@ -317,8 +317,8 @@ static void mainchan_request_response(Channel *chan, bool success)
             ssh_got_fallback_cmd(mc->ppl->ssh);
             mainchan_ready(mc);
         } else {
-            ssh_sw_abort(mc->ppl->ssh,
-                         "Server refused to start a shell/command");
+            ssh_sw_abort_deferred(mc->ppl->ssh,
+                                  "Server refused to start a shell/command");
         }
         return;
     }

+ 2 - 1
source/putty/utils/stripctrl.c

@@ -314,7 +314,7 @@ static void stripctrl_locale_BinarySink_write(
         container_of(sccpub, StripCtrlCharsImpl, public);
     const char *p = (const char *)vp;
 
-    const char *previous_locale = setlocale(LC_CTYPE, NULL);
+    char *previous_locale = dupstr(setlocale(LC_CTYPE, NULL));
     setlocale(LC_CTYPE, "");
 
     /*
@@ -402,6 +402,7 @@ static void stripctrl_locale_BinarySink_write(
 
   out:
     setlocale(LC_CTYPE, previous_locale);
+    sfree(previous_locale);
 }
 
 static void stripctrl_term_BinarySink_write(

+ 4 - 4
source/putty/version.h

@@ -1,5 +1,5 @@
 /* Generated by automated build script */
-#define SNAPSHOT
-#define TEXTVER "Development snapshot 2022-03-28.a101444"
-#define SSHVER "-Snapshot-2022-03-28.a101444"
-#define BINARY_VERSION 0,76,1261,0
+#define RELEASE 0.77
+#define TEXTVER "Release 0.77"
+#define SSHVER "-Release-0.77"
+#define BINARY_VERSION 0,77,0,0

+ 1 - 1
source/putty/windows/gss.c

@@ -509,7 +509,7 @@ static Ssh_gss_stat ssh_sspi_init_sec_context(struct ssh_gss_library *lib,
     SecBufferDesc input_desc = MPEXT_INIT_SEC_BUFFERDESC(SECBUFFER_VERSION,1,&wrecv_tok);
     unsigned long flags=ISC_REQ_MUTUAL_AUTH|ISC_REQ_REPLAY_DETECT|
         ISC_REQ_CONFIDENTIALITY|ISC_REQ_ALLOCATE_MEMORY;
-    unsigned long ret_flags=0;
+    ULONG ret_flags=0;
     TimeStamp localexp;
 
     /* check if we have to delegate ... */

+ 127 - 195
source/putty/windows/network.c

@@ -24,10 +24,6 @@
 #endif
 #include <ws2tcpip.h>
 
-#if HAVE_AFUNIX_H
-#include <afunix.h>
-#endif
-
 #ifndef NO_IPV6
 #ifdef __clang__
 #pragma clang diagnostic push
@@ -87,28 +83,12 @@ struct NetSocket {
     Socket sock;
 };
 
-/*
- * Top-level discriminator for SockAddr.
- *
- * UNRESOLVED means a host name not yet put through DNS; IP means a
- * resolved IP address (or list of them); UNIX indicates the AF_UNIX
- * network family (which Windows also has); NAMEDPIPE indicates that
- * this SockAddr is phony, holding a Windows named pipe pathname
- * instead of any address WinSock can understand.
- */
-typedef enum SuperFamily {
-    UNRESOLVED,
-    IP,
-#if HAVE_AFUNIX_H
-    UNIX,
-#endif
-    NAMEDPIPE
-} SuperFamily;
-
 struct SockAddr {
     int refcount;
     char *error;
-    SuperFamily superfamily;
+    bool resolved;
+    bool namedpipe; /* indicates that this SockAddr is phony, holding a Windows
+                     * named pipe pathname instead of a network address */
 #ifndef NO_IPV6
     struct addrinfo *ais;              /* Addresses IPv6 style. */
 #endif
@@ -119,27 +99,18 @@ struct SockAddr {
 
 /*
  * Which address family this address belongs to. AF_INET for IPv4;
- * AF_INET6 for IPv6; AF_UNIX for Unix-domain sockets; AF_UNSPEC
- * indicates that name resolution has not been done and a simple host
- * name is held in this SockAddr structure.
+ * AF_INET6 for IPv6; AF_UNSPEC indicates that name resolution has
+ * not been done and a simple host name is held in this SockAddr
+ * structure.
  */
-static inline int sockaddr_family(SockAddr *addr, SockAddrStep step)
-{
-    switch (addr->superfamily) {
-      case IP:
 #ifndef NO_IPV6
-        if (step.ai)
-            return step.ai->ai_family;
-#endif
-        return AF_INET;
-#if HAVE_AFUNIX_H
-      case UNIX:
-        return AF_UNIX;
+#define SOCKADDR_FAMILY(addr, step) \
+    (!(addr)->resolved ? AF_UNSPEC : \
+     (step).ai ? (step).ai->ai_family : AF_INET)
+#else
+#define SOCKADDR_FAMILY(addr, step) \
+    (!(addr)->resolved ? AF_UNSPEC : AF_INET)
 #endif
-      default:
-        return AF_UNSPEC;
-    }
-}
 
 /*
  * Start a SockAddrStep structure to step through multiple
@@ -491,8 +462,9 @@ SockAddr *sk_namelookup(const char *host, char **canonicalname,
 #ifndef NO_IPV6
     ret->ais = NULL;
 #endif
+    ret->namedpipe = false;
     ret->addresses = NULL;
-    ret->superfamily = UNRESOLVED;
+    ret->resolved = false;
     ret->refcount = 1;
     *realhost = '\0';
 
@@ -516,7 +488,7 @@ SockAddr *sk_namelookup(const char *host, char **canonicalname,
             }
             if (err == 0)
             {
-                ret->superfamily = IP;
+                ret->resolved = true;
             }
         } else
 #endif
@@ -526,12 +498,12 @@ SockAddr *sk_namelookup(const char *host, char **canonicalname,
              * (NOTE: we don't use gethostbyname as a fallback!)
              */
             if ( (h = p_gethostbyname(host)) )
-                ret->superfamily = IP;
+                ret->resolved = true;
             else
                 err = p_WSAGetLastError();
         }
 
-        if (ret->superfamily != IP) {
+        if (!ret->resolved) {
             ret->error = (err == WSAENETDOWN ? "Network is down" :
                           err == WSAHOST_NOT_FOUND ? "Host does not exist" :
                           err == WSATRY_AGAIN ? "Host not found" :
@@ -584,7 +556,7 @@ SockAddr *sk_namelookup(const char *host, char **canonicalname,
         ret->addresses = snewn(1, unsigned long);
         ret->naddresses = 1;
         ret->addresses[0] = p_ntohl(a);
-        ret->superfamily = IP;
+        ret->resolved = true;
         strncpy(realhost, host, sizeof(realhost));
     }
     realhost[lenof(realhost)-1] = '\0';
@@ -592,38 +564,39 @@ SockAddr *sk_namelookup(const char *host, char **canonicalname,
     return ret;
 }
 
-static SockAddr *sk_special_addr(SuperFamily superfamily, const char *name)
+SockAddr *sk_nonamelookup(const char *host)
 {
     SockAddr *ret = snew(SockAddr);
     ret->error = NULL;
-    ret->superfamily = superfamily;
+    ret->resolved = false;
 #ifndef NO_IPV6
     ret->ais = NULL;
 #endif
+    ret->namedpipe = false;
     ret->addresses = NULL;
     ret->naddresses = 0;
     ret->refcount = 1;
-    strncpy(ret->hostname, name, lenof(ret->hostname));
+    strncpy(ret->hostname, host, lenof(ret->hostname));
     ret->hostname[lenof(ret->hostname)-1] = '\0';
     return ret;
 }
 
-SockAddr *sk_nonamelookup(const char *host)
-{
-    return sk_special_addr(UNRESOLVED, host);
-}
-
 SockAddr *sk_namedpipe_addr(const char *pipename)
 {
-    return sk_special_addr(NAMEDPIPE, pipename);
-}
-
-#if HAVE_AFUNIX_H
-SockAddr *sk_unix_addr(const char *sockpath)
-{
-    return sk_special_addr(UNIX, sockpath);
-}
+    SockAddr *ret = snew(SockAddr);
+    ret->error = NULL;
+    ret->resolved = false;
+#ifndef NO_IPV6
+    ret->ais = NULL;
 #endif
+    ret->namedpipe = true;
+    ret->addresses = NULL;
+    ret->naddresses = 0;
+    ret->refcount = 1;
+    strncpy(ret->hostname, pipename, lenof(ret->hostname));
+    ret->hostname[lenof(ret->hostname)-1] = '\0';
+    return ret;
+}
 
 static bool sk_nextaddr(SockAddr *addr, SockAddrStep *step)
 {
@@ -666,7 +639,7 @@ void sk_getaddr(SockAddr *addr, char *buf, int buflen)
         }
     } else
 #endif
-    if (sockaddr_family(addr, step) == AF_INET) {
+    if (SOCKADDR_FAMILY(addr, step) == AF_INET) {
         struct in_addr a;
         assert(addr->addresses && step.curraddr < addr->naddresses);
         a.s_addr = p_htonl(addr->addresses[step.curraddr]);
@@ -697,7 +670,7 @@ static SockAddr sk_extractaddr_tmp(
 #ifndef NO_IPV6
     toret.ais = step->ai;
 #endif
-    if (sockaddr_family(addr, *step) == AF_INET
+    if (SOCKADDR_FAMILY(addr, *step) == AF_INET
 #ifndef NO_IPV6
         && !toret.ais
 #endif
@@ -709,11 +682,7 @@ static SockAddr sk_extractaddr_tmp(
 
 bool sk_addr_needs_port(SockAddr *addr)
 {
-    return addr->superfamily != NAMEDPIPE
-#if HAVE_AFUNIX_H
-        && addr->superfamily != UNIX
-#endif
-        ;
+    return !addr->namedpipe;
 }
 
 bool sk_hostname_is_local(const char *name)
@@ -761,7 +730,7 @@ bool sk_address_is_local(SockAddr *addr)
     SockAddrStep step;
     int family;
     START_STEP(addr, step);
-    family = sockaddr_family(addr, step);
+    family = SOCKADDR_FAMILY(addr, step);
 
 #ifndef NO_IPV6
     if (family == AF_INET6) {
@@ -797,7 +766,7 @@ int sk_addrtype(SockAddr *addr)
     SockAddrStep step;
     int family;
     START_STEP(addr, step);
-    family = sockaddr_family(addr, step);
+    family = SOCKADDR_FAMILY(addr, step);
 
     return (family == AF_INET ? ADDRTYPE_IPV4 :
 #ifndef NO_IPV6
@@ -811,7 +780,7 @@ void sk_addrcopy(SockAddr *addr, char *buf)
     SockAddrStep step;
     int family;
     START_STEP(addr, step);
-    family = sockaddr_family(addr, step);
+    family = SOCKADDR_FAMILY(addr, step);
 
     assert(family != AF_UNSPEC);
 #ifndef NO_IPV6
@@ -972,7 +941,7 @@ static DWORD try_connect(NetSocket *sock,
     /*
      * Open socket.
      */
-    family = sockaddr_family(sock->addr, sock->step);
+    family = SOCKADDR_FAMILY(sock->addr, sock->step);
 
     /*
      * Remove the socket from the tree before we overwrite its
@@ -1257,26 +1226,21 @@ Socket *sk_new(SockAddr *addr, int port, bool privport, bool oobinline,
     return &ret->sock;
 }
 
-Socket *sk_newlistener_internal(const char *srcaddr, int port, Plug *plug,
-                                bool local_host_only, int orig_address_family)
+Socket *sk_newlistener(const char *srcaddr, int port, Plug *plug,
+                       bool local_host_only, int orig_address_family)
 {
     SOCKET s;
-    SOCKADDR_IN a;
 #ifndef NO_IPV6
     SOCKADDR_IN6 a6;
 #endif
-#if HAVE_AFUNIX_H
-    SOCKADDR_UN au;
-#endif
-    struct sockaddr *bindaddr;
-    unsigned bindsize;
+    SOCKADDR_IN a;
 
     DWORD err;
     const char *errstr;
     NetSocket *ret;
     int retcode;
 
-    int address_family = orig_address_family;
+    int address_family;
 
     /*
      * Create NetSocket structure.
@@ -1296,6 +1260,16 @@ Socket *sk_newlistener_internal(const char *srcaddr, int port, Plug *plug,
     ret->parent = ret->child = NULL;
     ret->addr = NULL;
 
+    /*
+     * Translate address_family from platform-independent constants
+     * into local reality.
+     */
+    address_family = (orig_address_family == ADDRTYPE_IPV4 ? AF_INET :
+#ifndef NO_IPV6
+                      orig_address_family == ADDRTYPE_IPV6 ? AF_INET6 :
+#endif
+                      AF_UNSPEC);
+
     /*
      * Our default, if passed the `don't care' value
      * ADDRTYPE_UNSPEC, is to listen on IPv4. If IPv6 is supported,
@@ -1321,100 +1295,85 @@ Socket *sk_newlistener_internal(const char *srcaddr, int port, Plug *plug,
 
     ret->oobinline = false;
 
-#if HAVE_AFUNIX_H
-    if (address_family != AF_UNIX)
-#endif
     {
         BOOL on = true;
         p_setsockopt(s, SOL_SOCKET, SO_EXCLUSIVEADDRUSE,
                      (const char *)&on, sizeof(on));
     }
 
-    switch (address_family) {
 #ifndef NO_IPV6
-      case AF_INET6: {
-        memset(&a6, 0, sizeof(a6));
-        a6.sin6_family = AF_INET6;
-        if (local_host_only)
-            a6.sin6_addr = in6addr_loopback;
-        else
-            a6.sin6_addr = in6addr_any;
-        if (srcaddr != NULL && p_getaddrinfo) {
-            struct addrinfo hints;
-            struct addrinfo *ai;
-            int err;
-
-            memset(&hints, 0, sizeof(hints));
-            hints.ai_family = AF_INET6;
-            hints.ai_flags = 0;
-            {
-                /* strip [] on IPv6 address literals */
-                char *trimmed_addr = host_strduptrim(srcaddr);
-                err = p_getaddrinfo(trimmed_addr, NULL, &hints, &ai);
-                sfree(trimmed_addr);
-            }
-            if (err == 0 && ai->ai_family == AF_INET6) {
-                a6.sin6_addr =
-                    ((struct sockaddr_in6 *)ai->ai_addr)->sin6_addr;
+        if (address_family == AF_INET6) {
+            memset(&a6, 0, sizeof(a6));
+            a6.sin6_family = AF_INET6;
+            if (local_host_only)
+                a6.sin6_addr = in6addr_loopback;
+            else
+                a6.sin6_addr = in6addr_any;
+            if (srcaddr != NULL && p_getaddrinfo) {
+                struct addrinfo hints;
+                struct addrinfo *ai;
+                int err;
+
+                memset(&hints, 0, sizeof(hints));
+                hints.ai_family = AF_INET6;
+                hints.ai_flags = 0;
+                {
+                    /* strip [] on IPv6 address literals */
+                    char *trimmed_addr = host_strduptrim(srcaddr);
+                    err = p_getaddrinfo(trimmed_addr, NULL, &hints, &ai);
+                    sfree(trimmed_addr);
+                }
+                if (err == 0 && ai->ai_family == AF_INET6) {
+                    a6.sin6_addr =
+                        ((struct sockaddr_in6 *)ai->ai_addr)->sin6_addr;
+                }
             }
-        }
-        a6.sin6_port = p_htons(port);
-        bindaddr = (struct sockaddr *)&a6;
-        bindsize = sizeof(a6);
-        break;
-      }
+            a6.sin6_port = p_htons(port);
+        } else
 #endif
-      case AF_INET: {
-        bool got_addr = false;
-        a.sin_family = AF_INET;
+        {
+            bool got_addr = false;
+            a.sin_family = AF_INET;
 
-        /*
-         * Bind to source address. First try an explicitly
-         * specified one...
-         */
-        if (srcaddr) {
-            a.sin_addr.s_addr = p_inet_addr(srcaddr);
-            if (a.sin_addr.s_addr != INADDR_NONE) {
-                /* Override localhost_only with specified listen addr. */
-                ret->localhost_only = ipv4_is_loopback(a.sin_addr);
-                got_addr = true;
+            /*
+             * Bind to source address. First try an explicitly
+             * specified one...
+             */
+            if (srcaddr) {
+                a.sin_addr.s_addr = p_inet_addr(srcaddr);
+                if (a.sin_addr.s_addr != INADDR_NONE) {
+                    /* Override localhost_only with specified listen addr. */
+                    ret->localhost_only = ipv4_is_loopback(a.sin_addr);
+                    got_addr = true;
+                }
             }
-        }
 
-        /*
-         * ... and failing that, go with one of the standard ones.
-         */
-        if (!got_addr) {
-            if (local_host_only)
-                a.sin_addr.s_addr = p_htonl(INADDR_LOOPBACK);
-            else
-                a.sin_addr.s_addr = p_htonl(INADDR_ANY);
-        }
+            /*
+             * ... and failing that, go with one of the standard ones.
+             */
+            if (!got_addr) {
+                if (local_host_only)
+                    a.sin_addr.s_addr = p_htonl(INADDR_LOOPBACK);
+                else
+                    a.sin_addr.s_addr = p_htonl(INADDR_ANY);
+            }
 
-        a.sin_port = p_htons((short)port);
-        bindaddr = (struct sockaddr *)&a;
-        bindsize = sizeof(a);
-        break;
-      }
-#if HAVE_AFUNIX_H
-      case AF_UNIX: {
-        au.sun_family = AF_UNIX;
-        strncpy(au.sun_path, srcaddr, sizeof(au.sun_path));
-        bindaddr = (struct sockaddr *)&au;
-        bindsize = sizeof(au);
-        break;
-      }
+            a.sin_port = p_htons((short)port);
+        }
+#ifndef NO_IPV6
+        retcode = p_bind(s, (address_family == AF_INET6 ?
+                           (struct sockaddr *) &a6 :
+                           (struct sockaddr *) &a),
+                       (address_family ==
+                        AF_INET6 ? sizeof(a6) : sizeof(a)));
+#else
+        retcode = p_bind(s, (struct sockaddr *) &a, sizeof(a));
 #endif
-      default:
-        unreachable("bad address family in sk_newlistener_internal");
-    }
-
-    retcode = p_bind(s, bindaddr, bindsize);
-    if (retcode != SOCKET_ERROR) {
-        err = 0;
-    } else {
-        err = p_WSAGetLastError();
-    }
+        if (retcode != SOCKET_ERROR) {
+            err = 0;
+        } else {
+            err = p_WSAGetLastError();
+        }
 
     if (err) {
         p_closesocket(s);
@@ -1449,9 +1408,9 @@ Socket *sk_newlistener_internal(const char *srcaddr, int port, Plug *plug,
      * If we were given ADDRTYPE_UNSPEC, we must also create an
      * IPv6 listening socket and link it to this one.
      */
-    if (address_family == AF_INET && orig_address_family == AF_UNSPEC) {
-        Socket *other = sk_newlistener_internal(srcaddr, port, plug,
-                                                local_host_only, AF_INET6);
+    if (address_family == AF_INET && orig_address_family == ADDRTYPE_UNSPEC) {
+        Socket *other = sk_newlistener(srcaddr, port, plug,
+                                       local_host_only, ADDRTYPE_IPV6);
 
         if (other) {
             NetSocket *ns = container_of(other, NetSocket, sock);
@@ -1468,33 +1427,6 @@ Socket *sk_newlistener_internal(const char *srcaddr, int port, Plug *plug,
     return &ret->sock;
 }
 
-Socket *sk_newlistener(const char *srcaddr, int port, Plug *plug,
-                       bool local_host_only, int orig_address_family)
-{
-    /*
-     * Translate address_family from platform-independent constants
-     * into local reality.
-     */
-    int address_family = (orig_address_family == ADDRTYPE_IPV4 ? AF_INET :
-#ifndef NO_IPV6
-                          orig_address_family == ADDRTYPE_IPV6 ? AF_INET6 :
-#endif
-                          AF_UNSPEC);
-
-    return sk_newlistener_internal(srcaddr, port, plug, local_host_only,
-                                   address_family);
-}
-
-Socket *sk_newlistener_unix(const char *path, Plug *plug)
-{
-#if HAVE_AFUNIX_H
-    return sk_newlistener_internal(path, 0, plug, false, AF_UNIX);
-#else
-    return new_error_socket_fmt(
-        plug, "AF_UNIX support not compiled into this program");
-#endif
-}
-
 static void sk_net_close(Socket *sock)
 {
     NetSocket *s = container_of(sock, NetSocket, sock);
@@ -1848,7 +1780,7 @@ void select_result(WPARAM wParam, LPARAM lParam)
 #ifdef NO_IPV6
         struct sockaddr_in isa;
 #else
-        struct sockaddr_storage isa; // FIXME: also if Unix and no IPv6
+        struct sockaddr_storage isa;
 #endif
         int addrlen = sizeof(isa);
         SOCKET t;  /* socket of connection */
@@ -1904,7 +1836,7 @@ static SocketPeerInfo *sk_net_peer_info(Socket *sock)
 #ifdef NO_IPV6
     struct sockaddr_in addr;
 #else
-    struct sockaddr_storage addr; // FIXME: also if Unix and no IPv6
+    struct sockaddr_storage addr;
     char buf[INET6_ADDRSTRLEN];
 #endif
     int addrlen = sizeof(addr);
@@ -2031,7 +1963,7 @@ SockAddr *platform_get_x11_unix_address(const char *display, int displaynum)
 {
     SockAddr *ret = snew(SockAddr);
     memset(ret, 0, sizeof(SockAddr));
-    ret->error = "unix sockets for X11 not supported on this platform";
+    ret->error = "unix sockets not supported on this platform";
     ret->refcount = 1;
     return ret;
 }

+ 3 - 2
source/putty/windows/platform.h

@@ -302,7 +302,6 @@ void socket_reselect_all(void);
 SockAddr *sk_namedpipe_addr(const char *pipename);
 /* Turn a WinSock error code into a string. */
 const char *winsock_error_string(int error);
-Socket *sk_newlistener_unix(const char *socketpath, Plug *plug);
 
 /*
  * network.c dynamically loads WinSock 2 or WinSock 1 depending on
@@ -342,7 +341,6 @@ const char *do_select(Plug * plug, SOCKET skt, bool enable); // WINSCP
  */
 void winselgui_set_hwnd(HWND hwnd);
 void winselgui_clear_hwnd(void);
-void winselgui_response(WPARAM wParam, LPARAM lParam);
 
 void winselcli_setup(void);
 SOCKET winselcli_unique_socket(void);
@@ -768,4 +766,7 @@ bool aux_match_arg(AuxMatchOpt *amo, char **val);
 bool aux_match_opt(AuxMatchOpt *amo, char **val, const char *optname, ...);
 bool aux_match_done(AuxMatchOpt *amo);
 
+char *save_screenshot(HWND hwnd, const char *outfile);
+void gui_terminal_ready(HWND hwnd, Seat *seat, Backend *backend);
+
 #endif /* PUTTY_WINDOWS_PLATFORM_H */

+ 18 - 18
translations/DE.ini

@@ -366,7 +366,7 @@ MainPanel.SitePanel.BasicGroup.PasswordLabel.Caption="&Passwort:"
 MainPanel.SitePanel.BasicGroup.Label22.Caption="&Übertragungsprotokoll:"
 MainPanel.SitePanel.BasicGroup.FtpsLabel.Caption="&Verschlüsselung:"
 MainPanel.SitePanel.BasicGroup.WebDavsLabel.Caption="&Verschlüsselung:"
-MainPanel.SitePanel.BasicGroup.BasicS3Panel.S3CredentialsEnvCheck.Caption="&Zugangsdaten aus AWS Client Konfiguration lesen"
+MainPanel.SitePanel.BasicGroup.BasicS3Panel.S3CredentialsEnvCheck.Caption="&Zugangsdaten aus AWS-Client-Konfiguration lesen"
 MainPanel.SitePanel.BasicGroup.FtpsCombo.Items.Strings.0="Keine"
 MainPanel.SitePanel.BasicGroup.BasicFtpPanel.AnonymousLoginCheck.Caption="A&nonym anmelden"
 MainPanel.SitePanel.NoteGroup.Caption="Hinweis"
@@ -1602,14 +1602,14 @@ MainPanel.PageControl.FtpSheet.FtpGroup.Label24.Caption="&MLSD-Befehl für Verze
 MainPanel.PageControl.FtpSheet.FtpGroup.FtpForcePasvIpLabel.Caption="IP-Adresse für Verbindungen im passiven Modus &erzwingen:"
 MainPanel.PageControl.FtpSheet.FtpGroup.FtpAccountLabel.Caption="&Konto:"
 MainPanel.PageControl.FtpSheet.FtpGroup.Label3.Caption="&HOST-Befehl verwenden, um Host auf dem Server auszuwählen:"
-MainPanel.PageControl.FtpSheet.FtpGroup.VMSAllRevisionsCheck.Caption="Auf VMS Servern alle Datei&versionen anzeigen"
+MainPanel.PageControl.FtpSheet.FtpGroup.VMSAllRevisionsCheck.Caption="Auf VMS-Servern alle Datei&versionen anzeigen"
 MainPanel.PageControl.S3Sheet.S3Group.Caption="Protokolloptionen"
 MainPanel.PageControl.S3Sheet.S3Group.Label27.Caption="Stan&dardregion:"
 MainPanel.PageControl.S3Sheet.S3Group.S3UrlStyleLabel.Caption="&URL-Stil:"
 MainPanel.PageControl.S3Sheet.S3Group.S3UrlStyleCombo.Items.Strings.0="Virtueller Host"
 MainPanel.PageControl.S3Sheet.S3Group.S3UrlStyleCombo.Items.Strings.1="Pfad"
 MainPanel.PageControl.S3Sheet.S3AuthenticationGroup.Caption="Authentifizierung"
-MainPanel.PageControl.S3Sheet.S3AuthenticationGroup.S3SessionTokenLabel.Caption="&Session token:"
+MainPanel.PageControl.S3Sheet.S3AuthenticationGroup.S3SessionTokenLabel.Caption="&Sitzungs-Token:"
 MainPanel.PageControl.WebDavSheet.WebdavGroup.Caption="Protokolloptionen"
 MainPanel.PageControl.WebDavSheet.WebdavGroup.WebDavLiberalEscapingCheck.Caption="Nicht codierte Spezialzeichen in Dateinamen &tolerieren"
 MainPanel.PageControl.ConnSheet.Caption="Verbindung"
@@ -1855,7 +1855,7 @@ CONNECTION_FAILED="Verbindung ist fehlgeschlagen."
 USER_TERMINATED="Abgebrochen durch Benutzer."
 LOST_CONNECTION="Verbindung verloren."
 CANT_DETECT_RETURN_CODE="Rückgabecode des Befehls kann nicht ermittelt werden."
-COMMAND_FAILED2="Kommando '%s'\nschlug fehl mit dem Rückgabecode %d und deer folgenden Fehlermeldung."
+COMMAND_FAILED2="Kommando „%s“\nschlug fehl mit dem Rückgabecode %d und der folgenden Fehlermeldung."
 COMMAND_FAILED_CODEONLY="Befehl fehlgeschlagen mit Beendigungscode %d."
 INVALID_OUTPUT_ERROR="Befehl „%s“ fehlgeschlagen mit ungültiger Ausgabe „%s“."
 READ_CURRENT_DIR_ERROR="Fehler beim Empfang des entfernten Verzeichnisnamens."
@@ -1986,7 +1986,7 @@ SFTP_STATUS_DELETE_PENDING="Auf eine zu löschende Datei sollte ein Vorgang ange
 SFTP_STATUS_FILE_CORRUPT="Die Datei ist beschädigt! Es sollte eine Überprüfung des Dateisystems durchgeführt werden."
 KEY_TYPE_UNKNOWN2="Die Datei „%s“ enthält keinen privaten Schlüssel in einem bekannten Format."
 KEY_TYPE_UNSUPPORTED2="**Die private Schlüsseldatei „%s“ enthält einen Schlüssel im %s-Format. WinSCP unterstützt nur das PuTTY-Format.**"
-KEY_TYPE_SSH1="Die private Schlüsseldatei „%s“ enthält einen Schlüssel im veralteten SSH-1 Format."
+KEY_TYPE_SSH1="Die private Schlüsseldatei „%s“ enthält einen Schlüssel im veralteten SSH-1-Format."
 SFTP_OVERWRITE_FILE_ERROR2="Die entfernte Datei „%s“ kann nicht überschrieben werden.$$\n \n„Löschen“ wählen, um die Datei zu löschen und neu anzulegen, statt sie zu überschreiben.$$"
 SFTP_OVERWRITE_DELETE_BUTTON="L&öschen"
 SPACE_AVAILABLE_ERROR="Fehler beim Prüfen des verfügbaren Platzes für den Pfad „%s“."
@@ -2092,11 +2092,11 @@ UNREQUESTED_FILE="Der Server hat eine Datei gesendet, die nicht angefordert wurd
 STORE_NEW_HOSTKEY_ERROR="Neuer Hostschlüssel konnte nicht gespeichert werden."
 STREAM_IN_SCRIPT_ERROR="Beim Hochladen gestreamter Daten kann nur eine Quelle angegeben werden und das Ziel muss ein Dateiname sein."
 STREAM_READ_ERROR="Fehler beim Lesen des Eingangsstroms."
-S3_CONFIG_ERROR="Fehler beim Lesen des AWS Konfigurationsparameters %s."
+S3_CONFIG_ERROR="Fehler beim Lesen des AWS-Konfigurationsparameters %s."
 TIMEOUT_ERROR="Zeitüberschreitung beim Warten auf Antwort vom Server."
-CREATE_TEMP_DIR_ERROR="Temporäres Verzeichnis „%s“ konnte nicht erstellt werden. Das Basisverzeichnis für temporäre Dateien kann in den Einstellungen ändert werden."
-OPENSSH_CONFIG_NOT_FOUND="OpenSSH Konfigurationsdatei nicht gefunden."
-OPENSSH_CONFIG_NO_SITES="Keine Host Direktive für bestimmte Hosts in der OpenSSH Konfigurationsdatei gefunden."
+CREATE_TEMP_DIR_ERROR="Temporäres Verzeichnis „%s“ konnte nicht erstellt werden. Das Basisverzeichnis für temporäre Dateien kann in den Einstellungen geändert werden."
+OPENSSH_CONFIG_NOT_FOUND="OpenSSH-Konfigurationsdatei nicht gefunden."
+OPENSSH_CONFIG_NO_SITES="Keine Host-Direktive für bestimmte Hosts in der OpenSSH-Konfigurationsdatei gefunden."
 CONFIRM_PROLONG_TIMEOUT3="Entfernter Rechner sendet seit %d Sekunden keine Daten.\n\nWeitere %0:d Sekunden warten?"
 PROMPT_KEY_PASSPHRASE="Passphrase für Schlüssel „%s“"
 FILE_OVERWRITE="Datei „%s“ ist bereits vorhanden. Überschreiben?"
@@ -2139,7 +2139,7 @@ VERIFY_CERT_CONTACT="- Organisation: %s\n|- Ort: %s\n|- Anderes: %s\n"
 CERT_TEXT2="Herausgeber:\n%s\nBetreff:\n%s\nGültig: %s - %s\n\nFingerabdrücke:\n- SHA-256: %s\n- SHA-1: %s\n\nZusammenfassung: %s"
 CERTIFICATE_PASSPHRASE_PROMPT="&Passphrase für das Clientzertifikat:"
 CERTIFICATE_PASSPHRASE_TITLE="Clientzertifikat-Passphrase"
-KEY_TYPE_CONVERT4="**Wollen Sie den privaten Schlüssel %s in das PuTTY format konvertieren?**\n\n%s"
+KEY_TYPE_CONVERT4="**Wollen Sie den privaten Schlüssel %s in das PuTTY-Format konvertieren?**\n\n%s"
 MULTI_FILES_TO_ONE="**Möchten Sie wirklich mehrere Dateien in die einzelne Datei „%s“ im Verzeichnis „%s“ übertragen?**\n\nDie Dateien werden sich nacheinander überschreiben.\n\nWenn Sie alle Dateien unter Beibehaltung ihres Namens in das Verzeichnis „%s“ übertragen wollen, stellen Sie sicher, dass die Pfadangabe mit einem Schrägstrich endet."
 KEY_EXCHANGE_ALG="Schlüsseltausch-Algorithmus"
 KEYKEY_TYPE="Hostschlüsseltyp"
@@ -2148,8 +2148,8 @@ S3_ACCESS_KEY_ID_PROMPT="Zugangss&chlüssel-ID:"
 S3_SECRET_ACCESS_KEY_TITLE="Geheimer Zugangsschlüssel"
 S3_SECRET_ACCESS_KEY_PROMPT="Geheimer &Zugangsschlüssel:"
 PROXY_AUTH_TITLE="Proxyanmeldung"
-PROXY_AUTH_USERNAME_PROMPT="Proxy &Benutzername:"
-PROXY_AUTH_PASSWORD_PROMPT="Proxy &Passwort:"
+PROXY_AUTH_USERNAME_PROMPT="Proxy-&Benutzername:"
+PROXY_AUTH_PASSWORD_PROMPT="Proxy-&Passwort:"
 YES_STR="Ja"
 NO_STR="Nein"
 SESSION_INFO_TIP2="Rechner: %s\nBenutzername: %s\nPrivate Schlüsseldatei: %s\nÜbertragungsprotokoll: %s"
@@ -2423,7 +2423,7 @@ UPDATE_UNAUTHORIZED="Ihre E-Mail-Adresse ist für automatische Aktualisierungen
 UPDATE_EXPIRED="Die Berechtigung Ihrer E-Mail-Adresse für die automatische Aktualisierung ist abgelaufen."
 UPDATE_TOO_MANY="Ihre E-Mail-Adresse wurde wegen überhöhter Nutzung für automatische Updates blockiert."
 UPDATE_MISSING_ADDRESS2="Um automatische Aktualisierungen für Ihre E-Mail-Adresse zu aktivieren, füllen Sie bitte ein Spendenformular aus (einschließlich Ihrer Postadresse).\n\nSie finden einen Link in der Bestätigungsmail Ihrer Spende."
-UPDATE_MISSING_ADDRESS3="Durchsuche die mailbox %s nach \"%s\" Nachricht."
+UPDATE_MISSING_ADDRESS3="Die Mailbox %s nach \"%s\"-Nachricht durchsuchen."
 UPDATE_TOO_LOW="Ihre Spende liegt unter der Grenze, die für die Aktivierung der automatischen Updates erforderlich ist."
 TIPS_NONE="Keine Tipps."
 KEYGEN_PUBLIC="Die Umwandlung von öffentlichen Schlüsseln wird nicht unterstützt."
@@ -2486,7 +2486,7 @@ CONFIRM_CREATE_SHORTCUT_WORKSPACE="Soll für den Arbeitsbereich „%s“ eine De
 EDIT_SESSION_RECONNECT="Soll die Sitzung „%s“ erneut verbunden werden, um die bearbeitete Datei „%s“ hochzuladen?"
 CLOSE_SESSIONS_WORKSPACE3="Alle Sitzungen beenden und die Anwendung schließen, ohne den Arbeitsbereich zu speichern?"
 IMPORT_SESSIONS2="**Sie haben Sitzungen/Verbindungsziele in %s gespeichert.\n\nWollen Sie diese in WinSCP importieren**\n\n(Sie können diese Sitzungen auch später jederzeit aus dem Anmeldedialog heraus importieren)|PuTTY SSH-Programm|FileZilla FTP-Programm|%s und %s"
-IMPORT_CONFIGURATION2="**Konfiguration wiederherstellen?**\n\nDie Wiederherstellung der Konfiguration wird alle aktuell gestezten Einstellungen und Sitzungen überschreiben. WinSCP wird mit der neuen Konfiguration neu gestartat. Denken Sie daran, Ihre Arbeit zu speichern und eine Sicherungskopie Ihrer aktuellen Konfiguration zu erstellen."
+IMPORT_CONFIGURATION2="**Konfiguration wiederherstellen?**\n\nDie Wiederherstellung der Konfiguration wird alle aktuell gesetzten Einstellungen und Sitzungen überschreiben. WinSCP wird mit der neuen Konfiguration neu gestartet. Denken Sie daran, Ihre Arbeit zu speichern und eine Sicherungskopie Ihrer aktuellen Konfiguration zu erstellen."
 ALL_BUTTON="&Alle"
 YES_TO_ALL_BUTTON="Ja für &alle"
 REPORT_BUTTON="Me&lden"
@@ -2531,7 +2531,7 @@ CUSTOM_COMMAND_UNTAR_DIRECTORY="In diesem Verzeichnis &entpacken:"
 CUSTOM_COMMAND_GREP="&Grep …"
 CUSTOM_COMMAND_GREP_PATTERN="Nach Muster &suchen:"
 DIRECTORY_READING_PROGRESS="%d Verzeichnis wird gelesen"
-QUEUE_LISTING="Verzeichnis anzeigen ..."
+QUEUE_LISTING="Verzeichnis anzeigen "
 UPGRADE_BUTTON="&Aktualisieren"
 COPY_PARAM_AUTOSELECTED="Übertragungseinstellungsprofil „%s“ wurde automatisch ausgewählt."
 COPY_PARAM_DEFAULT_CUSTOM=" Übertragungseinstellungsprofil „%s“ wurde wieder eingestellt."
@@ -3005,7 +3005,7 @@ NEW_5_10_AUTOMATION="Zahlreiche Verbesserungen bei benutzerdefinierten Befehlen/
 ; <override>
 NEW_5_12_S3="Unterstützung für Amazon-S3-Protokoll"
 ; <override>
-NEW_5_12_SHA256_HOSTKEY="Unterstützung für SHA-256 Host Key Fingerabdruck-Algorithmus"
+NEW_5_12_SHA256_HOSTKEY="Unterstützung für SHA-256 Hostschlüssel-Fingerabdruck-Algorithmus"
 ; <override>
 NEW_5_12_AUTOMATION="Zahlreiche Verbesserungen bei der .NET-Anbindung, einschließlich der Unterstützung der Paketverwaltung im NuGet-Paket"
 ; <override>
@@ -3031,13 +3031,13 @@ NEW_5_16_FIND_SORT="Suchergebnisse können nun sortiert werden"
 ; <override>
 NEW_5_18_QUEUE_FILE_LIST="Eine komplette Liste der Dateien, die für einen Transfer vorgesehen sind, kann angezeigt werden"
 ; <override>
-NEW_5_18_STREAMING="Unterstützung für Datenströme (streams) beim Skripten und .NET-Assembly"
+NEW_5_18_STREAMING="Unterstützung für Datenströme (Streams) beim Skripten und .NET-Assembly"
 ; <override>
 NEW_5_18_REMOTE_SYNC="Eine Erweiterung zur Synchronisation zweier entfernter Server"
 ; <override>
 NEW_5_18_TLS="TLS 1.3 aktiviert und Unterstützung für SHA-256 TLS/SSL-Fingerabdrücke"
 NEW_5_20_S3_ACL="Unterstützung für ACL für das S3-Protokoll"
-NEW_5_20_SHA2="Unterstützung für rsa-sha2-256 und rsa-sha2-512 SSH Algorithmen für öffentliche Schlüssel"
+NEW_5_20_SHA2="Unterstützung für die öffentlichen SSH-Schlüsselalgorithmen RSA-SHA2-256 und RSA-SHA2-512"
 NEW_5_20_OPENSSH_IMPORT="Es ist möglich, Sitzungen aus der OpenSSH-Konfigurationsdatei zu importieren"
 
 [WinSCP_DRC.rc]

+ 19 - 19
translations/SK.ini

@@ -3,7 +3,7 @@ Caption="O programe"
 OKButton.Caption="OK"
 LicenseButton.Caption="&Licencia..."
 HelpButton.Caption="Po&mocník"
-Panel.ProductSpecificMessageLabel.Caption="Pre pripomienky a hlásenie chýb, použite fórum podpory na:"
+Panel.ProductSpecificMessageLabel.Caption="Pre pripomienky a hlásenie chýb použite fórum podpory na:"
 Panel.Label3.Caption="Autorské práva k častiam programu:"
 
 [Authenticate.dfm]
@@ -477,7 +477,7 @@ ExplorerActions.SelectOneAction.Hint="Označiť|Označí/zruší označenie vybr
 ExplorerActions.CurrentRenameAction.Caption="Pre&menovať"
 ExplorerActions.CurrentRenameAction.Hint="Premenovať|Premenuje vybraný súbor"
 ExplorerActions.LocalSortAscendingAction.Caption="&Vzostupne"
-ExplorerActions.LocalSortAscendingAction.Hint="Vzostupne/zostupne|Prepne vzostupné/zostupné triedenie lokálneho panelu"
+ExplorerActions.LocalSortAscendingAction.Hint="Vzostupne/zostupne|Prepne vzostupné/zostupné zoraďovanie lokálneho panelu"
 ExplorerActions.CurrentEditAction.Caption="Upra&viť"
 ExplorerActions.CurrentEditAction.Hint="Upraviť|Upraviť vybrané súbory"
 ExplorerActions.HideColumnAction.Caption="&Skryť stĺpec"
@@ -547,8 +547,8 @@ ExplorerActions.ExplorerSessionBandAction.Caption="Tlačidlá &relácie"
 ExplorerActions.ExplorerSessionBandAction.Hint="Zobraziť/skryť panel relácie"
 ExplorerActions.ExplorerPreferencesBandAction.Caption="Panel &predvolieb"
 ExplorerActions.ExplorerPreferencesBandAction.Hint="Zobraziť/skryť panel predvolieb"
-ExplorerActions.ExplorerSortBandAction.Caption="Panel triedenia"
-ExplorerActions.ExplorerSortBandAction.Hint="Zobraziť/skryť panel triedenia"
+ExplorerActions.ExplorerSortBandAction.Caption="Panel zo&raďovania"
+ExplorerActions.ExplorerSortBandAction.Hint="Zobraziť/skryť panel zoraďovania"
 ExplorerActions.ExplorerUpdatesBandAction.Caption="Panel &aktualizácií"
 ExplorerActions.ExplorerUpdatesBandAction.Hint="Zobraziť/skryť panel aktualizácií"
 ExplorerActions.ExplorerTransferBandAction.Caption="Nas&tavenia prenosu"
@@ -594,8 +594,8 @@ ExplorerActions.CommanderSessionBandAction.Caption="Tlačidlá &relácie"
 ExplorerActions.CommanderSessionBandAction.Hint="Zobraziť/skryť panel relácie"
 ExplorerActions.CommanderPreferencesBandAction.Caption="Panel &predvolieb"
 ExplorerActions.CommanderPreferencesBandAction.Hint="Zobraziť/skryť panel predvolieb"
-ExplorerActions.CommanderSortBandAction.Caption="Panel triedenia"
-ExplorerActions.CommanderSortBandAction.Hint="Zobraziť/skryť panel triedenia"
+ExplorerActions.CommanderSortBandAction.Caption="Panel zo&raďovania"
+ExplorerActions.CommanderSortBandAction.Hint="Zobraziť/skryť panel zoraďovania"
 ExplorerActions.CommanderUpdatesBandAction.Caption="Panel &aktualizácií"
 ExplorerActions.CommanderUpdatesBandAction.Hint="Zobraziť/skryť panel aktualizácií"
 ExplorerActions.CommanderTransferBandAction.Caption="Nas&tavenia prenosu"
@@ -637,7 +637,7 @@ ExplorerActions.LocalSortByTypeAction.Hint="Zoradiť podľa typu|Zoradiť lokál
 ExplorerActions.LocalSortByChangedAction.Caption="Podľa poslednej &zmeny"
 ExplorerActions.LocalSortByChangedAction.Hint="Zoradiť podľa poslednej zmeny|Zoradiť lokálny panel podľa času poslednej zmeny"
 ExplorerActions.RemoteSortAscendingAction.Caption="&Vzostupne"
-ExplorerActions.RemoteSortAscendingAction.Hint="Vzostupne/zostupne|Prepne vzostupné/zostupné triedenie vzdialeného panela"
+ExplorerActions.RemoteSortAscendingAction.Hint="Vzostupne/zostupne|Prepne vzostupné/zostupné zoraďovanie vzdialeného panela"
 ExplorerActions.RemoteSortByNameAction.Caption="Podľa &názvu"
 ExplorerActions.RemoteSortByNameAction.Hint="Zoradiť podľa názvu|Zoradiť vzdialený panel podľa názvu"
 ExplorerActions.RemoteSortByExtAction.Caption="Podľa &koncovky"
@@ -655,7 +655,7 @@ ExplorerActions.RemoteSortByGroupAction.Hint="Zoradiť podľa skupiny|Zoradiť v
 ExplorerActions.RemoteSortByTypeAction.Caption="Podľa &typu"
 ExplorerActions.RemoteSortByTypeAction.Hint="Zoradiť podľa typu|Zoradiť vzdialený panel podľa typu súboru"
 ExplorerActions.CurrentSortAscendingAction.Caption="&Vzostupne"
-ExplorerActions.CurrentSortAscendingAction.Hint="Vzostupne/zostupne|Prepne vzostupné/zostupné triedenie aktívneho panelu"
+ExplorerActions.CurrentSortAscendingAction.Hint="Vzostupne/zostupne|Prepne vzostupné/zostupné zoraďovanie aktívneho panelu"
 ExplorerActions.CurrentSortByNameAction.Caption="Podľa &názvu"
 ExplorerActions.CurrentSortByNameAction.Hint="Zoradiť podľa názvu|Zoradiť aktívny panel podľa názvu"
 ExplorerActions.CurrentSortByExtAction.Caption="Podľa &koncovky"
@@ -1046,8 +1046,8 @@ MainPanel.PageControl.LogSheet.LoggingGroup.LogFileNameEdit3.Filter="Súbory so
 MainPanel.PageControl.LogSheet.LoggingGroup.LogFileNameEdit3.DialogTitle="Zvoľte súbor pre záznam relácie"
 MainPanel.PageControl.LogSheet.LoggingGroup.LogFilePanel.LogFileAppendButton.Caption="Pripo&jiť"
 MainPanel.PageControl.LogSheet.LoggingGroup.LogFilePanel.LogFileOverwriteButton.Caption="Pr&epísať"
-MainPanel.PageControl.LogSheet.LoggingGroup.LogProtocolCombo2.Items.Strings.0="Zredukovaný"
-MainPanel.PageControl.LogSheet.LoggingGroup.LogProtocolCombo2.Items.Strings.1="Normálny"
+MainPanel.PageControl.LogSheet.LoggingGroup.LogProtocolCombo2.Items.Strings.0="Redukované"
+MainPanel.PageControl.LogSheet.LoggingGroup.LogProtocolCombo2.Items.Strings.1="Normálne"
 MainPanel.PageControl.LogSheet.LoggingGroup.LogProtocolCombo2.Items.Strings.2="Ladenie 1"
 MainPanel.PageControl.LogSheet.LoggingGroup.LogProtocolCombo2.Items.Strings.3="Ladenie 2"
 MainPanel.PageControl.LogSheet.LoggingGroup.LogFileNameHintText.Caption="vz&ory"
@@ -1096,7 +1096,7 @@ MainPanel.PageControl.PanelsSheet.DoubleClickGroup.DoubleClickActionCombo.Items.
 MainPanel.PageControl.PanelsSheet.DoubleClickGroup.DoubleClickActionCombo.Items.Strings.2="Upraviť"
 MainPanel.PageControl.PanelsSheet.PanelFontGroup.Caption="Písmo pre panel"
 MainPanel.PageControl.PanelsSheet.PanelFontGroup.PanelFontButton.Caption="Výber pís&ma..."
-MainPanel.PageControl.PanelsSheet.PanelFontGroup.PanelFontCheck.Caption="Použiť používateľom nastavené pís&mo"
+MainPanel.PageControl.PanelsSheet.PanelFontGroup.PanelFontCheck.Caption="Použiť používateľské pís&mo"
 MainPanel.PageControl.CommanderSheet.Caption="Commander"
 MainPanel.PageControl.CommanderSheet.Label3.Caption="Nastavenia na tejto záložke sa vzťahujú len na rozhranie typu Commander."
 MainPanel.PageControl.CommanderSheet.PanelsGroup.Caption="Panely"
@@ -1540,8 +1540,8 @@ MainPanel.PageControl.EnvironmentSheet.EnvironmentGroup.TimeDifferenceMinutesLab
 MainPanel.PageControl.EnvironmentSheet.EnvironmentGroup.TimeDifferenceAutoCheck.Caption="Detegovať &automaticky"
 MainPanel.PageControl.EnvironmentSheet.EnvironmentGroup.TrimVMSVersionsCheck.Caption="Deli&ť čísla verzií VMS"
 MainPanel.PageControl.EnvironmentSheet.DSTModeGroup.Caption="Letný čas"
-MainPanel.PageControl.EnvironmentSheet.DSTModeGroup.DSTModeUnixCheck.Caption="Prispôsobiť vzdialené časovú pečiatku &miestnym pravidlám (Unix)"
-MainPanel.PageControl.EnvironmentSheet.DSTModeGroup.DSTModeWinCheck.Caption="Prispôsobiť vzdial. čas. pečiatku let&nému/zimnému č. (Win)"
+MainPanel.PageControl.EnvironmentSheet.DSTModeGroup.DSTModeUnixCheck.Caption="Prispôsobiť vzdialenú časovú pečiatku &miestnym pravidlám (Unix)"
+MainPanel.PageControl.EnvironmentSheet.DSTModeGroup.DSTModeWinCheck.Caption="Prispôsobiť vzdial. časovú pečiatku let&nému času"
 MainPanel.PageControl.EnvironmentSheet.DSTModeGroup.DSTModeKeepCheck.Caption="Zachovať ča&sovú pečiatku (Unix)"
 MainPanel.PageControl.EnvironmentSheet.PuttyGroup.PuttySettingsLabel.Caption="Nastavenia terminálu &PuTTY:"
 MainPanel.PageControl.EnvironmentSheet.PuttyGroup.PuttySettingsButton.Caption="Upr&aviť v PuTTY..."
@@ -1554,7 +1554,7 @@ MainPanel.PageControl.DirectoriesSheet.DirectoriesGroup.LocalDirectoryEdit.Dialo
 MainPanel.PageControl.DirectoriesSheet.DirectoriesGroup.UpdateDirectoriesCheck.Caption="Zapa&mätať naposledy použitý priečinok"
 MainPanel.PageControl.DirectoriesSheet.DirectoriesGroup.SynchronizeBrowsingCheck.Caption="Syn&chronizovať prehliadanie"
 MainPanel.PageControl.DirectoriesSheet.DirectoryOptionsGroup.Caption="Možnosti čítania priečinkov"
-MainPanel.PageControl.DirectoriesSheet.DirectoryOptionsGroup.CacheDirectoriesCheck.Caption="Povoliť ukladanie &navštívených vzdialených priečinkov do vyrovnávacej pamäte"
+MainPanel.PageControl.DirectoriesSheet.DirectoryOptionsGroup.CacheDirectoriesCheck.Caption="Ukladať &navštívené vzdialené priečinky do vyrov. pamäte"
 MainPanel.PageControl.DirectoriesSheet.DirectoryOptionsGroup.CacheDirectoryChangesCheck.Caption="Ukladať &zmeny do vyrov. pamäte"
 MainPanel.PageControl.DirectoriesSheet.DirectoryOptionsGroup.ResolveSymlinksCheck.Caption="Dohľadávať &symbolické odkazy"
 MainPanel.PageControl.DirectoriesSheet.DirectoryOptionsGroup.PreserveDirectoryChangesCheck.Caption="S&tála vyrov. pamäť"
@@ -1562,7 +1562,7 @@ MainPanel.PageControl.DirectoriesSheet.DirectoryOptionsGroup.FollowDirectorySyml
 MainPanel.PageControl.RecycleBinSheet.Caption="Kôš"
 MainPanel.PageControl.RecycleBinSheet.RecycleBinGroup.Caption="Kôš"
 MainPanel.PageControl.RecycleBinSheet.RecycleBinGroup.RecycleBinPathLabel.Caption="&Vzdialený kôš"
-MainPanel.PageControl.RecycleBinSheet.RecycleBinGroup.DeleteToRecycleBinCheck.Caption="&Zachovať zmazané vzdialené súbory v koši"
+MainPanel.PageControl.RecycleBinSheet.RecycleBinGroup.DeleteToRecycleBinCheck.Caption="&Zachovať vymazané vzdialené súbory v koši"
 MainPanel.PageControl.RecycleBinSheet.RecycleBinGroup.OverwrittenToRecycleBinCheck.Caption="Zachovať &prepísané vzdialené súbory v koši (iba SFTP)"
 MainPanel.PageControl.EncryptionSheet.Caption="Šifrovanie"
 MainPanel.PageControl.EncryptionSheet.EncryptFilesCheck.Caption="Za&šifrovať súbory"
@@ -1589,7 +1589,7 @@ MainPanel.PageControl.ScpSheet.ShellGroup.Caption="Shell"
 MainPanel.PageControl.ScpSheet.ShellGroup.Label19.Caption="S&hell:"
 MainPanel.PageControl.ScpSheet.ShellGroup.Label20.Caption="&Kód návratu premennej:"
 MainPanel.PageControl.ScpSheet.ShellGroup.ShellEdit.Items.Strings.0="Predvolený"
-MainPanel.PageControl.ScpSheet.ShellGroup.ReturnVarEdit.Items.Strings.0="Automatické detegovanie"
+MainPanel.PageControl.ScpSheet.ShellGroup.ReturnVarEdit.Items.Strings.0="Autodetekcia"
 MainPanel.PageControl.ScpSheet.ScpLsOptionsGroup.Caption="Výpis priečinka"
 MainPanel.PageControl.ScpSheet.ScpLsOptionsGroup.Label9.Caption="Príkaz pre &výpis:"
 MainPanel.PageControl.ScpSheet.ScpLsOptionsGroup.IgnoreLsWarningsCheck.Caption="&Ignorovať varovania LS"
@@ -2250,7 +2250,7 @@ COPY_INFO_PRESERVE_READONLY="Zachovať len na čítanie"
 SCRIPT_SYNCHRONIZE_COLLECTING="Porovnáva sa..."
 SCRIPT_SYNCHRONIZE_SYNCHRONIZING="Synchronizuje sa..."
 SCRIPT_SYNCHRONIZE_NODIFFERENCE="Nie je čo synchronizovať"
-SPEED_UNLIMITED="bez obmedzenia"
+SPEED_UNLIMITED="Neobmedzene"
 FTPS_IMPLICIT="Implicitné šifrovanie SSL/TLS"
 FTPS_EXPLICIT="Explicitné šifrovanie TLS/SSL"
 SCRIPT_ECHO_DESC="Zobraziť jeho argumenty ako správu"
@@ -2803,7 +2803,7 @@ COPY_QUEUE="%s (pridať do fronty na prenos)"
 SHORTCUT_NONE="Žiadny"
 SHORTCUT_CAPTION="Vybrať klávesovú skratku"
 SHORTCUT_LABEL="Kláv&esová skratka:"
-PREFERENCES_RECONNECT_TIMEOUT_UNLIMITED="bez obmedzenia"
+PREFERENCES_RECONNECT_TIMEOUT_UNLIMITED="Neobmedzene"
 MASTER_PASSWORD_CAPTION="Primárne heslo"
 MASTER_PASSWORD_CURRENT="&Aktuálne primárne heslo:"
 MASTER_PASSWORD_NEW="&Nové primárne heslo:"
@@ -2928,7 +2928,7 @@ LOGIN_PUBLIC_KEY_TITLE="Vybrať kľúč na inštaláciu na server"
 LOGIN_PUBLIC_KEY_FILTER="Súbory s privátnym kľúčom PuTTY (*.ppk)|*.ppk|Všetky súbory s privátnym kľúčom (*.ppk;*.pem;*.key;id_*)|*.ppk;*.pem;*.key;id_*|Všetky súbory (*.*)|*.*"
 SYNCHRONIZE_CHECKLIST_CAPTION="Potvrdenie akcií synchronizácie"
 EDITOR_READONLY="Len na čítanie"
-PROGRESS_TIME_LEFT_CALCULATING="Prebieha výpočet"
+PROGRESS_TIME_LEFT_CALCULATING="Vypočítava sa"
 COPY_PARAM_SAVE_PRESET="Uložiť ako &prednastavenie"
 RENAME_SESSION_TITLE="Premenovať reláciu"
 RENAME_SESSION_PROMPT="&Nový názov relácie:"

+ 2 - 2
translations/version.ini

@@ -1,6 +1,6 @@
 [Version]
 CS=261
-DE=151
+DE=152
 ES=86
 FI=100
 FR=113
@@ -29,7 +29,7 @@ KO=51
 AR=43
 DA=20
 ET=23
-SK=65
+SK=66
 CH=135
 SQ=3
 TR=54