Tommy 碎碎念
https://blog.teatime.com.tw/
Tommy Wu's blog
tommy
2024-03-19T13:38:31Z
-
讓 Nginx 的 real_ip 模組找不到對應的 header 時, 使用 proxy protocol 傳入的 IP
https://blog.teatime.com.tw/1/post/493
<p>最近把 DNS 轉到 <a href="https://www.cloudflare.com/" target="_blank" rel="noopener">Cloudflare</a> 使用, 原本在主機上使用 <a href="https://www.haproxy.org/" target="_blank" rel="noopener">HAProxy</a> 把 SSL 的封包轉到個別對應的軟體是使用 Proxy Protocol 將來源 IP 通知處理的軟體. 在改用 Cloudflare 之後, 這個 IP 就變成 Cloudflare 的 IP 了. 這個在需要知道來源 IP 的軟體上, 就反而造成問題.</p>
<p>通常會走 Cloudflare 進來的, 也都是網頁的服務 (其他同樣使用 SSL 走 443 的服務, 也不需要透過 Cloudflare 處理, 通常可以在 DNS 上另外設定來避開). 依據 Cloudflare 的作法, 是應該使用 HTTP 的 header CF-Connecting-IP 來取得真實的來源 IP. 不過.... 由於我這邊是先透過 HAProxy 處理過, 混雜了來自 Cloudflare 與沒經過 Cloudflare 的封包 (例如內部網路的機器), 這時, 就變成使用 CF-Connecting-IP 時, 非來自 Cloudflare 的 IP 變成 HAProxy 的 127.0.0.1, 如果使用 Proxy Protocol 時, 那些透過 Cloudflare 的封包, 來源 IP 又全變成 Cloudflare 的 IP 了.</p>
<p>看了一下 <a href="https://nginx.org/" target="_blank" rel="noopener">Nginx</a> 的 real_ip 模組設定, <a href="http://nginx.org/en/docs/http/ngx_http_realip_module.html" target="_blank" rel="noopener">real_ip_header</a> 就只能設定一種, 不能有多重的設定, 所以就只好看一下 source, 自己動手來修改.</p>
<pre class="language-diff"><code>--- nginx-1.23.3/src/http/modules/ngx_http_realip_module.c.orig 2023-03-19 11:18:38.033783262 +0800
+++ nginx-1.23.3/src/http/modules/ngx_http_realip_module.c 2023-03-19 11:17:30.029338872 +0800
@@ -157,7 +157,8 @@
case NGX_HTTP_REALIP_XREALIP:
if (r->headers_in.x_real_ip == NULL) {
- return NGX_DECLINED;
+ //return NGX_DECLINED;
+ goto try_proxy_protocol;
}
value = &r->headers_in.x_real_ip->value;
@@ -170,7 +171,8 @@
xfwd = r->headers_in.x_forwarded_for;
if (xfwd == NULL) {
- return NGX_DECLINED;
+ //return NGX_DECLINED;
+ goto try_proxy_protocol;
}
value = NULL;
@@ -178,6 +180,7 @@
break;
case NGX_HTTP_REALIP_PROXY:
+try_proxy_protocol:
if (r->connection->proxy_protocol == NULL) {
return NGX_DECLINED;
}
@@ -219,7 +222,8 @@
}
}
- return NGX_DECLINED;
+ //return NGX_DECLINED;
+ goto try_proxy_protocol;
}
found:
</code></pre>
<p>修改的方式其實不難, 這邊的處理雖然是用 switch case 來獨立處理, 不過可以發現其實是不是透過 Proxy Protocol 處理過, 是有方法可以判斷的, 所以我們只要在其中每一種用來取得 real_ip 的 case 中, 如果最後沒有處理到, 就轉給 Proxy Protocol 那一段來處理就可以.</p>
<p>這樣子修改後, 我們依舊可以在 Nginx 中設定</p>
<pre class="language-nginx"><code>real_ip_header CF-Connecting-IP;</code></pre>
<p>就算是沒有這個 header 的來源, 一樣仍透過 Proxy Protocol 處理, 就算也沒透過 Proxy Protocol, 一樣可以判斷出來而不會造成問題.</p>
Linux
Patch
Nginx
2023-03-24T10:08:25Z
tommy
-
讓 vsftpd 3.0.3 在 local 網路連線時, 不使用 pasv_address 的設定
https://blog.teatime.com.tw/1/post/487
<p>近來 (應該也有一陣子了) 發現用 <a href="https://filezilla-project.org/" target="_blank">FileZilla</a> 連到家裡的 ftp 時, 使用 TLS 連線會每隔 20 秒出現一次逾時錯誤訊息就離線. 而且在部網路直接連線時, 會有一樣的問題, 應該跟 firewall 沒關係. <a href="https://forum.filezilla-project.org/viewtopic.php?f=2&t=7688" target="_blank">在 FileZilla 的討論區有提到 Pure-ftpd <= 1.0.38 時會有問題</a>, 不過家裡的伺服器應該是 1.0.46 (印象中, 以前使用 1.0.3x 的版本並沒有這個錯誤). 所以試著換了 <a href="https://security.appspot.com/vsftpd.html" target="_blank">vsftpd</a> 3.0.3 來使用, 還真的就不會出現這個訊息了.</p><p>不過換上 vsftpd 之後, 就碰到之前在 <a href="https://www.pureftpd.org/project/pure-ftpd" target="_blank">pure-ftpd</a> 時相同的問題, 就是使用 passive 模式時, 如果指定使用外部的 ip 之後, 會造成內部的連線也收到外部的 ip 而無法使用. 如果不指定外部 ip 時, 會造成外部的連線收到內部的 ip 而無法連線 (使用 filezilla 時, 這情形會用連線的 ip 取代, 可以繼續使用).</p><p>所以... 就把之前給 pure-ftpd 的 patch 改了一下給 vsftpd 用:</p><pre class="diff"><div class="insertcode">diff --show-c-function -Nur vsftpd-3.0.3.orig/main.c vsftpd-3.0.3/main.c<br /><span class="re3">--- vsftpd-3.0.3.orig/main.c 2012-09-16 12:27:13.000000000 +0800</span><br /><span class="re4">+++ vsftpd-3.0.3/main.c 2017-09-28 21:10:16.620440681 +0800</span><br /><span class="re6">@@ -32,6 +32,70 @@ static void session_init<span class="br0">(</span>struct vsf_sess</span><br /> static void env_init<span class="br0">(</span>void<span class="br0">)</span>;<br /> static void limits_init<span class="br0">(</span>void<span class="br0">)</span>;<br /> <br /><span class="re8">+// add by twu2 20170928 begin</span><br /><span class="re8">+#include <stdio.h></span><br /><span class="re8">+#include "filestr.h"</span><br /><span class="re8">+// check local net in /etc/localnet</span><br /><span class="re8">+static int check_local_net<span class="br0">(</span>const struct vsf_sysutil_sockaddr * const addr<span class="br0">)</span></span><br /><span class="re8">+<span class="br0">{</span></span><br /><span class="re8">+ unsigned long a1 = 0U;</span><br /><span class="re8">+ unsigned long a2 = 0U;</span><br /><span class="re8">+ unsigned long mask = 0U;</span><br /><span class="re8">+ unsigned int b1, b2, b3, b4;</span><br /><span class="re8">+ unsigned int m1, m2, m3, m4;</span><br /><span class="re8">+ static struct mystr s_curr_line_str;</span><br /><span class="re8">+ unsigned int pos = <span class="nu0">0</span>;</span><br /><span class="re8">+ struct mystr localnet_file = INIT_MYSTR;</span><br /><span class="re8">+ int retval = -<span class="nu0">1</span>;</span><br /><span class="re8">+ const void* p_v4addr;</span><br /><span class="re8">+ int is_ipv6;</span><br /><span class="re8">+ const char *ip;</span><br /><span class="re8">+ int is_local;</span><br /><span class="re8">+</span><br /><span class="re8">+ if <span class="br0">(</span>!addr<span class="br0">)</span> return <span class="nu0">0</span>;</span><br /><span class="re8">+ is_ipv6 = vsf_sysutil_sockaddr_is_ipv6<span class="br0">(</span>addr<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>is_ipv6<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ p_v4addr = vsf_sysutil_sockaddr_ipv6_v4<span class="br0">(</span>addr<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>!p_v4addr<span class="br0">)</span> return <span class="nu0">0</span>;</span><br /><span class="re8">+ ip = vsf_sysutil_inet_ntoa<span class="br0">(</span>p_v4addr<span class="br0">)</span>;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ else</span><br /><span class="re8">+ ip = vsf_sysutil_inet_ntop<span class="br0">(</span>addr<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>!ip<span class="br0">)</span> return <span class="nu0">0</span>;</span><br /><span class="re8">+ b1 = b2 = b3 = b4 = <span class="nu0">0</span>;</span><br /><span class="re8">+ if <span class="br0">(</span><span class="br0">(</span>sscanf<span class="br0">(</span>ip, "%u.%u.%u.%u", &b1, &b2, &b3, &b4<span class="br0">)</span> != <span class="nu0">4</span><span class="br0">)</span> ||</span><br /><span class="re8">+ b1 > 255U || b2 > 255U || b3 > 255U || b4 > 255U ||</span><br /><span class="re8">+ <span class="br0">(</span>b1 | b2 | b3 | b4<span class="br0">)</span> == 0U<span class="br0">)</span></span><br /><span class="re8">+ return <span class="nu0">0</span>;</span><br /><span class="re8">+ a1 = b1 << <span class="nu0">24</span> | b2 << <span class="nu0">16</span> | b3 << <span class="nu0">8</span> | b4;</span><br /><span class="re8">+ retval = str_fileread<span class="br0">(</span>&localnet_file, tunable_local_net_file,</span><br /><span class="re8">+ VSFTP_CONF_FILE_MAX<span class="br0">)</span>;</span><br /><span class="re8">+ // no localnet file</span><br /><span class="re8">+ if <span class="br0">(</span>vsf_sysutil_retval_is_error<span class="br0">(</span>retval<span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ return <span class="nu0">0</span>;</span><br /><span class="re8">+ is_local = <span class="nu0">0</span>;</span><br /><span class="re8">+ while <span class="br0">(</span>str_getline<span class="br0">(</span>&localnet_file, &s_curr_line_str, &pos<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ b1 = b2 = b3 = b4 = m1 = m2 = m3 = m4 = <span class="nu0">0</span>;</span><br /><span class="re8">+ if <span class="br0">(</span><span class="br0">(</span>sscanf<span class="br0">(</span>str_getbuf<span class="br0">(</span>&s_curr_line_str<span class="br0">)</span>, "%u.%u.%u.%u/%u.%u.%u.%u", &b1, &b2, &b3, &b4, &m1, &m2, &m3, &m4<span class="br0">)</span> != <span class="nu0">8</span><span class="br0">)</span> ||</span><br /><span class="re8">+ b1 > 255U || b2 > 255U || b3 > 255U || b4 > 255U ||</span><br /><span class="re8">+ <span class="br0">(</span>b1 | b2 | b3 | b4<span class="br0">)</span> == 0U ||</span><br /><span class="re8">+ m1 > 255U || m2 > 255U || m3 > 255U || m4 > 255U ||</span><br /><span class="re8">+ <span class="br0">(</span>m1 | m2 | m3 | m4<span class="br0">)</span> == 0U<span class="br0">)</span></span><br /><span class="re8">+ continue;</span><br /><span class="re8">+ a2 = b1 << <span class="nu0">24</span> | b2 << <span class="nu0">16</span> | b3 << <span class="nu0">8</span> | b4;</span><br /><span class="re8">+ mask = m1 << <span class="nu0">24</span> | m2 << <span class="nu0">16</span> | m3 << <span class="nu0">8</span> | m4;</span><br /><span class="re8">+ // correct format</span><br /><span class="re8">+ if <span class="br0">(</span><span class="br0">(</span>a1 & mask<span class="br0">)</span> == <span class="br0">(</span>a2 & mask<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ // same subnet</span><br /><span class="re8">+ is_local = <span class="nu0">1</span>;</span><br /><span class="re8">+ break;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ str_free<span class="br0">(</span>&localnet_file<span class="br0">)</span>;</span><br /><span class="re8">+ return is_local;</span><br /><span class="re8">+<span class="br0">}</span></span><br /><span class="re8">+// add by twu2 20170928 end</span><br /><span class="re8">+</span><br /> int<br /> main<span class="br0">(</span>int argc, const char* argv<span class="br0">[</span><span class="br0">]</span><span class="br0">)</span><br /> <span class="br0">{</span><br /><span class="re6">@@ -67,6 +131,12 @@ main<span class="br0">(</span>int argc, const char* argv<span class="br0">[</span><span class="br0">]</span><span class="br0">)</span></span><br /> <span class="nu0">0</span>, <span class="nu0">0</span>, <span class="nu0">0</span>, <span class="nu0">0</span>, <span class="nu0">0</span>, INIT_MYSTR, <span class="nu0">0</span>, -<span class="nu0">1</span>, -<span class="nu0">1</span>,<br /> /* Login fails */<br /> <span class="nu0">0</span><br /><span class="re8">+ // add by twu2 20170928 begin</span><br /><span class="re8">+ /* is_local */</span><br /><span class="re8">+ ,0</span><br /><span class="re8">+ /* nomaxrate */</span><br /><span class="re8">+ ,0</span><br /><span class="re8">+ // add by twu2 20170928 end</span><br /> <span class="br0">}</span>;<br /> int config_loaded = <span class="nu0">0</span>;<br /> int i;<br /><span class="re6">@@ -243,6 +313,9 @@ main<span class="br0">(</span>int argc, const char* argv<span class="br0">[</span><span class="br0">]</span><span class="br0">)</span></span><br /> tunable_chown_uploads = <span class="nu0">0</span>;<br /> <span class="br0">}</span><br /> <span class="br0">}</span><br /><span class="re8">+ // add by twu2 20170928 begin</span><br /><span class="re8">+ the_session.is_local = check_local_net<span class="br0">(</span>the_session.p_remote_addr<span class="br0">)</span>;</span><br /><span class="re8">+ // add by twu2 20170928 end</span><br /> if <span class="br0">(</span>tunable_one_process_model<span class="br0">)</span><br /> <span class="br0">{</span><br /> vsf_one_process_start<span class="br0">(</span>&the_session<span class="br0">)</span>;<br />diff --show-c-function -Nur vsftpd-3.0.3.orig/parseconf.c vsftpd-3.0.3/parseconf.c<br /><span class="re3">--- vsftpd-3.0.3.orig/parseconf.c 2017-09-28 14:40:29.000000000 +0800</span><br /><span class="re4">+++ vsftpd-3.0.3/parseconf.c 2017-09-28 21:10:31.892567245 +0800</span><br /><span class="re6">@@ -158,6 +158,10 @@ parseconf_str_array<span class="br0">[</span><span class="br0">]</span> =</span><br /> <span class="br0">{</span> "ftpd_banner", &tunable_ftpd_banner <span class="br0">}</span>,<br /> <span class="br0">{</span> "banned_email_file", &tunable_banned_email_file <span class="br0">}</span>,<br /> <span class="br0">{</span> "chroot_list_file", &tunable_chroot_list_file <span class="br0">}</span>,<br /><span class="re8">+ // add by twu2 20170928 begin</span><br /><span class="re8">+ <span class="br0">{</span> "local_net_file", &tunable_local_net_file <span class="br0">}</span>,</span><br /><span class="re8">+ <span class="br0">{</span> "nomaxrate_list_file", &tunable_nomaxrate_list_file <span class="br0">}</span>,</span><br /><span class="re8">+ // add by twu2 20170928 end</span><br /> <span class="br0">{</span> "pam_service_name", &tunable_pam_service_name <span class="br0">}</span>,<br /> <span class="br0">{</span> "guest_username", &tunable_guest_username <span class="br0">}</span>,<br /> <span class="br0">{</span> "userlist_file", &tunable_userlist_file <span class="br0">}</span>,<br />diff --show-c-function -Nur vsftpd-3.0.3.orig/postlogin.c vsftpd-3.0.3/postlogin.c<br /><span class="re3">--- vsftpd-3.0.3.orig/postlogin.c 2017-09-28 14:40:29.000000000 +0800</span><br /><span class="re4">+++ vsftpd-3.0.3/postlogin.c 2017-09-28 22:27:59.791545391 +0800</span><br /><span class="re6">@@ -94,6 +94,10 @@ process_post_login<span class="br0">(</span>struct vsf_session* p</span><br /> vsf_sysutil_set_umask<span class="br0">(</span>tunable_local_umask<span class="br0">)</span>;<br /> p_sess->bw_rate_max = tunable_local_max_rate;<br /> <span class="br0">}</span><br /><span class="re8">+ // modified by twu2 20170928 begin</span><br /><span class="re8">+ if <span class="br0">(</span>p_sess->nomaxrate<span class="br0">)</span></span><br /><span class="re8">+ p_sess->bw_rate_max = <span class="nu0">0</span>;</span><br /><span class="re8">+ // modified by twu2 20170928 end</span><br /> if <span class="br0">(</span>p_sess->is_http<span class="br0">)</span><br /> <span class="br0">{</span><br /> handle_http<span class="br0">(</span>p_sess<span class="br0">)</span>;<br /><span class="re6">@@ -606,8 +610,10 @@ handle_pasv<span class="br0">(</span>struct vsf_session* p_sess,</span><br /> str_append_text<span class="br0">(</span>&s_pasv_res_str, "|<span class="br0">)</span>"<span class="br0">)</span>;<br /> vsf_cmdio_write_str<span class="br0">(</span>p_sess, FTP_EPSVOK, &s_pasv_res_str<span class="br0">)</span>;<br /> return;<br /><span class="re7">- <span class="br0">}</span></span><br /><span class="re7">- if <span class="br0">(</span>tunable_pasv_address != 0<span class="br0">)</span></span><br /><span class="re8">+ <span class="br0">}</span> </span><br /><span class="re8">+ // modified by twu2 20170928 begin</span><br /><span class="re8">+ if <span class="br0">(</span>tunable_pasv_address != 0 && p_sess->is_local == 0<span class="br0">)</span></span><br /><span class="re8">+ // modified by twu2 20170928 end</span><br /> <span class="br0">{</span><br /> vsf_sysutil_sockaddr_alloc_ipv4<span class="br0">(</span>&s_p_sockaddr<span class="br0">)</span>;<br /> /* Report passive address as specified in configuration */<br /><span class="re6">@@ -1829,6 +1835,12 @@ handle_stat<span class="br0">(</span>struct vsf_session* p_sess<span class="br0">)</span></span><br /> vsf_cmdio_write_hyphen<span class="br0">(</span>p_sess, FTP_STATOK, "FTP server status:"<span class="br0">)</span>;<br /> vsf_cmdio_write_raw<span class="br0">(</span>p_sess, " Connected to "<span class="br0">)</span>;<br /> vsf_cmdio_write_raw<span class="br0">(</span>p_sess, str_getbuf<span class="br0">(</span>&p_sess->remote_ip_str<span class="br0">)</span><span class="br0">)</span>;<br /><span class="re8">+ // modified by twu2 20170928 begin</span><br /><span class="re8">+ if <span class="br0">(</span>p_sess->is_local<span class="br0">)</span></span><br /><span class="re8">+ vsf_cmdio_write_raw<span class="br0">(</span>p_sess, ", <span class="br0">(</span>LAN<span class="br0">)</span>"<span class="br0">)</span>;</span><br /><span class="re8">+ else</span><br /><span class="re8">+ vsf_cmdio_write_raw<span class="br0">(</span>p_sess, ", <span class="br0">(</span>WAN<span class="br0">)</span>"<span class="br0">)</span>;</span><br /><span class="re8">+ // modified by twu2 20170928 end</span><br /> vsf_cmdio_write_raw<span class="br0">(</span>p_sess, "\r\n"<span class="br0">)</span>;<br /> vsf_cmdio_write_raw<span class="br0">(</span>p_sess, " Logged in as "<span class="br0">)</span>;<br /> vsf_cmdio_write_raw<span class="br0">(</span>p_sess, str_getbuf<span class="br0">(</span>&p_sess->user_str<span class="br0">)</span><span class="br0">)</span>;<br />diff --show-c-function -Nur vsftpd-3.0.3.orig/session.h vsftpd-3.0.3/session.h<br /><span class="re3">--- vsftpd-3.0.3.orig/session.h 2012-04-05 09:27:19.000000000 +0800</span><br /><span class="re4">+++ vsftpd-3.0.3/session.h 2017-09-28 21:09:03.871838330 +0800</span><br /><span class="re6">@@ -99,6 +99,10 @@ struct vsf_session</span><br /> int ssl_slave_fd;<br /> int ssl_consumer_fd;<br /> unsigned int login_fails;<br /><span class="re8">+ // add by twu2 20170928 begin</span><br /><span class="re8">+ int is_local;</span><br /><span class="re8">+ int nomaxrate;</span><br /><span class="re8">+ // add by twu2 20170928 end</span><br /> <span class="br0">}</span>;<br /> <br /> #endif /* VSF_SESSION_H */<br />diff --show-c-function -Nur vsftpd-3.0.3.orig/tunables.c vsftpd-3.0.3/tunables.c<br /><span class="re3">--- vsftpd-3.0.3.orig/tunables.c 2017-09-28 14:40:29.000000000 +0800</span><br /><span class="re4">+++ vsftpd-3.0.3/tunables.c 2017-09-28 21:10:58.748789905 +0800</span><br /><span class="re6">@@ -<span class="nu0">121</span>,<span class="nu0">6</span> +<span class="nu0">121</span>,<span class="nu0">10</span> @@ const char* tunable_nopriv_user;</span><br /> const char* tunable_ftpd_banner;<br /> const char* tunable_banned_email_file;<br /> const char* tunable_chroot_list_file;<br /><span class="re8">+// add by twu2 20170928 begin</span><br /><span class="re8">+const char* tunable_local_net_file;</span><br /><span class="re8">+const char* tunable_nomaxrate_list_file;</span><br /><span class="re8">+// add by twu2 20170928 end</span><br /> const char* tunable_pam_service_name;<br /> const char* tunable_guest_username;<br /> const char* tunable_userlist_file;<br /><span class="re6">@@ -268,6 +272,10 @@ tunables_load_defaults<span class="br0">(</span><span class="br0">)</span></span><br /> install_str_setting<span class="br0">(</span><span class="nu0">0</span>, &tunable_ftpd_banner<span class="br0">)</span>;<br /> install_str_setting<span class="br0">(</span>"/etc/vsftpd.banned_emails", &tunable_banned_email_file<span class="br0">)</span>;<br /> install_str_setting<span class="br0">(</span>"/etc/vsftpd.chroot_list", &tunable_chroot_list_file<span class="br0">)</span>;<br /><span class="re8">+ // add by twu2 20170928 begin</span><br /><span class="re8">+ install_str_setting<span class="br0">(</span>"/etc/localnet", &tunable_local_net_file<span class="br0">)</span>;</span><br /><span class="re8">+ install_str_setting<span class="br0">(</span>"/etc/vsftpd.nomaxrate_list", &tunable_nomaxrate_list_file<span class="br0">)</span>;</span><br /><span class="re8">+ // add by twu2 20170928 end</span><br /> install_str_setting<span class="br0">(</span>"vsftpd", &tunable_pam_service_name<span class="br0">)</span>;<br /> install_str_setting<span class="br0">(</span>"ftp", &tunable_guest_username<span class="br0">)</span>;<br /> install_str_setting<span class="br0">(</span>"/etc/vsftpd.user_list", &tunable_userlist_file<span class="br0">)</span>;<br />diff --show-c-function -Nur vsftpd-3.0.3.orig/tunables.h vsftpd-3.0.3/tunables.h<br /><span class="re3">--- vsftpd-3.0.3.orig/tunables.h 2017-09-28 14:40:29.000000000 +0800</span><br /><span class="re4">+++ vsftpd-3.0.3/tunables.h 2017-09-28 20:57:15.750028392 +0800</span><br /><span class="re6">@@ -<span class="nu0">124</span>,<span class="nu0">6</span> +<span class="nu0">124</span>,<span class="nu0">10</span> @@ extern const char* tunable_nopriv_user;</span><br /> extern const char* tunable_ftpd_banner;<br /> extern const char* tunable_banned_email_file;<br /> extern const char* tunable_chroot_list_file;<br /><span class="re8">+// add by twu2 20170928 begin</span><br /><span class="re8">+extern const char* tunable_local_net_file;</span><br /><span class="re8">+extern const char* tunable_nomaxrate_list_file;</span><br /><span class="re8">+// add by twu2 20170928 end</span><br /> extern const char* tunable_pam_service_name;<br /> extern const char* tunable_guest_username;<br /> extern const char* tunable_userlist_file;<br />diff --show-c-function -Nur vsftpd-3.0.3.orig/twoprocess.c vsftpd-3.0.3/twoprocess.c<br /><span class="re3">--- vsftpd-3.0.3.orig/twoprocess.c 2012-09-16 15:15:49.000000000 +0800</span><br /><span class="re4">+++ vsftpd-3.0.3/twoprocess.c 2017-09-29 23:18:56.487053338 +0800</span><br /><span class="re6">@@ -358,6 +358,9 @@ process_login_req<span class="br0">(</span>struct vsf_session* p_</span><br /> if <span class="br0">(</span>do_chroot<span class="br0">)</span><br /> <span class="br0">{</span><br /> do_chroot = <span class="nu0">0</span>;<br /><span class="re8">+ // add by twu2 20170928 begin</span><br /><span class="re8">+ tunable_idle_session_timeout = <span class="nu0">0</span>;</span><br /><span class="re8">+ // add by twu2 20170928 end</span><br /> <span class="br0">}</span><br /> else<br /> <span class="br0">{</span><br /><span class="re6">@@ -366,6 +369,23 @@ process_login_req<span class="br0">(</span>struct vsf_session* p_</span><br /> <span class="br0">}</span><br /> str_free<span class="br0">(</span>&chroot_list_file<span class="br0">)</span>;<br /> <span class="br0">}</span><br /><span class="re8">+ // add by twu2 20170928 begin</span><br /><span class="re8">+ p_sess->nomaxrate = <span class="nu0">0</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>tunable_nomaxrate_list_file<span class="br0">)</span></span><br /><span class="re8">+ <span class="br0">{</span></span><br /><span class="re8">+ struct mystr nomaxrate_list_file = INIT_MYSTR;</span><br /><span class="re8">+ int retval;</span><br /><span class="re8">+</span><br /><span class="re8">+ retval = str_fileread<span class="br0">(</span>&nomaxrate_list_file, tunable_nomaxrate_list_file,</span><br /><span class="re8">+ VSFTP_CONF_FILE_MAX<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>!vsf_sysutil_retval_is_error<span class="br0">(</span>retval<span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ <span class="br0">{</span></span><br /><span class="re8">+ if <span class="br0">(</span>str_contains_line<span class="br0">(</span>&nomaxrate_list_file, &p_sess->user_str<span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ p_sess->nomaxrate = <span class="nu0">1</span>;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ str_free<span class="br0">(</span>&nomaxrate_list_file<span class="br0">)</span>;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ // add by twu2 20170928 end</span><br /> common_do_login<span class="br0">(</span>p_sess, &p_sess->user_str, do_chroot, <span class="nu0">0</span><span class="br0">)</span>;<br /> <span class="br0">}</span><br /> break;</div></pre><p> </p><p>檔案可以在這兒抓: <a href="https://www.teatime.com.tw/~tommy/mypatch/vsftpd-3.0.3-localnet.patch" target="_blank">https://www.teatime.com.tw/~tommy/mypatch/vsftpd-3.0.3-localnet.patch</a> </p><p>patch 的內容有三個部份:</p><p> </p><ol><li>主要是上面提到的 <a href="https://blog.teatime.com.tw/1/post/76" target="_blank">pasv_address 會依據 /etc/localnet 的內容決定是否使用</a> .</li><li>檢查 /etc/vsftpd.nomaxrate_list, 如果在裡頭就<a href="https://blog.teatime.com.tw/1/post/122" target="_blank">不限制傳輸的速度</a> </li><li>如果預設是 chroot, 而列在 /etc/vsftpd.chroot_list 是不使用 chroot 時, 則這些使用者也不會有 idle_timeout 的限制</li></ol>這些應該是之前也有寫給 pure-ftpd 使用的修改, 換回 vsftpd 之後, 順便就改回來了.<p> </p>
Patch
FTP
2017-10-01T09:26:26Z
tommy
-
讓 FileZilla 儲存所選擇的憑證, 而非只能儲存站台本身的憑證
https://blog.teatime.com.tw/1/post/478
<p>由於<a href="https://blog.teatime.com.tw/1/post/477" target="_blank">之前提到改用 Let's Encrypt 來產生憑證</a>之後, 會造成平均每兩個月就會更換一次憑證, 而 <a href="https://filezilla-project.org/index.php" target="_blank">FileZilla</a> 本身只能儲存並信任站台本身的憑證, 所以... 變成每次更換憑證會就會要求再信任一次.</p><p>所以, 就改了一下 FileZilla, 把憑證儲存的地方, 改成依據目前選擇查閱的憑證來儲存 (這時會改存 CN 而不是 Host, 而 Port 一律為 0), 然後在每次檢查信任憑證的地方, 改成檢查所有的憑證, 只要有一個是信任的就可以.</p><pre class="diff"><div class="insertcode">diff -Nurp filezilla.orig/src/interface/verifycertdialog.cpp filezilla/src/interface/verifycertdialog.cpp<br /><span class="re3">--- filezilla.orig/src/interface/verifycertdialog.cpp 2016-05-25 16:19:18.590183991 +0800</span><br /><span class="re4">+++ filezilla/src/interface/verifycertdialog.cpp 2016-05-26 13:14:03.897443962 +0800</span><br /><span class="re6">@@ -147,6 +147,7 @@ void CVerifyCertDialog::ShowVerification</span><br /> XRCCTRL<span class="br0">(</span>*m_pDlg, "ID_ALWAYS", wxCheckBox<span class="br0">)</span>->Hide<span class="br0">(</span><span class="br0">)</span>;<br /> <span class="br0">}</span><br /> <br /><span class="re8">+ m_curSelect = <span class="nu0">0</span>;</span><br /> m_certificates = notification.GetCertificates<span class="br0">(</span><span class="br0">)</span>;<br /> if <span class="br0">(</span>m_certificates.size<span class="br0">(</span><span class="br0">)</span> == <span class="nu0">1</span><span class="br0">)</span> <span class="br0">{</span><br /> XRCCTRL<span class="br0">(</span>*m_pDlg, "ID_CHAIN_DESC", wxStaticText<span class="br0">)</span>->Hide<span class="br0">(</span><span class="br0">)</span>;<br /><span class="re6">@@ -230,6 +231,52 @@ void CVerifyCertDialog::ShowVerification</span><br /> m_pDlg = <span class="nu0">0</span>;<br /> <span class="br0">}</span><br /> <br /><span class="re8">+wxString CVerifyCertDialog::GetCNValue<span class="br0">(</span>const wxString& dn<span class="br0">)</span></span><br /><span class="re8">+<span class="br0">{</span></span><br /><span class="re8">+ wxStringTokenizer tokens<span class="br0">(</span>dn, _T<span class="br0">(</span>","<span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re8">+</span><br /><span class="re8">+ std::list<wxString> tokenlist;</span><br /><span class="re8">+ while <span class="br0">(</span>tokens.HasMoreTokens<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ tokenlist.push_back<span class="br0">(</span>tokens.GetNextToken<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re8">+</span><br /><span class="re8">+ wxString prefix = _T<span class="br0">(</span>"CN="<span class="br0">)</span>;</span><br /><span class="re8">+ int len = prefix.Length<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+</span><br /><span class="re8">+ wxString value;</span><br /><span class="re8">+</span><br /><span class="re8">+ bool append = false;</span><br /><span class="re8">+</span><br /><span class="re8">+ auto iter = tokenlist.begin<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ while <span class="br0">(</span>iter != tokenlist.end<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ <span class="br0">{</span></span><br /><span class="re8">+ if <span class="br0">(</span>!append<span class="br0">)</span></span><br /><span class="re8">+ <span class="br0">{</span></span><br /><span class="re8">+ if <span class="br0">(</span>iter->Left<span class="br0">(</span>len<span class="br0">)</span> != prefix<span class="br0">)</span></span><br /><span class="re8">+ <span class="br0">{</span></span><br /><span class="re8">+ ++iter;</span><br /><span class="re8">+ continue;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ if <span class="br0">(</span>!value.empty<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ value += _T<span class="br0">(</span>"\n"<span class="br0">)</span>;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ else</span><br /><span class="re8">+ <span class="br0">{</span></span><br /><span class="re8">+ append = false;</span><br /><span class="re8">+ value += _T<span class="br0">(</span>","<span class="br0">)</span>;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ value += iter->Mid<span class="br0">(</span>len<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>iter->Last<span class="br0">(</span><span class="br0">)</span> == '\\'<span class="br0">)</span></span><br /><span class="re8">+ <span class="br0">{</span></span><br /><span class="re8">+ value.RemoveLast<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ append = true;</span><br /><span class="re8">+ len = <span class="nu0">0</span>;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ auto remove = iter++;</span><br /><span class="re8">+ tokenlist.erase<span class="br0">(</span>remove<span class="br0">)</span>;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ return value;</span><br /><span class="re8">+<span class="br0">}</span></span><br /><span class="re8">+</span><br /> void CVerifyCertDialog::ParseDN<span class="br0">(</span>wxWindow* parent, const wxString& dn, wxSizer* pSizer<span class="br0">)</span><br /> <span class="br0">{</span><br /> pSizer->Clear<span class="br0">(</span>true<span class="br0">)</span>;<br /><span class="re6">@@ -329,11 +376,28 @@ bool CVerifyCertDialog::IsTrusted<span class="br0">(</span>CCerti</span><br /> <br /> LoadTrustedCerts<span class="br0">(</span><span class="br0">)</span>;<br /> <br /><span class="re7">- unsigned int len;</span><br /><span class="re7">- CCertificate cert = notification.GetCertificates<span class="br0">(</span><span class="br0">)</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span>;</span><br /><span class="re7">- const unsigned char* data = cert.GetRawData<span class="br0">(</span>len<span class="br0">)</span>;</span><br /><span class="re8">+ for <span class="br0">(</span>unsigned int i = <span class="nu0">0</span>; i < notification.GetCertificates<span class="br0">(</span><span class="br0">)</span>.size<span class="br0">(</span><span class="br0">)</span>; ++i<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ if <span class="br0">(</span>i > 0<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ unsigned int len;</span><br /><span class="re8">+ CCertificate cert = notification.GetCertificates<span class="br0">(</span><span class="br0">)</span><span class="br0">[</span>i<span class="br0">]</span>;</span><br /><span class="re8">+ const unsigned char* data = cert.GetRawData<span class="br0">(</span>len<span class="br0">)</span>;</span><br /><span class="re8">+ wxString sCN = GetCNValue<span class="br0">(</span>cert.GetSubject<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>;</span><br /> <br /><span class="re7">- return IsTrusted<span class="br0">(</span>notification.GetHost<span class="br0">(</span><span class="br0">)</span>, notification.GetPort<span class="br0">(</span><span class="br0">)</span>, data, len, false<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>IsTrusted<span class="br0">(</span>sCN, 0, data, len, false<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ return true;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ else <span class="br0">{</span></span><br /><span class="re8">+ unsigned int len;</span><br /><span class="re8">+ CCertificate cert = notification.GetCertificates<span class="br0">(</span><span class="br0">)</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span>;</span><br /><span class="re8">+ const unsigned char* data = cert.GetRawData<span class="br0">(</span>len<span class="br0">)</span>;</span><br /><span class="re8">+</span><br /><span class="re8">+ if <span class="br0">(</span>IsTrusted<span class="br0">(</span>notification.GetHost<span class="br0">(</span><span class="br0">)</span>, notification.GetPort<span class="br0">(</span><span class="br0">)</span>, data, len, false<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ return true;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ return false;</span><br /> <span class="br0">}</span><br /> <br /> bool CVerifyCertDialog::DoIsTrusted<span class="br0">(</span>const wxString& host, int port, const unsigned char* data, unsigned int len, std::list<CVerifyCertDialog::t_certData> const& trustedCerts<span class="br0">)</span><br /><span class="re6">@@ -465,7 +529,10 @@ void CVerifyCertDialog::LoadTrustedCerts</span><br /> <br /> data.host = GetTextElement<span class="br0">(</span>cert, "Host"<span class="br0">)</span>;<br /> data.port = GetTextElementInt<span class="br0">(</span>cert, "Port"<span class="br0">)</span>;<br /><span class="re7">- if <span class="br0">(</span>data.host.empty<span class="br0">(</span><span class="br0">)</span> || data.port < <span class="nu0">1</span> || data.port > 65535<span class="br0">)</span></span><br /><span class="re8">+ if <span class="br0">(</span>data.port == 0<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ // use for non-first cert</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ else if <span class="br0">(</span>data.host.empty<span class="br0">(</span><span class="br0">)</span> || data.port < <span class="nu0">1</span> || data.port > 65535<span class="br0">)</span></span><br /> remove = cert;<br /> <br /> int64_t activationTime = GetTextElementInt<span class="br0">(</span>cert, "ActivationTime", <span class="nu0">0</span><span class="br0">)</span>;<br /><span class="re6">@@ -498,20 +565,35 @@ void CVerifyCertDialog::LoadTrustedCerts</span><br /> <br /> void CVerifyCertDialog::SetPermanentlyTrusted<span class="br0">(</span>CCertificateNotification const& notification<span class="br0">)</span><br /> <span class="br0">{</span><br /><span class="re7">- const CCertificate certificate = notification.GetCertificates<span class="br0">(</span><span class="br0">)</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span>;</span><br /><span class="re8">+ wxString sCN = _T<span class="br0">(</span>""<span class="br0">)</span>;</span><br /><span class="re8">+ const CCertificate certificate = notification.GetCertificates<span class="br0">(</span><span class="br0">)</span><span class="br0">[</span>m_curSelect<span class="br0">]</span>;</span><br /> unsigned int len;<br /> const unsigned char* const data = certificate.GetRawData<span class="br0">(</span>len<span class="br0">)</span>;<br /> <br /> CReentrantInterProcessMutexLocker mutex<span class="br0">(</span>MUTEX_TRUSTEDCERTS<span class="br0">)</span>;<br /> LoadTrustedCerts<span class="br0">(</span><span class="br0">)</span>;<br /> <br /><span class="re7">- if <span class="br0">(</span>IsTrusted<span class="br0">(</span>notification.GetHost<span class="br0">(</span><span class="br0">)</span>, notification.GetPort<span class="br0">(</span><span class="br0">)</span>, data, len, true<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re7">- return;</span><br /><span class="re8">+ if <span class="br0">(</span>m_curSelect > 0<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ sCN = GetCNValue<span class="br0">(</span>certificate.GetSubject<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>IsTrusted<span class="br0">(</span>sCN, 0, data, len, true<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ return;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ else <span class="br0">{</span></span><br /><span class="re8">+ if <span class="br0">(</span>IsTrusted<span class="br0">(</span>notification.GetHost<span class="br0">(</span><span class="br0">)</span>, notification.GetPort<span class="br0">(</span><span class="br0">)</span>, data, len, true<span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ return;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /> <span class="br0">}</span><br /> <br /> t_certData cert;<br /><span class="re7">- cert.host = notification.GetHost<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re7">- cert.port = notification.GetPort<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>m_curSelect > 0<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ cert.host = sCN;</span><br /><span class="re8">+ cert.port = <span class="nu0">0</span>;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ else <span class="br0">{</span></span><br /><span class="re8">+ cert.host = notification.GetHost<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ cert.port = notification.GetPort<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /> cert.len = len;<br /> cert.data = new unsigned char<span class="br0">[</span>len<span class="br0">]</span>;<br /> memcpy<span class="br0">(</span>cert.data, data, len<span class="br0">)</span>;<br /><span class="re6">@@ -534,8 +616,14 @@ void CVerifyCertDialog::SetPermanentlyTr</span><br /> AddTextElement<span class="br0">(</span>xCert, "Data", ConvertHexToString<span class="br0">(</span>data, len<span class="br0">)</span><span class="br0">)</span>;<br /> AddTextElement<span class="br0">(</span>xCert, "ActivationTime", static_cast<int64_t><span class="br0">(</span>certificate.GetActivationTime<span class="br0">(</span><span class="br0">)</span>.get_time_t<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span>;<br /> AddTextElement<span class="br0">(</span>xCert, "ExpirationTime", static_cast<int64_t><span class="br0">(</span>certificate.GetExpirationTime<span class="br0">(</span><span class="br0">)</span>.get_time_t<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span>;<br /><span class="re7">- AddTextElement<span class="br0">(</span>xCert, "Host", notification.GetHost<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re7">- AddTextElement<span class="br0">(</span>xCert, "Port", notification.GetPort<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>m_curSelect > 0<span class="br0">)</span> <span class="br0">{</span></span><br /><span class="re8">+ AddTextElement<span class="br0">(</span>xCert, "Host", sCN<span class="br0">)</span>;</span><br /><span class="re8">+ AddTextElement<span class="br0">(</span>xCert, "Port", <span class="nu0">0</span><span class="br0">)</span>;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ else <span class="br0">{</span></span><br /><span class="re8">+ AddTextElement<span class="br0">(</span>xCert, "Host", notification.GetHost<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re8">+ AddTextElement<span class="br0">(</span>xCert, "Port", notification.GetPort<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /> <br /> m_xmlFile.Save<span class="br0">(</span>true<span class="br0">)</span>;<br /> <span class="br0">}</span><br /><span class="re6">@@ -590,6 +678,7 @@ void CVerifyCertDialog::OnCertificateCho</span><br /> int sel = event.GetSelection<span class="br0">(</span><span class="br0">)</span>;<br /> if <span class="br0">(</span>sel < <span class="nu0">0</span> || sel > <span class="br0">(</span>int<span class="br0">)</span>m_certificates.size<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><br /> return;<br /><span class="re8">+ m_curSelect = sel;</span><br /> DisplayCert<span class="br0">(</span>m_pDlg, m_certificates<span class="br0">[</span>sel<span class="br0">]</span><span class="br0">)</span>;<br /> <br /> m_pDlg->Layout<span class="br0">(</span><span class="br0">)</span>;<br />diff -Nurp filezilla.orig/src/interface/verifycertdialog.h filezilla/src/interface/verifycertdialog.h<br /><span class="re3">--- filezilla.orig/src/interface/verifycertdialog.h 2016-05-25 15:15:10.164819057 +0800</span><br /><span class="re4">+++ filezilla/src/interface/verifycertdialog.h 2016-05-26 13:14:03.897443962 +0800</span><br /><span class="re6">@@ -28,6 +28,7 @@ private:</span><br /> <br /> bool DisplayCert<span class="br0">(</span>wxDialogEx* pDlg, const CCertificate& cert<span class="br0">)</span>;<br /> <br /><span class="re8">+ wxString GetCNValue<span class="br0">(</span>const wxString& dn<span class="br0">)</span>;</span><br /> void ParseDN<span class="br0">(</span>wxWindow* parent, const wxString& dn, wxSizer* pSizer<span class="br0">)</span>;<br /> void ParseDN_by_prefix<span class="br0">(</span>wxWindow* parent, std::list<wxString>& tokens, wxString prefix, const wxString& name, wxSizer* pSizer, bool decode = false<span class="br0">)</span>;<br /> <br /><span class="re6">@@ -50,6 +51,7 @@ private:</span><br /> wxSizer* m_pSubjectSizer<span class="br0">{</span><span class="br0">}</span>;<br /> wxSizer* m_pIssuerSizer<span class="br0">{</span><span class="br0">}</span>;<br /> int line_height_<span class="br0">{</span><span class="br0">}</span>;<br /><span class="re8">+ unsigned int m_curSelect;</span><br /> <br /> void OnCertificateChoice<span class="br0">(</span>wxCommandEvent& event<span class="br0">)</span>;<br /> <span class="br0">}</span>;</div></pre><p>patch 可以由這兒抓: <a href="http://www.teatime.com.tw/~tommy/mypatch/filezilla_3.18.0_trust_cert.patch" target="_blank">http://www.teatime.com.tw/~tommy/mypatch/filezilla_3.18.0_trust_cert.patch</a> </p><p>這個 patch 不久前<a href="https://trac.filezilla-project.org/ticket/10842" target="_blank">送給作者</a>, 不過被否決了. 所以.... 有需要就自己處理吧, 或到 <a href="https://sourceforge.net/projects/filezillapv/" target="_blank">FileZillaPV</a> 去抓我做好的執行檔.</p>
Patch
FTP
Software
2016-05-28T20:50:15Z
tommy
-
修正 ProxyDroid 2.7.x 自動連線無法正常使用的問題
https://blog.teatime.com.tw/1/post/476
<p><a href="https://github.com/madeye/proxydroid" target="_blank">ProxyDroid</a> 自 2.7.0 版本開始, 在我的手機上自動連線的功能就無法正常使用. 只能把 ProxyDroid 的程式打開去點才能正常使用. 連同桌面上的 widget 也一樣, 啟用的功能無法正常運作.</p><p>今天試著用 adb logcat 查了一下, 發現有 java.lang.NullPointerException 的問題:</p><pre class="bash"><div class="insertcode">E<span class="sy0">/</span>ProxyDroidService<span class="br0">(</span><span class="nu0">20295</span><span class="br0">)</span>: Error setting up port forward during connect<br />E<span class="sy0">/</span>ProxyDroidService<span class="br0">(</span><span class="nu0">20295</span><span class="br0">)</span>: java.lang.NullPointerException: Attempt to invoke virtual method <span class="st_h">'int java.lang.String.length()'</span> on a null object reference<br />E<span class="sy0">/</span>ProxyDroidService<span class="br0">(</span><span class="nu0">20295</span><span class="br0">)</span>: at org.proxydroid.ProxyDroidService.enableProxy<span class="br0">(</span>ProxyDroidService.java:<span class="nu0">263</span><span class="br0">)</span><br />E<span class="sy0">/</span>ProxyDroidService<span class="br0">(</span><span class="nu0">20295</span><span class="br0">)</span>: at org.proxydroid.ProxyDroidService.handleCommand<span class="br0">(</span>ProxyDroidService.java:<span class="nu0">394</span><span class="br0">)</span><br />E<span class="sy0">/</span>ProxyDroidService<span class="br0">(</span><span class="nu0">20295</span><span class="br0">)</span>: at org.proxydroid.ProxyDroidService<span class="re4">$3</span>.run<span class="br0">(</span>ProxyDroidService.java:<span class="nu0">715</span><span class="br0">)</span><br />E<span class="sy0">/</span>ProxyDroidService<span class="br0">(</span><span class="nu0">20295</span><span class="br0">)</span>: at java.lang.Thread.run<span class="br0">(</span>Thread.java:<span class="nu0">818</span><span class="br0">)</span></div></pre><p>應該是 certificate 這個變數是 null 所造成的問題, 加上了檢查的動作就正常了.</p><p>由於原作者沒有打開 issue 的功能, 只好 <a href="https://github.com/twu2/proxydroid" target="_blank">fork 出來</a>再利用 pull request 送出這個 patch. 順便把 wifi-ap 模式的支援也加入.</p><p>目前看起來應該<a href="https://github.com/madeye/proxydroid/commits/master" target="_blank">有被作者接受</a>. 所以... 希望下一版會正常. </p><p>等不及下一版的可以抓這個回去試看看: <a href="http://www.teatime.com.tw/~tommy/files/proxydroid-2.7.9-2.7.4.apk" target="_blank">http://www.teatime.com.tw/~tommy/files/proxydroid-2.7.9-2.7.4.apk </a> </p><p> </p><p> </p>
Patch
Software
Android
2016-05-17T10:52:35Z
tommy
-
讓 Gallery2 支援 PHP7
https://blog.teatime.com.tw/1/post/474
<p>原本以為 <a href="http://galleryproject.org/" target="_blank">Gallery2</a> 不用改就可以直接在 <a href="http://php.net/" target="_blank">PHP7</a> 底下使用, 不過.... 跑了一陣子, 發現... 應該只是 cache 的關係, 實際上是會有問題的.</p><p>修改的地方與之前改 LifeType 1.2 差不多, 不過, 由於在我家的 Debian 機器上, 有些模組是直接用系統本身的, 所以, 把 patch 分成了幾個部份.</p><p>主要是以 Gallery 2.3.2 為 base 所做出來的 patch, 一樣.... 也許有些地方不合, 自己就處理一下吧.</p><p>1. Gallery 部份<br /><a href="http://www.teatime.com.tw/~tommy/files/gallery/g2_php7.patch.gz" target="_blank">http://www.teatime.com.tw/~tommy/files/gallery/g2_php7.patch.gz</a> </p><p>2. Smarty 部份<br /><a href="http://www.teatime.com.tw/~tommy/files/gallery/g2_smarty_php7.patch.gz" target="_blank">http://www.teatime.com.tw/~tommy/files/gallery/g2_smarty_php7.patch.gz</a> </p><p>3. getid3 部份<br /><a href="http://www.teatime.com.tw/~tommy/files/gallery/g2_getid3_php7.patch.gz" target="_blank">http://www.teatime.com.tw/~tommy/files/gallery/g2_getid3_php7.patch.gz</a> </p><p>4. ADODB 部份<br /><a href="http://www.teatime.com.tw/~tommy/files/gallery/g2_adodb_php7.patch.gz" target="_blank">http://www.teatime.com.tw/~tommy/files/gallery/g2_adodb_php7.patch.gz</a> </p><p>我只有把我自己會用到的部份所產生的錯誤改掉, 不確定是不是所有的地方都改了, 如果還有問題... 就再說了. </p>
Gallery
Patch
2016-03-28T11:32:56Z
tommy
-
讓 LifeType 1.2 支援 PHP7
https://blog.teatime.com.tw/1/post/473
<p>LifeType 似乎已經停止開發很久了... 最近 <a href="http://php.net/" target="_blank">PHP7</a> 推出後, 發現原本的程式不能正常使用.... 原本考慮是不是要換到 WordPress 上面... 不過, 反正也很少在寫, 好像能用就可以... 所以就動手改了一下.</p><p><a href="http://www.teatime.com.tw/~tommy/files/lifetype/lt12_php7.patch.gz" target="_blank">http://www.teatime.com.tw/~tommy/files/lifetype/lt12_php7.patch.gz</a> </p><p>patch 不小是因為把 <a href="http://getid3.sourceforge.net/" target="_blank">getid3</a> 與 <a href="http://www.smarty.net/" target="_blank">smarty2</a> 更新的最後一個版本 (主要是 getid3), 使用 LifeType 1.2_r7162 為基礎修改 (應該也不是原始的版本, 忘了之前有改什麼了).</p><p>修改的部份主要是</p><ol><li><a href="http://php.net/manual/en/function.ereg.php" target="_blank">ereg</a>() 用 <a href="http://php.net/manual/en/function.preg-match.php" target="_blank">preg_match</a>() 取代</li><li><a href="http://php.net/manual/en/function.split.php" target="_blank">split</a>() 用 <a href="http://php.net/manual/en/function.preg-split.php" target="_blank">preg_split</a>() 取代</li><li><a href="http://php.net/manual/en/function.preg-replace.php" target="_blank">preg_replace</a>() /e 的功能用 <a href="http://php.net/manual/en/function.preg-replace-callback.php" target="_blank">preg_replace_callback</a>() 取代 </li><li>mysql 的函式改用 mysqli 來取代 </li></ol><p>印象中是改這上面幾個就能夠在 PHP7 中執行, 只是會有一些 DEPRECATED 的訊息. 所以順便改了</p><ol><li>class 的同名 constructor 另外加上 __construct() 來處理, 再去執行原本的同名函式. </li><li>使用 static 方式執行的 class 函式, 要宣告為 static</li></ol><p>patch 如果有錯...有可能是</p><ul><li>之前程式我改過, 與你的版本不太一樣... 請想辦法改一下吧. </li><li>plugins 的部份, 可能是你沒用那個 plugins, 或版本不一樣. 基本上沒裝就忽略好了.</li></ul><p>如果改不出來... 就留在 PHP5.x 或者換到 WordPress 去吧. </p>
LifeType
Patch
2016-03-17T16:04:36Z
tommy
-
FileZilla 3.7.3 Generic Proxy per site
https://blog.teatime.com.tw/1/post/461
<p>這是讓 <a href="https://filezilla-project.org/" target="_blank">FileZilla</a> 支援每個站點獨立設定要使用的 proxy 的修正.</p><pre class="diff"><div class="insertcode"><pre class="diff" style="font-family: monospace">diff --strip-trailing-cr -Nur filezilla-3.7.3.orig/src/engine/ControlSocket.cpp filezilla-3.7.3/src/engine/ControlSocket.cpp<br /><span class="re3">--- filezilla-3.7.3.orig/src/engine/ControlSocket.cpp <span class="nu0">2013</span>-06-09 <span class="nu0">11</span>:<span class="nu0">30</span>:<span class="nu0">07.000000000</span> +0800</span><br /><span class="re4">+++ filezilla-3.7.3/src/engine/ControlSocket.cpp <span class="nu0">2013</span>-<span class="nu0">10</span>-01 <span class="nu0">11</span>:<span class="nu0">30</span>:<span class="nu0">39.023788900</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">1163</span>,<span class="nu0">21</span> +<span class="nu0">1163</span>,<span class="nu0">44</span> @@</span><br /> wxString host;<br /> unsigned int port = <span class="nu0">0</span>;<br /> <br /><span class="re7">- const int proxy_type = m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOptionVal<span class="br0">(</span>OPTION_PROXY_TYPE<span class="br0">)</span>;</span><br /><span class="re7">- if <span class="br0">(</span>proxy_type > CProxySocket::unknown && proxy_type < CProxySocket::proxytype_count && !m_pCurrentServer->GetBypassProxy<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ int proxyType = <span class="nu0">0</span>;</span><br /><span class="re8">+ wxString proxyHost;</span><br /><span class="re8">+ unsigned int proxyPort;</span><br /><span class="re8">+ wxString proxyUser;</span><br /><span class="re8">+ wxString proxyPass;</span><br /><span class="re8">+</span><br /><span class="re8">+ if <span class="br0">(</span>m_pCurrentServer->GetProxyType<span class="br0">(</span><span class="br0">)</span> > CProxySocket::unknown &&</span><br /><span class="re8">+ m_pCurrentServer->GetProxyType<span class="br0">(</span><span class="br0">)</span> < CProxySocket::proxytype_count</span><br /><span class="re8">+ && m_pCurrentServer->GetProxyHost<span class="br0">(</span><span class="br0">)</span> != _T<span class="br0">(</span>""<span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ <span class="br0">{</span></span><br /><span class="re8">+ proxyType = m_pCurrentServer->GetProxyType<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ proxyHost = m_pCurrentServer->GetProxyHost<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ proxyPort = m_pCurrentServer->GetProxyPort<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ proxyUser = m_pCurrentServer->GetProxyUser<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ proxyPass = m_pCurrentServer->GetProxyPass<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ else if <span class="br0">(</span>!m_pCurrentServer->GetBypassProxy<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ <span class="br0">{</span></span><br /><span class="re8">+ proxyType = m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOptionVal<span class="br0">(</span>OPTION_PROXY_TYPE<span class="br0">)</span>;</span><br /><span class="re8">+ proxyHost = m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOption<span class="br0">(</span>OPTION_PROXY_HOST<span class="br0">)</span>;</span><br /><span class="re8">+ proxyPort = m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOptionVal<span class="br0">(</span>OPTION_PROXY_PORT<span class="br0">)</span>;</span><br /><span class="re8">+ proxyUser = m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOption<span class="br0">(</span>OPTION_PROXY_USER<span class="br0">)</span>;</span><br /><span class="re8">+ proxyPass = m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOption<span class="br0">(</span>OPTION_PROXY_PASS<span class="br0">)</span>;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ if <span class="br0">(</span>proxyType > CProxySocket::unknown && proxyType < CProxySocket::proxytype_count<span class="br0">)</span></span><br /> <span class="br0">{</span><br /> LogMessage<span class="br0">(</span>::Status, _<span class="br0">(</span>"Connecting to %s through proxy"<span class="br0">)</span>, m_pCurrentServer->FormatHost<span class="br0">(</span><span class="br0">)</span>.c_str<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>;<br /> <br /><span class="re7">- host = m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOption<span class="br0">(</span>OPTION_PROXY_HOST<span class="br0">)</span>;</span><br /><span class="re7">- port = m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOptionVal<span class="br0">(</span>OPTION_PROXY_PORT<span class="br0">)</span>;</span><br /><span class="re8">+ host = proxyHost;</span><br /><span class="re8">+ port = proxyPort;</span><br /> <br /> delete m_pBackend;<br /> m_pProxyBackend = new CProxySocket<span class="br0">(</span>this, m_pSocket, this<span class="br0">)</span>;<br /> m_pBackend = m_pProxyBackend;<br /><span class="re7">- int res = m_pProxyBackend->Handshake<span class="br0">(</span><span class="br0">(</span>enum CProxySocket::ProxyType<span class="br0">)</span>proxy_type,</span><br /><span class="re8">+ int res = m_pProxyBackend->Handshake<span class="br0">(</span><span class="br0">(</span>enum CProxySocket::ProxyType<span class="br0">)</span>proxyType,</span><br /> m_pCurrentServer->GetHost<span class="br0">(</span><span class="br0">)</span>, m_pCurrentServer->GetPort<span class="br0">(</span><span class="br0">)</span>,<br /><span class="re7">- m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOption<span class="br0">(</span>OPTION_PROXY_USER<span class="br0">)</span>,</span><br /><span class="re7">- m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOption<span class="br0">(</span>OPTION_PROXY_PASS<span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re8">+ proxyUser,</span><br /><span class="re8">+ proxyPass<span class="br0">)</span>;</span><br /> <br /> if <span class="br0">(</span>res != EINPROGRESS<span class="br0">)</span><br /> <span class="br0">{</span><br /><span class="re6">@@ -<span class="nu0">1485</span>,<span class="nu0">4</span> +<span class="nu0">1508</span>,<span class="nu0">4</span> @@</span><br /> int CControlSocket::Chmod<span class="br0">(</span>const CChmodCommand&<span class="br0">)</span><br /> <span class="br0">{</span><br /> return FZ_REPLY_NOTSUPPORTED;<br /><span class="re7">-<span class="br0">}</span></span><br /><span class="kw1">\ No newline at end of file</span><br /><span class="re8">+<span class="br0">}</span></span><br />diff --strip-trailing-cr -Nur filezilla-3.7.3.orig/src/engine/ftpcontrolsocket.cpp filezilla-3.7.3/src/engine/ftpcontrolsocket.cpp<br /><span class="re3">--- filezilla-3.7.3.orig/src/engine/ftpcontrolsocket.cpp <span class="nu0">2013</span>-06-09 <span class="nu0">11</span>:<span class="nu0">30</span>:<span class="nu0">07.000000000</span> +0800</span><br /><span class="re4">+++ filezilla-3.7.3/src/engine/ftpcontrolsocket.cpp <span class="nu0">2013</span>-<span class="nu0">10</span>-01 <span class="nu0">11</span>:<span class="nu0">30</span>:<span class="nu0">39.029791700</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">4395</span>,<span class="nu0">7</span> +<span class="nu0">4395</span>,<span class="nu0">8</span> @@</span><br /> <br /> // Do not use FTP proxy if generic proxy is set<br /> int generic_proxy_type = m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOptionVal<span class="br0">(</span>OPTION_PROXY_TYPE<span class="br0">)</span>;<br /><span class="re7">- if <span class="br0">(</span><span class="br0">(</span>generic_proxy_type <= CProxySocket::unknown || generic_proxy_type >= CProxySocket::proxytype_count<span class="br0">)</span> &&</span><br /><span class="re8">+ if <span class="br0">(</span><span class="br0">(</span>server.GetProxyType<span class="br0">(</span><span class="br0">)</span> <= CProxySocket::unknown || server.GetProxyType<span class="br0">(</span><span class="br0">)</span> >= CProxySocket::proxytype_count || server.GetProxyHost<span class="br0">(</span><span class="br0">)</span> == _T<span class="br0">(</span>""<span class="br0">)</span><span class="br0">)</span> &&</span><br /><span class="re8">+ <span class="br0">(</span>generic_proxy_type <= CProxySocket::unknown || generic_proxy_type >= CProxySocket::proxytype_count<span class="br0">)</span> &&</span><br /> <span class="br0">(</span>pData->ftp_proxy_type = m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOptionVal<span class="br0">(</span>OPTION_FTP_PROXY_TYPE<span class="br0">)</span><span class="br0">)</span> && !server.GetBypassProxy<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><br /> <span class="br0">{</span><br /> pData->host = m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOption<span class="br0">(</span>OPTION_FTP_PROXY_HOST<span class="br0">)</span>;<br />diff --strip-trailing-cr -Nur filezilla-3.7.3.orig/src/engine/server.cpp filezilla-3.7.3/src/engine/server.cpp<br /><span class="re3">--- filezilla-3.7.3.orig/src/engine/server.cpp <span class="nu0">2013</span>-01-<span class="nu0">14</span> <span class="nu0">12</span>:<span class="nu0">30</span>:<span class="nu0">09.000000000</span> +0800</span><br /><span class="re4">+++ filezilla-3.7.3/src/engine/server.cpp <span class="nu0">2013</span>-<span class="nu0">10</span>-01 <span class="nu0">11</span>:<span class="nu0">30</span>:<span class="nu0">39.036796600</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">307</span>,<span class="nu0">6</span> +<span class="nu0">307</span>,<span class="nu0">11</span> @@</span><br /> m_timezoneOffset = op.m_timezoneOffset;<br /> m_pasvMode = op.m_pasvMode;<br /> m_maximumMultipleConnections = op.m_maximumMultipleConnections;<br /><span class="re8">+ m_proxyType = op.m_proxyType;</span><br /><span class="re8">+ m_proxyHost = op.m_proxyHost;</span><br /><span class="re8">+ m_proxyPort = op.m_proxyPort;</span><br /><span class="re8">+ m_proxyUser = op.m_proxyUser;</span><br /><span class="re8">+ m_proxyPass = op.m_proxyPass;</span><br /> m_encodingType = op.m_encodingType;<br /> m_customEncoding = op.m_customEncoding;<br /> m_postLoginCommands = op.m_postLoginCommands;<br /><span class="re6">@@ -<span class="nu0">350</span>,<span class="nu0">6</span> +<span class="nu0">355</span>,<span class="nu0">16</span> @@</span><br /> return false;<br /> else if <span class="br0">(</span>m_pasvMode != op.m_pasvMode<span class="br0">)</span><br /> return false;<br /><span class="re8">+ else if <span class="br0">(</span>m_proxyType != op.m_proxyType<span class="br0">)</span></span><br /><span class="re8">+ return false;</span><br /><span class="re8">+ else if <span class="br0">(</span>m_proxyHost != op.m_proxyHost<span class="br0">)</span></span><br /><span class="re8">+ return false;</span><br /><span class="re8">+ else if <span class="br0">(</span>m_proxyPort != op.m_proxyPort<span class="br0">)</span></span><br /><span class="re8">+ return false;</span><br /><span class="re8">+ else if <span class="br0">(</span>m_proxyUser != op.m_proxyUser<span class="br0">)</span></span><br /><span class="re8">+ return false;</span><br /><span class="re8">+ else if <span class="br0">(</span>m_proxyPass != op.m_proxyPass<span class="br0">)</span></span><br /><span class="re8">+ return false;</span><br /> else if <span class="br0">(</span>m_encodingType != op.m_encodingType<span class="br0">)</span><br /> return false;<br /> else if <span class="br0">(</span>m_encodingType == ENCODING_CUSTOM<span class="br0">)</span><br /><span class="re6">@@ -<span class="nu0">436</span>,<span class="nu0">6</span> +<span class="nu0">451</span>,<span class="nu0">27</span> @@</span><br /> else if <span class="br0">(</span>m_pasvMode > op.m_pasvMode<span class="br0">)</span><br /> return false;<br /> <br /><span class="re8">+ if <span class="br0">(</span>m_proxyType < op.m_proxyType<span class="br0">)</span></span><br /><span class="re8">+ return true;</span><br /><span class="re8">+ else if <span class="br0">(</span>m_proxyType > op.m_proxyType<span class="br0">)</span></span><br /><span class="re8">+ return false;</span><br /><span class="re8">+ if <span class="br0">(</span>m_proxyHost < op.m_proxyHost<span class="br0">)</span></span><br /><span class="re8">+ return true;</span><br /><span class="re8">+ else if <span class="br0">(</span>m_proxyHost > op.m_proxyHost<span class="br0">)</span></span><br /><span class="re8">+ return false;</span><br /><span class="re8">+ if <span class="br0">(</span>m_proxyPort < op.m_proxyPort<span class="br0">)</span></span><br /><span class="re8">+ return true;</span><br /><span class="re8">+ else if <span class="br0">(</span>m_proxyPort > op.m_proxyPort<span class="br0">)</span></span><br /><span class="re8">+ return false;</span><br /><span class="re8">+ if <span class="br0">(</span>m_proxyUser < op.m_proxyUser<span class="br0">)</span></span><br /><span class="re8">+ return true;</span><br /><span class="re8">+ else if <span class="br0">(</span>m_proxyUser > op.m_proxyUser<span class="br0">)</span></span><br /><span class="re8">+ return false;</span><br /><span class="re8">+ if <span class="br0">(</span>m_proxyPass < op.m_proxyPass<span class="br0">)</span></span><br /><span class="re8">+ return true;</span><br /><span class="re8">+ else if <span class="br0">(</span>m_proxyPass > op.m_proxyPass<span class="br0">)</span></span><br /><span class="re8">+ return false;</span><br /><span class="re8">+</span><br /> if <span class="br0">(</span>m_encodingType < op.m_encodingType<span class="br0">)</span><br /> return true;<br /> else if <span class="br0">(</span>m_encodingType > op.m_encodingType<span class="br0">)</span><br /><span class="re6">@@ -<span class="nu0">489</span>,<span class="nu0">6</span> +<span class="nu0">525</span>,<span class="nu0">16</span> @@</span><br /> return false;<br /> else if <span class="br0">(</span>m_pasvMode != op.m_pasvMode<span class="br0">)</span><br /> return false;<br /><span class="re8">+ else if <span class="br0">(</span>m_proxyType != op.m_proxyType<span class="br0">)</span></span><br /><span class="re8">+ return false;</span><br /><span class="re8">+ else if <span class="br0">(</span>m_proxyHost != op.m_proxyHost<span class="br0">)</span></span><br /><span class="re8">+ return false;</span><br /><span class="re8">+ else if <span class="br0">(</span>m_proxyPort != op.m_proxyPort<span class="br0">)</span></span><br /><span class="re8">+ return false;</span><br /><span class="re8">+ else if <span class="br0">(</span>m_proxyUser != op.m_proxyUser<span class="br0">)</span></span><br /><span class="re8">+ return false;</span><br /><span class="re8">+ else if <span class="br0">(</span>m_proxyPass != op.m_proxyPass<span class="br0">)</span></span><br /><span class="re8">+ return false;</span><br /> else if <span class="br0">(</span>m_encodingType != op.m_encodingType<span class="br0">)</span><br /> return false;<br /> else if <span class="br0">(</span>m_encodingType == ENCODING_CUSTOM<span class="br0">)</span><br /><span class="re6">@@ -<span class="nu0">635</span>,<span class="nu0">6</span> +<span class="nu0">681</span>,<span class="nu0">62</span> @@</span><br /> return m_maximumMultipleConnections;<br /> <span class="br0">}</span><br /> <br /><span class="re8">+int CServer::GetProxyType<span class="br0">(</span><span class="br0">)</span> const</span><br /><span class="re8">+<span class="br0">{</span></span><br /><span class="re8">+ return m_proxyType;</span><br /><span class="re8">+<span class="br0">}</span></span><br /><span class="re8">+</span><br /><span class="re8">+void CServer::SetProxyType<span class="br0">(</span>int type<span class="br0">)</span></span><br /><span class="re8">+<span class="br0">{</span></span><br /><span class="re8">+ m_proxyType = type;</span><br /><span class="re8">+<span class="br0">}</span></span><br /><span class="re8">+</span><br /><span class="re8">+wxString CServer::GetProxyHost<span class="br0">(</span><span class="br0">)</span> const</span><br /><span class="re8">+<span class="br0">{</span></span><br /><span class="re8">+ return m_proxyHost;</span><br /><span class="re8">+<span class="br0">}</span></span><br /><span class="re8">+</span><br /><span class="re8">+bool CServer::SetProxyHost<span class="br0">(</span>wxString host<span class="br0">)</span></span><br /><span class="re8">+<span class="br0">{</span></span><br /><span class="re8">+ m_proxyHost = host;</span><br /><span class="re8">+ return true;</span><br /><span class="re8">+<span class="br0">}</span></span><br /><span class="re8">+</span><br /><span class="re8">+unsigned int CServer::GetProxyPort<span class="br0">(</span><span class="br0">)</span> const</span><br /><span class="re8">+<span class="br0">{</span></span><br /><span class="re8">+ return m_proxyPort;</span><br /><span class="re8">+<span class="br0">}</span></span><br /><span class="re8">+</span><br /><span class="re8">+bool CServer::SetProxyPort<span class="br0">(</span>unsigned int port<span class="br0">)</span></span><br /><span class="re8">+<span class="br0">{</span></span><br /><span class="re8">+ if <span class="br0">(</span>port < 1 || port > <span class="nu0">65535</span><span class="br0">)</span></span><br /><span class="re8">+ return false;</span><br /><span class="re8">+ m_proxyPort = port;</span><br /><span class="re8">+ return true;</span><br /><span class="re8">+<span class="br0">}</span></span><br /><span class="re8">+</span><br /><span class="re8">+wxString CServer::GetProxyUser<span class="br0">(</span><span class="br0">)</span> const</span><br /><span class="re8">+<span class="br0">{</span></span><br /><span class="re8">+ return m_proxyUser;</span><br /><span class="re8">+<span class="br0">}</span></span><br /><span class="re8">+</span><br /><span class="re8">+bool CServer::SetProxyUser<span class="br0">(</span>wxString user<span class="br0">)</span></span><br /><span class="re8">+<span class="br0">{</span></span><br /><span class="re8">+ m_proxyUser = user;</span><br /><span class="re8">+ return true;</span><br /><span class="re8">+<span class="br0">}</span></span><br /><span class="re8">+</span><br /><span class="re8">+wxString CServer::GetProxyPass<span class="br0">(</span><span class="br0">)</span> const</span><br /><span class="re8">+<span class="br0">{</span></span><br /><span class="re8">+ return m_proxyPass;</span><br /><span class="re8">+<span class="br0">}</span></span><br /><span class="re8">+</span><br /><span class="re8">+bool CServer::SetProxyPass<span class="br0">(</span>wxString pass<span class="br0">)</span></span><br /><span class="re8">+<span class="br0">{</span></span><br /><span class="re8">+ m_proxyPass = pass;</span><br /><span class="re8">+ return true;</span><br /><span class="re8">+<span class="br0">}</span></span><br /><span class="re8">+</span><br /> wxString CServer::FormatHost<span class="br0">(</span>bool always_omit_port /*=false*/<span class="br0">)</span> const<br /> <span class="br0">{</span><br /> wxString host = m_host;<br /><span class="re6">@@ -<span class="nu0">683</span>,<span class="nu0">6</span> +<span class="nu0">785</span>,<span class="nu0">11</span> @@</span><br /> m_timezoneOffset = <span class="nu0">0</span>;<br /> m_pasvMode = MODE_DEFAULT;<br /> m_maximumMultipleConnections = <span class="nu0">0</span>;<br /><span class="re8">+ m_proxyType = <span class="nu0">0</span>;</span><br /><span class="re8">+ m_proxyUser = _T<span class="br0">(</span>""<span class="br0">)</span>;</span><br /><span class="re8">+ m_proxyPort = <span class="nu0">8080</span>;</span><br /><span class="re8">+ m_proxyUser = _T<span class="br0">(</span>""<span class="br0">)</span>;</span><br /><span class="re8">+ m_proxyPass = _T<span class="br0">(</span>""<span class="br0">)</span>;</span><br /> m_encodingType = ENCODING_AUTO;<br /> m_customEncoding = _T<span class="br0">(</span>""<span class="br0">)</span>;<br /> m_bypassProxy = false;<br />diff --strip-trailing-cr -Nur filezilla-3.7.3.orig/src/engine/sftpcontrolsocket.cpp filezilla-3.7.3/src/engine/sftpcontrolsocket.cpp<br /><span class="re3">--- filezilla-3.7.3.orig/src/engine/sftpcontrolsocket.cpp <span class="nu0">2013</span>-06-09 <span class="nu0">11</span>:<span class="nu0">30</span>:<span class="nu0">07.000000000</span> +0800</span><br /><span class="re4">+++ filezilla-3.7.3/src/engine/sftpcontrolsocket.cpp <span class="nu0">2013</span>-<span class="nu0">10</span>-01 <span class="nu0">11</span>:<span class="nu0">30</span>:<span class="nu0">39.044802800</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">486</span>,<span class="nu0">7</span> +<span class="nu0">486</span>,<span class="nu0">8</span> @@</span><br /> switch <span class="br0">(</span>pData->opState<span class="br0">)</span><br /> <span class="br0">{</span><br /> case connect_init:<br /><span class="re7">- if <span class="br0">(</span>m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOptionVal<span class="br0">(</span>OPTION_PROXY_TYPE<span class="br0">)</span> && !m_pCurrentServer->GetBypassProxy<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ if <span class="br0">(</span><span class="br0">(</span>m_pCurrentServer->GetProxyType<span class="br0">(</span><span class="br0">)</span> && m_pCurrentServer->GetProxyHost<span class="br0">(</span><span class="br0">)</span> != _T<span class="br0">(</span>""<span class="br0">)</span><span class="br0">)</span> ||</span><br /><span class="re8">+ <span class="br0">(</span>m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOptionVal<span class="br0">(</span>OPTION_PROXY_TYPE<span class="br0">)</span> && !m_pCurrentServer->GetBypassProxy<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span></span><br /> pData->opState = connect_proxy;<br /> else if <span class="br0">(</span>pData->pKeyFiles<span class="br0">)</span><br /> pData->opState = connect_keys;<br /><span class="re6">@@ -<span class="nu0">540</span>,<span class="nu0">37</span> +<span class="nu0">541</span>,<span class="nu0">59</span> @@</span><br /> <span class="br0">{</span><br /> case connect_proxy:<br /> <span class="br0">{</span><br /><span class="re7">- int type;</span><br /><span class="re7">- switch <span class="br0">(</span>m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOptionVal<span class="br0">(</span>OPTION_PROXY_TYPE<span class="br0">)</span><span class="br0">)</span></span><br /><span class="re7">- <span class="br0">{</span></span><br /><span class="re7">- case CProxySocket::HTTP:</span><br /><span class="re7">- type = <span class="nu0">1</span>;</span><br /><span class="re7">- break;</span><br /><span class="re7">- case CProxySocket::SOCKS5:</span><br /><span class="re7">- type = <span class="nu0">2</span>;</span><br /><span class="re7">- break;</span><br /><span class="re7">- default:</span><br /><span class="re7">- LogMessage<span class="br0">(</span>__TFILE__, __LINE__, this, Debug_Warning, _T<span class="br0">(</span>"Unsupported proxy type"<span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re7">- DoClose<span class="br0">(</span>FZ_REPLY_INTERNALERROR<span class="br0">)</span>;</span><br /><span class="re7">- return FZ_REPLY_ERROR;</span><br /><span class="re7">- <span class="br0">}</span></span><br /><span class="re7">-</span><br /><span class="re7">- wxString cmd = wxString::Format<span class="br0">(</span>_T<span class="br0">(</span>"proxy %d \"%s\" %d"<span class="br0">)</span>, type,</span><br /><span class="re7">- m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOption<span class="br0">(</span>OPTION_PROXY_HOST<span class="br0">)</span>.c_str<span class="br0">(</span><span class="br0">)</span>,</span><br /><span class="re7">- m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOptionVal<span class="br0">(</span>OPTION_PROXY_PORT<span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re7">- wxString user = m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOption<span class="br0">(</span>OPTION_PROXY_USER<span class="br0">)</span>;</span><br /><span class="re7">- if <span class="br0">(</span>user != _T<span class="br0">(</span>""<span class="br0">)</span><span class="br0">)</span></span><br /><span class="re7">- cmd += _T<span class="br0">(</span>" \""<span class="br0">)</span> + user + _T<span class="br0">(</span>"\""<span class="br0">)</span>;</span><br /><span class="re7">-</span><br /><span class="re7">- wxString show = cmd;</span><br /><span class="re7">-</span><br /><span class="re7">- wxString pass = m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOption<span class="br0">(</span>OPTION_PROXY_PASS<span class="br0">)</span>;</span><br /><span class="re7">- if <span class="br0">(</span>pass != _T<span class="br0">(</span>""<span class="br0">)</span><span class="br0">)</span></span><br /><span class="re7">- <span class="br0">{</span></span><br /><span class="re7">- cmd += _T<span class="br0">(</span>" \""<span class="br0">)</span> + pass + _T<span class="br0">(</span>"\""<span class="br0">)</span>;</span><br /><span class="re7">- show += _T<span class="br0">(</span>" \""<span class="br0">)</span> + wxString<span class="br0">(</span>'*', pass.Len<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> + _T<span class="br0">(</span>"\""<span class="br0">)</span>;</span><br /><span class="re7">- <span class="br0">}</span></span><br /><span class="re7">- res = Send<span class="br0">(</span>cmd, show<span class="br0">)</span>;</span><br /><span class="re8">+ int proxyType;</span><br /><span class="re8">+ wxString proxyHost;</span><br /><span class="re8">+ unsigned int proxyPort;</span><br /><span class="re8">+ wxString proxyUser;</span><br /><span class="re8">+ wxString proxyPass;</span><br /><span class="re8">+</span><br /><span class="re8">+ if <span class="br0">(</span>m_pCurrentServer->GetProxyType<span class="br0">(</span><span class="br0">)</span> && m_pCurrentServer->GetProxyHost<span class="br0">(</span><span class="br0">)</span> != _T<span class="br0">(</span>""<span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ <span class="br0">{</span></span><br /><span class="re8">+ proxyType = m_pCurrentServer->GetProxyType<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ proxyHost = m_pCurrentServer->GetProxyHost<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ proxyPort = m_pCurrentServer->GetProxyPort<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ proxyUser = m_pCurrentServer->GetProxyUser<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ proxyPass = m_pCurrentServer->GetProxyPass<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ else <span class="br0">{</span></span><br /><span class="re8">+ proxyType = m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOptionVal<span class="br0">(</span>OPTION_PROXY_TYPE<span class="br0">)</span>;</span><br /><span class="re8">+ proxyHost = m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOption<span class="br0">(</span>OPTION_PROXY_HOST<span class="br0">)</span>;</span><br /><span class="re8">+ proxyPort = m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOptionVal<span class="br0">(</span>OPTION_PROXY_PORT<span class="br0">)</span>;</span><br /><span class="re8">+ proxyUser = m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOption<span class="br0">(</span>OPTION_PROXY_USER<span class="br0">)</span>;</span><br /><span class="re8">+ proxyPass = m_pEngine->GetOptions<span class="br0">(</span><span class="br0">)</span>->GetOption<span class="br0">(</span>OPTION_PROXY_PASS<span class="br0">)</span>;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+</span><br /><span class="re8">+ int type;</span><br /><span class="re8">+ switch <span class="br0">(</span>proxyType<span class="br0">)</span></span><br /><span class="re8">+ <span class="br0">{</span></span><br /><span class="re8">+ case CProxySocket::HTTP:</span><br /><span class="re8">+ type = <span class="nu0">1</span>;</span><br /><span class="re8">+ break;</span><br /><span class="re8">+ case CProxySocket::SOCKS5:</span><br /><span class="re8">+ type = <span class="nu0">2</span>;</span><br /><span class="re8">+ break;</span><br /><span class="re8">+ default:</span><br /><span class="re8">+ LogMessage<span class="br0">(</span>__TFILE__, __LINE__, this, Debug_Warning, _T<span class="br0">(</span>"Unsupported proxy type"<span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re8">+ DoClose<span class="br0">(</span>FZ_REPLY_INTERNALERROR<span class="br0">)</span>;</span><br /><span class="re8">+ return FZ_REPLY_ERROR;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+</span><br /><span class="re8">+ wxString cmd = wxString::Format<span class="br0">(</span>_T<span class="br0">(</span>"proxy %d \"%s\" %d"<span class="br0">)</span>, type,</span><br /><span class="re8">+ proxyHost.c_str<span class="br0">(</span><span class="br0">)</span>,</span><br /><span class="re8">+ proxyPort<span class="br0">)</span>;</span><br /><span class="re8">+ wxString user = proxyUser;</span><br /><span class="re8">+ if <span class="br0">(</span>user != _T<span class="br0">(</span>""<span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ cmd += _T<span class="br0">(</span>" \""<span class="br0">)</span> + user + _T<span class="br0">(</span>"\""<span class="br0">)</span>;</span><br /><span class="re8">+</span><br /><span class="re8">+ wxString show = cmd;</span><br /><span class="re8">+</span><br /><span class="re8">+ wxString pass = proxyPass;</span><br /><span class="re8">+ if <span class="br0">(</span>pass != _T<span class="br0">(</span>""<span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ <span class="br0">{</span></span><br /><span class="re8">+ cmd += _T<span class="br0">(</span>" \""<span class="br0">)</span> + pass + _T<span class="br0">(</span>"\""<span class="br0">)</span>;</span><br /><span class="re8">+ show += _T<span class="br0">(</span>" \""<span class="br0">)</span> + wxString<span class="br0">(</span>'*', pass.Len<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> + _T<span class="br0">(</span>"\""<span class="br0">)</span>;</span><br /><span class="re8">+ <span class="br0">}</span></span><br /><span class="re8">+ res = Send<span class="br0">(</span>cmd, show<span class="br0">)</span>;</span><br /> <span class="br0">}</span><br /> break;<br /> case connect_keys:<br />diff --strip-trailing-cr -Nur filezilla-3.7.3.orig/src/include/server.h filezilla-3.7.3/src/include/server.h<br /><span class="re3">--- filezilla-3.7.3.orig/src/include/server.h <span class="nu0">2013</span>-01-<span class="nu0">14</span> <span class="nu0">12</span>:<span class="nu0">30</span>:<span class="nu0">08.000000000</span> +0800</span><br /><span class="re4">+++ filezilla-3.7.3/src/include/server.h <span class="nu0">2013</span>-<span class="nu0">10</span>-01 <span class="nu0">11</span>:<span class="nu0">30</span>:<span class="nu0">39.049805500</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">107</span>,<span class="nu0">6</span> +<span class="nu0">107</span>,<span class="nu0">17</span> @@</span><br /> void SetPasvMode<span class="br0">(</span>enum PasvMode pasvMode<span class="br0">)</span>;<br /> void MaximumMultipleConnections<span class="br0">(</span>int maximum<span class="br0">)</span>;<br /> <br /><span class="re8">+ int GetProxyType<span class="br0">(</span><span class="br0">)</span> const;</span><br /><span class="re8">+ void SetProxyType<span class="br0">(</span>int type<span class="br0">)</span>;</span><br /><span class="re8">+ wxString GetProxyHost<span class="br0">(</span><span class="br0">)</span> const;</span><br /><span class="re8">+ bool SetProxyHost<span class="br0">(</span>wxString host<span class="br0">)</span>;</span><br /><span class="re8">+ unsigned int GetProxyPort<span class="br0">(</span><span class="br0">)</span> const;</span><br /><span class="re8">+ bool SetProxyPort<span class="br0">(</span>unsigned int port<span class="br0">)</span>;</span><br /><span class="re8">+ wxString GetProxyUser<span class="br0">(</span><span class="br0">)</span> const;</span><br /><span class="re8">+ bool SetProxyUser<span class="br0">(</span>wxString user<span class="br0">)</span>;</span><br /><span class="re8">+ wxString GetProxyPass<span class="br0">(</span><span class="br0">)</span> const;</span><br /><span class="re8">+ bool SetProxyPass<span class="br0">(</span>wxString pass<span class="br0">)</span>;</span><br /><span class="re8">+</span><br /> wxString FormatHost<span class="br0">(</span>bool always_omit_port = false<span class="br0">)</span> const;<br /> wxString FormatServer<span class="br0">(</span>const bool always_include_prefix = false<span class="br0">)</span> const;<br /> <br /><span class="re6">@@ -<span class="nu0">158</span>,<span class="nu0">6</span> +<span class="nu0">169</span>,<span class="nu0">11</span> @@</span><br /> int m_timezoneOffset;<br /> enum PasvMode m_pasvMode;<br /> int m_maximumMultipleConnections;<br /><span class="re8">+ int m_proxyType;</span><br /><span class="re8">+ wxString m_proxyHost;</span><br /><span class="re8">+ unsigned int m_proxyPort;</span><br /><span class="re8">+ wxString m_proxyUser;</span><br /><span class="re8">+ wxString m_proxyPass;</span><br /> enum CharsetEncoding m_encodingType;<br /> wxString m_customEncoding;<br /> wxString m_name;<br />diff --strip-trailing-cr -Nur filezilla-3.7.3.orig/src/interface/queue_storage.cpp filezilla-3.7.3/src/interface/queue_storage.cpp<br /><span class="re3">--- filezilla-3.7.3.orig/src/interface/queue_storage.cpp <span class="nu0">2012</span>-<span class="nu0">10</span>-<span class="nu0">25</span> <span class="nu0">11</span>:<span class="nu0">30</span>:<span class="nu0">07.000000000</span> +0800</span><br /><span class="re4">+++ filezilla-3.7.3/src/interface/queue_storage.cpp <span class="nu0">2013</span>-<span class="nu0">10</span>-01 <span class="nu0">11</span>:<span class="nu0">30</span>:<span class="nu0">39.056810800</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">58</span>,<span class="nu0">7</span> +<span class="nu0">58</span>,<span class="nu0">12</span> @@</span><br /> encoding,<br /> bypass_proxy,<br /> post_login_commands,<br /><span class="re7">- name</span><br /><span class="re8">+ name,</span><br /><span class="re8">+ proxy_type,</span><br /><span class="re8">+ proxy_host,</span><br /><span class="re8">+ proxy_port,</span><br /><span class="re8">+ proxy_user,</span><br /><span class="re8">+ proxy_pass</span><br /> <span class="br0">}</span>;<br /> <span class="br0">}</span><br /> <br /><span class="re6">@@ -<span class="nu0">78</span>,<span class="nu0">7</span> +<span class="nu0">83</span>,<span class="nu0">12</span> @@</span><br /> <span class="br0">{</span> _T<span class="br0">(</span>"encoding"<span class="br0">)</span>, text, 0 <span class="br0">}</span>,<br /> <span class="br0">{</span> _T<span class="br0">(</span>"bypass_proxy"<span class="br0">)</span>, integer, 0 <span class="br0">}</span>,<br /> <span class="br0">{</span> _T<span class="br0">(</span>"post_login_commands"<span class="br0">)</span>, text, 0 <span class="br0">}</span>,<br /><span class="re7">- <span class="br0">{</span> _T<span class="br0">(</span>"name"<span class="br0">)</span>, text, <span class="nu0">0</span> <span class="br0">}</span></span><br /><span class="re8">+ <span class="br0">{</span> _T<span class="br0">(</span>"name"<span class="br0">)</span>, text, <span class="nu0">0</span> <span class="br0">}</span>,</span><br /><span class="re8">+ <span class="br0">{</span> _T<span class="br0">(</span>"proxy_type"<span class="br0">)</span>, integer, <span class="nu0">0</span> <span class="br0">}</span>,</span><br /><span class="re8">+ <span class="br0">{</span> _T<span class="br0">(</span>"proxy_host"<span class="br0">)</span>, text, <span class="nu0">0</span> <span class="br0">}</span>,</span><br /><span class="re8">+ <span class="br0">{</span> _T<span class="br0">(</span>"proxy_port"<span class="br0">)</span>, integer, <span class="nu0">0</span> <span class="br0">}</span>,</span><br /><span class="re8">+ <span class="br0">{</span> _T<span class="br0">(</span>"proxy_user"<span class="br0">)</span>, text, <span class="nu0">0</span> <span class="br0">}</span>,</span><br /><span class="re8">+ <span class="br0">{</span> _T<span class="br0">(</span>"proxy_pass"<span class="br0">)</span>, text, <span class="nu0">0</span> <span class="br0">}</span></span><br /> <span class="br0">}</span>;<br /> <br /> namespace file_table_column_names<br /><span class="re6">@@ -<span class="nu0">647</span>,<span class="nu0">6</span> +<span class="nu0">657</span>,<span class="nu0">12</span> @@</span><br /> <span class="br0">}</span><br /> Bind<span class="br0">(</span>insertServerQuery_, server_table_column_names::max_connections, server.MaximumMultipleConnections<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>;<br /> <br /><span class="re8">+ Bind<span class="br0">(</span>insertServerQuery_, server_table_column_names::proxy_type, static_cast<int><span class="br0">(</span>server.GetProxyType<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re8">+ Bind<span class="br0">(</span>insertServerQuery_, server_table_column_names::proxy_host, server.GetProxyHost<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re8">+ Bind<span class="br0">(</span>insertServerQuery_, server_table_column_names::proxy_port, static_cast<int><span class="br0">(</span>server.GetProxyPort<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re8">+ Bind<span class="br0">(</span>insertServerQuery_, server_table_column_names::proxy_user, server.GetProxyUser<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re8">+ Bind<span class="br0">(</span>insertServerQuery_, server_table_column_names::proxy_pass, server.GetProxyPass<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re8">+</span><br /> switch <span class="br0">(</span>server.GetEncodingType<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><br /> <span class="br0">{</span><br /> default:<br /><span class="re6">@@ -<span class="nu0">912</span>,<span class="nu0">6</span> +<span class="nu0">928</span>,<span class="nu0">21</span> @@</span><br /> return INVALID_DATA;<br /> server.MaximumMultipleConnections<span class="br0">(</span>maximumMultipleConnections<span class="br0">)</span>;<br /> <br /><span class="re8">+ int proxyType = GetColumnInt<span class="br0">(</span>selectServersQuery_, server_table_column_names::proxy_type<span class="br0">)</span>;</span><br /><span class="re8">+ server.SetProxyType<span class="br0">(</span>proxyType<span class="br0">)</span>;</span><br /><span class="re8">+ wxString proxyHost = GetColumnText<span class="br0">(</span>selectServersQuery_, server_table_column_names::proxy_host<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>!server.SetProxyHost<span class="br0">(</span>proxyHost<span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ return INVALID_DATA;</span><br /><span class="re8">+ int proxyPort = GetColumnInt<span class="br0">(</span>selectServersQuery_, server_table_column_names::proxy_port<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>!server.SetProxyPort<span class="br0">(</span>proxyPort<span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ return INVALID_DATA;</span><br /><span class="re8">+ wxString proxyUser = GetColumnText<span class="br0">(</span>selectServersQuery_, server_table_column_names::proxy_user<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>!server.SetProxyUser<span class="br0">(</span>proxyUser<span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ return INVALID_DATA;</span><br /><span class="re8">+ wxString proxyPass = GetColumnText<span class="br0">(</span>selectServersQuery_, server_table_column_names::proxy_pass<span class="br0">)</span>;</span><br /><span class="re8">+ if <span class="br0">(</span>!server.SetProxyPass<span class="br0">(</span>proxyPass<span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ return INVALID_DATA;</span><br /><span class="re8">+</span><br /> wxString encodingType = GetColumnText<span class="br0">(</span>selectServersQuery_, server_table_column_names::encoding<span class="br0">)</span>;<br /> if <span class="br0">(</span>encodingType.empty<span class="br0">(</span><span class="br0">)</span> || encodingType == _T<span class="br0">(</span>"Auto"<span class="br0">)</span><span class="br0">)</span><br /> server.SetEncodingType<span class="br0">(</span>ENCODING_AUTO<span class="br0">)</span>;<br />diff --strip-trailing-cr -Nur filezilla-3.7.3.orig/src/interface/resources/dialogs.xrc filezilla-3.7.3/src/interface/resources/dialogs.xrc<br /><span class="re3">--- filezilla-3.7.3.orig/src/interface/resources/dialogs.xrc <span class="nu0">2013</span>-07-01 <span class="nu0">11</span>:<span class="nu0">30</span>:<span class="nu0">11.000000000</span> +0800</span><br /><span class="re4">+++ filezilla-3.7.3/src/interface/resources/dialogs.xrc <span class="nu0">2013</span>-<span class="nu0">10</span>-01 <span class="nu0">11</span>:<span class="nu0">30</span>:<span class="nu0">39.071819400</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">961</span>,<span class="nu0">7</span> +<span class="nu0">961</span>,<span class="nu0">7</span> @@</span><br /> <cellpos>3,0</cellpos><br /> <cellspan>0,2</cellspan><br /> </object><br /><span class="re7">- </span><br /><span class="re8">+</span><br /> <object class="sizeritem"><br /> <object class="wxStaticText"><br /> <label>&amp;Logon Type:</label><br /><span class="re6">@@ -<span class="nu0">1245</span>,<span class="nu0">6</span> +<span class="nu0">1245</span>,<span class="nu0">110</span> @@</span><br /> </object><br /> </object><br /> </object><br /><span class="re8">+ </object></span><br /><span class="re8">+ <object class="notebookpage"></span><br /><span class="re8">+ <label>Generic proxy</label></span><br /><span class="re8">+ <object class="wxPanel"></span><br /><span class="re8">+ <object class="wxBoxSizer"></span><br /><span class="re8">+ <orient>wxVERTICAL</orient></span><br /><span class="re8">+ <object class="sizeritem"></span><br /><span class="re8">+ <object class="wxStaticBoxSizer"></span><br /><span class="re8">+ <label>Generic proxy</label></span><br /><span class="re8">+ <orient>wxHORIZONTAL</orient></span><br /><span class="re8">+ <object class="sizeritem"></span><br /><span class="re8">+ <object class="wxFlexGridSizer"></span><br /><span class="re8">+ <cols><span class="nu0">1</span></cols></span><br /><span class="re8">+ <vgap><span class="nu0">5</span></vgap></span><br /><span class="re8">+ <object class="sizeritem"></span><br /><span class="re8">+ <object class="wxStaticText"></span><br /><span class="re8">+ <label>Type of generic proxy:</label></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ <object class="sizeritem"></span><br /><span class="re8">+ <object class="wxRadioButton" name="ID_PROXYTYPE_NONE"></span><br /><span class="re8">+ <label>&amp;None</label></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ <object class="sizeritem"></span><br /><span class="re8">+ <object class="wxRadioButton" name="ID_PROXYTYPE_HTTP"></span><br /><span class="re8">+ <label>&amp;HTTP/<span class="nu0">1.1</span> using CONNECT method</label></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ <object class="sizeritem"></span><br /><span class="re8">+ <object class="wxRadioButton" name="ID_PROXYTYPE_SOCKS5"></span><br /><span class="re8">+ <label>&amp;SOCKS <span class="nu0">5</span></label></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ <object class="sizeritem"></span><br /><span class="re8">+ <object class="wxFlexGridSizer"></span><br /><span class="re8">+ <cols><span class="nu0">2</span></cols></span><br /><span class="re8">+ <object class="sizeritem"></span><br /><span class="re8">+ <object class="wxStaticText"></span><br /><span class="re8">+ <label>P&amp;roxy host:</label></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ <flag>wxALIGN_CENTRE_VERTICAL</flag></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ <object class="sizeritem"></span><br /><span class="re8">+ <object class="wxTextCtrl" name="ID_PROXY_HOST"/></span><br /><span class="re8">+ <flag>wxALIGN_CENTRE_VERTICAL|wxGROW</flag></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ <object class="sizeritem"></span><br /><span class="re8">+ <object class="wxStaticText"></span><br /><span class="re8">+ <label>Proxy &amp;port:</label></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ <flag>wxALIGN_CENTRE_VERTICAL</flag></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ <object class="sizeritem"></span><br /><span class="re8">+ <object class="wxTextCtrl" name="ID_PROXY_PORT"></span><br /><span class="re8">+ <size><span class="nu0">50</span>,-<span class="nu0">1</span></size></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ <flag>wxALIGN_CENTRE_VERTICAL</flag></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ <object class="sizeritem"></span><br /><span class="re8">+ <object class="wxStaticText"></span><br /><span class="re8">+ <label>Proxy &amp;user:</label></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ <flag>wxALIGN_CENTRE_VERTICAL</flag></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ <object class="sizeritem"></span><br /><span class="re8">+ <object class="wxTextCtrl" name="ID_PROXY_USER"/></span><br /><span class="re8">+ <flag>wxALIGN_CENTRE_VERTICAL|wxGROW</flag></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ <object class="sizeritem"></span><br /><span class="re8">+ <object class="wxStaticText"></span><br /><span class="re8">+ <label>Pro&amp;xy password:</label></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ <flag>wxALIGN_CENTRE_VERTICAL</flag></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ <object class="sizeritem"></span><br /><span class="re8">+ <object class="wxTextCtrl" name="ID_PROXY_PASS"></span><br /><span class="re8">+ <style>wxTE_PASSWORD</style></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ <flag>wxALIGN_CENTRE_VERTICAL|wxGROW</flag></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ <vgap><span class="nu0">5</span></vgap></span><br /><span class="re8">+ <hgap><span class="nu0">5</span></hgap></span><br /><span class="re8">+ <growablecols><span class="nu0">1</span></growablecols></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ <flag>wxGROW</flag></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ <growablecols><span class="nu0">0</span></growablecols></span><br /><span class="re8">+ <object class="sizeritem"></span><br /><span class="re8">+ <object class="wxStaticText"></span><br /><span class="re8">+ <label>Note: Using a generic proxy forces passive mode on FTP connections.</label></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ <option><span class="nu0">1</span></option></span><br /><span class="re8">+ <flag>wxBOTTOM|wxLEFT|wxRIGHT|wxGROW</flag></span><br /><span class="re8">+ <border><span class="nu0">5</span></border></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ <option><span class="nu0">1</span></option></span><br /><span class="re8">+ <flag>wxGROW</flag></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ </object></span><br /><span class="re8">+ </object></span><br /> </object><br /> <object class="notebookpage"><br /> <label>Charset</label><br />diff --strip-trailing-cr -Nur filezilla-3.7.3.orig/src/interface/sitemanager_dialog.cpp filezilla-3.7.3/src/interface/sitemanager_dialog.cpp<br /><span class="re3">--- filezilla-3.7.3.orig/src/interface/sitemanager_dialog.cpp <span class="nu0">2013</span>-05-01 <span class="nu0">11</span>:<span class="nu0">30</span>:<span class="nu0">04.000000000</span> +0800</span><br /><span class="re4">+++ filezilla-3.7.3/src/interface/sitemanager_dialog.cpp <span class="nu0">2013</span>-<span class="nu0">10</span>-01 <span class="nu0">11</span>:<span class="nu0">30</span>:<span class="nu0">39.078825500</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">32</span>,<span class="nu0">6</span> +<span class="nu0">32</span>,<span class="nu0">9</span> @@</span><br /> EVT_BUTTON<span class="br0">(</span>XRCID<span class="br0">(</span>"ID_BROWSE"<span class="br0">)</span>, CSiteManagerDialog::OnRemoteDirBrowse<span class="br0">)</span><br /> EVT_TREE_ITEM_ACTIVATED<span class="br0">(</span>XRCID<span class="br0">(</span>"ID_SITETREE"<span class="br0">)</span>, CSiteManagerDialog::OnItemActivated<span class="br0">)</span><br /> EVT_CHECKBOX<span class="br0">(</span>XRCID<span class="br0">(</span>"ID_LIMITMULTIPLE"<span class="br0">)</span>, CSiteManagerDialog::OnLimitMultipleConnectionsChanged<span class="br0">)</span><br /><span class="re8">+EVT_RADIOBUTTON<span class="br0">(</span>XRCID<span class="br0">(</span>"ID_PROXYTYPE_NONE"<span class="br0">)</span>, CSiteManagerDialog::OnProxyChange<span class="br0">)</span></span><br /><span class="re8">+EVT_RADIOBUTTON<span class="br0">(</span>XRCID<span class="br0">(</span>"ID_PROXYTYPE_HTTP"<span class="br0">)</span>, CSiteManagerDialog::OnProxyChange<span class="br0">)</span></span><br /><span class="re8">+EVT_RADIOBUTTON<span class="br0">(</span>XRCID<span class="br0">(</span>"ID_PROXYTYPE_SOCKS5"<span class="br0">)</span>, CSiteManagerDialog::OnProxyChange<span class="br0">)</span></span><br /> EVT_RADIOBUTTON<span class="br0">(</span>XRCID<span class="br0">(</span>"ID_CHARSET_AUTO"<span class="br0">)</span>, CSiteManagerDialog::OnCharsetChange<span class="br0">)</span><br /> EVT_RADIOBUTTON<span class="br0">(</span>XRCID<span class="br0">(</span>"ID_CHARSET_UTF8"<span class="br0">)</span>, CSiteManagerDialog::OnCharsetChange<span class="br0">)</span><br /> EVT_RADIOBUTTON<span class="br0">(</span>XRCID<span class="br0">(</span>"ID_CHARSET_CUSTOM"<span class="br0">)</span>, CSiteManagerDialog::OnCharsetChange<span class="br0">)</span><br /><span class="re6">@@ -<span class="nu0">403</span>,<span class="nu0">6</span> +<span class="nu0">406</span>,<span class="nu0">10</span> @@</span><br /> XRCCTRL<span class="br0">(</span>*this, "ID_TRANSFERMODE_ACTIVE", wxRadioButton<span class="br0">)</span>->Update<span class="br0">(</span><span class="br0">)</span>;<br /> XRCCTRL<span class="br0">(</span>*this, "ID_TRANSFERMODE_PASSIVE", wxRadioButton<span class="br0">)</span>->Update<span class="br0">(</span><span class="br0">)</span>;<br /> <br /><span class="re8">+ XRCCTRL<span class="br0">(</span>*this, "ID_PROXYTYPE_NONE", wxRadioButton<span class="br0">)</span>->Update<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ XRCCTRL<span class="br0">(</span>*this, "ID_PROXYTYPE_HTTP", wxRadioButton<span class="br0">)</span>->Update<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+ XRCCTRL<span class="br0">(</span>*this, "ID_PROXYTYPE_SOCKS5", wxRadioButton<span class="br0">)</span>->Update<span class="br0">(</span><span class="br0">)</span>;</span><br /><span class="re8">+</span><br /> wxTreeItemId item = pTree->GetSelection<span class="br0">(</span><span class="br0">)</span>;<br /> if <span class="br0">(</span>!item.IsOk<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><br /> pTree->SelectItem<span class="br0">(</span>m_ownSites<span class="br0">)</span>;<br /><span class="re6">@@ -<span class="nu0">1396</span>,<span class="nu0">6</span> +<span class="nu0">1403</span>,<span class="nu0">19</span> @@</span><br /> else<br /> server.m_server.MaximumMultipleConnections<span class="br0">(</span>0<span class="br0">)</span>;<br /> <br /><span class="re8">+ if <span class="br0">(</span>XRCCTRL<span class="br0">(</span>*this, "ID_PROXYTYPE_HTTP", wxRadioButton<span class="br0">)</span>->GetValue<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ server.m_server.SetProxyType<span class="br0">(</span>1<span class="br0">)</span>;</span><br /><span class="re8">+ else if <span class="br0">(</span>XRCCTRL<span class="br0">(</span>*this, "ID_PROXYTYPE_SOCKS5", wxRadioButton<span class="br0">)</span>->GetValue<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ server.m_server.SetProxyType<span class="br0">(</span>2<span class="br0">)</span>;</span><br /><span class="re8">+ else</span><br /><span class="re8">+ server.m_server.SetProxyType<span class="br0">(</span>0<span class="br0">)</span>;</span><br /><span class="re8">+ server.m_server.SetProxyHost<span class="br0">(</span>XRCCTRL<span class="br0">(</span>*this, "ID_PROXY_HOST", wxTextCtrl<span class="br0">)</span>->GetValue<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re8">+ unsigned long proxyPort;</span><br /><span class="re8">+ XRCCTRL<span class="br0">(</span>*this, "ID_PROXY_PORT", wxTextCtrl<span class="br0">)</span>->GetValue<span class="br0">(</span><span class="br0">)</span>.ToULong<span class="br0">(</span>&proxyPort<span class="br0">)</span>;</span><br /><span class="re8">+ server.m_server.SetProxyPort<span class="br0">(</span>proxyPort<span class="br0">)</span>;</span><br /><span class="re8">+ server.m_server.SetProxyUser<span class="br0">(</span>XRCCTRL<span class="br0">(</span>*this, "ID_PROXY_USER", wxTextCtrl<span class="br0">)</span>->GetValue<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re8">+ server.m_server.SetProxyPass<span class="br0">(</span>XRCCTRL<span class="br0">(</span>*this, "ID_PROXY_PASS", wxTextCtrl<span class="br0">)</span>->GetValue<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>;</span><br /><span class="re8">+</span><br /> if <span class="br0">(</span>XRCCTRL<span class="br0">(</span>*this, "ID_CHARSET_UTF8", wxRadioButton<span class="br0">)</span>->GetValue<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><br /> server.m_server.SetEncodingType<span class="br0">(</span>ENCODING_UTF8<span class="br0">)</span>;<br /> else if <span class="br0">(</span>XRCCTRL<span class="br0">(</span>*this, "ID_CHARSET_CUSTOM", wxRadioButton<span class="br0">)</span>->GetValue<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><br /><span class="re6">@@ -<span class="nu0">1642</span>,<span class="nu0">6</span> +<span class="nu0">1662</span>,<span class="nu0">43</span> @@</span><br /> XRCCTRL<span class="br0">(</span>*this, "ID_MAXMULTIPLE&qu</pre></div></pre>
Patch
FTP
2013-10-01T13:23:59Z
tommy
-
ownCloud imap (or others) backend support? lost after re-configure...
https://blog.teatime.com.tw/1/post/449
<p>上星期把 <a href="https://owncloud.com/" target="_blank">ownCloud</a> 裝起來用, 因為是用現成的主機, 所以就直接用 imap 的方式來驗證帳號. </p><p>設定上其實很簡單, 不過.... 就設計的邏輯來看, 整個系統雖然有個 External user support 的應用程式可以用, 啟用後, 又找不到任何地方可以設定.... 原來, 沒有介面, 要自己去改 config/config.php 才可以.</p><p>網路上找到的設定如下:</p><pre class="php"><div class="insertcode"><pre class="php" style="font-family: monospace"><span class="kw2"><?php</span><br /><span class="kw1">require_once</span><span class="br0">(</span><a href="http://www.php.net/dirname"><span class="kw3">dirname</span></a><span class="br0">(</span><span class="kw4">__FILE__</span><span class="br0">)</span><span class="sy0">.</span><span class="st_h">'/../apps/user_external/lib/imap.php'</span><span class="br0">)</span><span class="sy0">;</span><br /><span class="re0">$CONFIG</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a> <span class="br0">(</span><br /> <span class="st_h">'instanceid'</span> <span class="sy0">=></span> <span class="st_h">'xxxxx'</span><span class="sy0">,</span><br /> <span class="st_h">'passwordsalt'</span> <span class="sy0">=></span> <span class="st_h">'xxxxx,<br /> '</span>datadirectory<span class="st_h">' => '</span><span class="sy0">/</span><span class="kw2">var</span><span class="sy0">/</span>www<span class="sy0">/</span>owncloud<span class="sy0">/</span>data<span class="st_h">',<br /> '</span>dbtype<span class="st_h">' => '</span><a href="http://www.php.net/mysql"><span class="kw3">mysql</span></a><span class="st_h">',<br /> '</span>version<span class="st_h">' => '</span>5<span class="sy0">.</span>0<span class="sy0">.</span>15<span class="st_h">',<br /> '</span>dbname<span class="st_h">' => '</span>owncloud<span class="st_h">',<br /> '</span>dbhost<span class="st_h">' => '</span>localhost<span class="st_h">',<br /> '</span>dbtableprefix<span class="st_h">' => '</span>oc_<span class="st_h">',<br /> '</span>dbuser<span class="st_h">' => '</span>xxxx<span class="st_h">',<br /> '</span>dbpassword<span class="st_h">' => '</span>xxxxx<span class="st_h">',<br /> '</span>installed<span class="st_h">' => true,<br /> '</span>loglevel<span class="st_h">' => '</span><span class="nu0">2</span><span class="st_h">',<br /> '</span>user_backends<span class="st_h">' =><br /> array (<br /> 0 =><br /> array (<br /> '</span><span class="kw2">class</span><span class="st_h">' => '</span>OC_User_IMAP<span class="st_h">',<br /> '</span>arguments<span class="st_h">' =><br /> array (<br /> 0 => '</span><span class="br0">{</span>localhost<span class="sy0">/</span>novalidate<span class="sy0">-</span>cert<span class="sy0">:</span><span class="nu0">143</span><span class="br0">}</span><span class="st_h">',<br /> ),<br /> ),<br /> ),<br /> '</span>forcessl<span class="st_h">' => true,<br />);</span></pre></div></pre><p>就是一開始加上用的模組, 再去設定就可以.</p><p>不過.... 昨天設定老婆的手機上的 ownCloud client 時, 居然不能登入.... 用 browser 登入又可以. 找了半天, 終於發現原本自行在 config/config.php 加上的那一行 require_once 不見了....</p><p>原來, 只要在系統管理員在網頁上改過設定, 就會重寫 config/config.php, 但是.... 就只有 $CONFIG 會被寫入, 自己另外加上的程式碼會不見.</p><p>這時... 透過 browser 進來時, 應該在 index.php 裡頭會去處理到, 所以會載入所需要的模組, 仍可以正常的登入. 不過... 使用 android client 時, 似乎不是透過這方式來連線, 所以.... 會找不到帳號密碼.</p><p>由於怕不小心忘了會不能用, 所以就改了一下程式, 在寫入 config.php 時, 去載入自己的另一個 config.local.php 設定檔, 這樣就可以把自己另外加的程式碼放到 config.local.php, 而系統重新寫入時不會去影響到.</p><p>patch 如下:</p><pre class="diff"><div class="insertcode"><pre class="diff" style="font-family: monospace">--- owncloud/lib/config.orig.php 2013-07-19 21:50:05.244784602 +0800<br /><span class="re4">+++ owncloud/lib/config.php <span class="nu0">2013</span>-07-<span class="nu0">19</span> <span class="nu0">21</span>:<span class="nu0">51</span>:<span class="nu0">14.421748091</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">157</span>,<span class="nu0">7</span> +<span class="nu0">157</span>,<span class="nu0">7</span> @@</span><br /> // Create a php file ...<br /> $defaults = new OC_Defaults;<br /> <br /><span class="re7">- $content = "<?php\n\$CONFIG = ";</span><br /><span class="re8">+ $content = "<?php\nif <span class="br0">(</span>file_exists<span class="br0">(</span>dirname<span class="br0">(</span>__FILE__<span class="br0">)</span>.'/config.local.php'<span class="br0">)</span><span class="br0">)</span>\n include<span class="br0">(</span>dirname<span class="br0">(</span>__FILE__<span class="br0">)</span>.'/config.local.php'<span class="br0">)</span>;\n\$CONFIG = ";</span><br /> $content .= var_export<span class="br0">(</span>self::$cache, true<span class="br0">)</span>;<br /> $content .= ";\n";</pre></div></pre><br />這樣應該可以避免不小心修改設定造成無法登入的情形吧. (不過要是那天升級忘了, 可能又會碰到吧)
Patch
Software
2013-07-20T11:16:19Z
tommy
-
Console 輸入中文的修正
https://blog.teatime.com.tw/1/post/446
<p><a href="http://blog.teatime.com.tw/1/post/433" target="_blank">之前有提過</a> 用 <a href="https://sourceforge.net/projects/console/" target="_blank">Console</a> 這個程式來取代 Command Prompt, 也提到修正中文顯示的方式. 不過, 最近發現無法輸入中文...</p><p>Google 找了一下, 發現有人做出了<a href="http://download.csdn.net/detail/zhangj7851/2513105" target="_blank">修正</a>. 就照著自己改了一下, 然後重新 build 一個版本出來, 果然可以正常的輸入中文.</p><p>patch 的內容如下:</p><pre class="diff"><div class="insertcode"><pre class="diff" style="font-family: monospace">--- Console/ConsoleView.cpp.orig 2013-06-02 21:11:47.192427700 +0800<br /><span class="re4">+++ Console/ConsoleView.cpp <span class="nu0">2013</span>-06-02 <span class="nu0">17</span>:<span class="nu0">35</span>:<span class="nu0">41.261442200</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">95</span>,<span class="nu0">7</span> +<span class="nu0">95</span>,<span class="nu0">12</span> @@</span><br /> // This prevents WM_CHAR and WM_SYSCHAR messages, enabling stuff like<br /> // handling 'dead' characters input and passing all keys to console.<br /> if <span class="br0">(</span>pMsg->wParam == VK_PACKET<span class="br0">)</span> return FALSE;<br /><span class="re7">- ::DispatchMessage<span class="br0">(</span>pMsg<span class="br0">)</span>;</span><br /><span class="re8">+ // chinese input begin</span><br /><span class="re8">+ //::DispatchMessage<span class="br0">(</span>pMsg<span class="br0">)</span>;</span><br /><span class="re8">+ ::TranslateMessage<span class="br0">(</span>pMsg<span class="br0">)</span>;</span><br /><span class="re8">+ if<span class="br0">(</span>!::PeekMessage<span class="br0">(</span>pMsg, NULL, <span class="nu0">0</span>, <span class="nu0">0</span>, PM_NOREMOVE<span class="br0">)</span><span class="br0">)</span></span><br /><span class="re8">+ ::DispatchMessage<span class="br0">(</span>pMsg<span class="br0">)</span>;</span><br /><span class="re8">+ // chinese input end</span><br /> return TRUE;<br /> <span class="br0">}</span></pre></div></pre><p>如果你不打算自行編譯的話, 也可以用我自行編譯的這個版本: <a href="http://www.teatime.com.tw/~tommy/files/console2_b148_chinese_input.7z" target="_blank">http://www.teatime.com.tw/~tommy/files/console2_b148_chinese_input.7z</a></p><p>這是用 Visual Studio 2012 編譯出來的, 如果不能執行, 請自行裝上 <a href="http://www.microsoft.com/zh-tw/download/details.aspx?id=30679" target="_blank">2012 的 Redistributable Package</a>. 對了, 裡頭包含 x86 與 x64 的版本.</p>
Patch
Software
2013-06-02T21:13:28Z
tommy
-
修正 mencoder 在 Linux kernel 3.9 底下電視錄影不正確的問題
https://blog.teatime.com.tw/1/post/444
<p>這個我不確定算是 <a href="http://www.mplayerhq.hu/" target="_blank">mencoder</a> 還是 <a href="https://www.kernel.org/" target="_blank">Linux kernel</a> 3.9 的問題. 反正兩者放一起就是有問題就對了.</p><p>發生的原因是在 Linux kernel 3.9 中, 對於 V4L2 的時間取得改成使用 <span class="st">monotonic timestamp (透過 v4l2_get_timestamp() 來處理), 但是在 mencoder 中, 似乎沒辦法正確去判斷是一般的 timestamp 還是 monotonic timestamp 就直接當成一般的時間來處理, 所以在計算時間上就有問題.</span> </p><p>直接對 kernel 修改, 似乎是比較快的方式, 所以... 我就直接把 v4l2_get_timestamp() 改回原本用的 do_gettimeofday() 來處理, 這樣子在 mencoder 就可以正確的處理了.</p><p>例如:</p><pre class="diff"><div class="insertcode"><pre class="diff" style="font-family: monospace">--- linux/drivers/media/pci/saa7134/saa7134-core.c.orig 2013-05-03 14:41:58.146094840 +0800<br /><span class="re4">+++ linux/drivers/media/pci/saa7134/saa7134-core.c <span class="nu0">2013</span>-05-03 <span class="nu0">14</span>:<span class="nu0">42</span>:<span class="nu0">23.690886995</span> +0800</span><br /><span class="re6">@@ -<span class="nu0">308</span>,<span class="nu0">7</span> +<span class="nu0">308</span>,<span class="nu0">7</span> @@</span><br /> <br /> /* finish current buffer */<br /> q->curr->vb.state = state;<br /><span class="re7">- v4l2_get_timestamp<span class="br0">(</span>&q->curr->vb.ts<span class="br0">)</span>;</span><br /><span class="re8">+ do_gettimeofday<span class="br0">(</span>&q->curr->vb.ts<span class="br0">)</span>;</span><br /> wake_up<span class="br0">(</span>&q->curr->vb.done<span class="br0">)</span>;<br /> q->curr = NULL;<br /> <span class="br0">}</span></pre></div></pre><p>上面是對 saa7134 的處理, 如果你用的是其他的模組, 就要去修改該模組的內容, 或... 直接去改 v4l2_get_timestamp() 也是可以.</p>
Linux
Patch
2013-05-04T10:29:26Z
tommy