update 2026-09-26 11:07:27

This commit is contained in:
action committed 2026-09-26 11:07:27 +08:00
1 parent 7b88b273d0
commit 97ae9f68da
4898 files changed
-1712274

No files matched your search

-17
View File
@@ -1,17 +0,0 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-aliyundrive-webdav
PKG_VERSION:=2.3.3
PKG_RELEASE:=1
PKG_PO_VERSION:=$(PKG_VERSION)-$(PKG_RELEASE)
PKG_LICENSE:=MIT
PKG_MAINTAINER:=messense <messense@icloud.com>
LUCI_TITLE:=LuCI Support for aliyundrive-webdav
LUCI_PKGARCH:=all
LUCI_DEPENDS:=+aliyundrive-webdav
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature
@@ -1,66 +0,0 @@
module("luci.controller.aliyundrive-webdav", package.seeall)
function index()
if not nixio.fs.access("/etc/config/aliyundrive-webdav") then
return
end
local page
page = entry({ "admin", "services", "aliyundrive-webdav" }, alias("admin", "services", "aliyundrive-webdav", "client"),
_("AliyunDrive WebDAV"), 10) -- 首页
page.dependent = true
page.acl_depends = { "luci-app-aliyundrive-webdav" }
entry({ "admin", "services", "aliyundrive-webdav", "client" }, cbi("aliyundrive-webdav/client"), _("Settings"), 10).leaf = true -- 客户端配置
entry({ "admin", "services", "aliyundrive-webdav", "log" }, form("aliyundrive-webdav/log"), _("Log"), 30).leaf = true -- 日志页面
entry({ "admin", "services", "aliyundrive-webdav", "status" }, call("action_status")).leaf = true -- 运行状态
entry({ "admin", "services", "aliyundrive-webdav", "logtail" }, call("action_logtail")).leaf = true -- 日志采集
entry({ "admin", "services", "aliyundrive-webdav", "qrcode" }, call("action_generate_qrcode")).leaf = true -- 生成扫码登录二维码地址和参数
entry({ "admin", "services", "aliyundrive-webdav", "query" }, call("action_query_qrcode")).leaf = true -- 查询扫码登录结果
entry({ "admin", "services", "aliyundrive-webdav", "invalidate-cache" }, call("action_invalidate_cache")).leaf = true -- 清除缓存
end
function action_status()
local e = {}
e.running = luci.sys.call("pidof aliyundrive-webdav >/dev/null") == 0
e.application = luci.sys.exec("aliyundrive-webdav --version")
luci.http.prepare_content("application/json")
luci.http.write_json(e)
end
function action_logtail()
local fs = require "nixio.fs"
local log_path = "/var/log/aliyundrive-webdav.log"
local e = {}
e.running = luci.sys.call("pidof aliyundrive-webdav >/dev/null") == 0
if fs.access(log_path) then
e.log = luci.sys.exec("tail -n 100 %s | sed 's/\\x1b\\[[0-9;]*m//g'" % log_path)
else
e.log = ""
end
luci.http.prepare_content("application/json")
luci.http.write_json(e)
end
function action_generate_qrcode()
local output = luci.sys.exec("aliyundrive-webdav qr generate")
luci.http.prepare_content("application/json")
luci.http.write(output)
end
function action_query_qrcode()
local data = luci.http.formvalue()
local sid = data.sid
local output = {}
output.refresh_token = luci.sys.exec("aliyundrive-webdav qr query --sid " .. sid)
luci.http.prepare_content("application/json")
luci.http.write_json(output)
end
function action_invalidate_cache()
local e = {}
e.ok = luci.sys.call("kill -HUP `pidof aliyundrive-webdav`") == 0
luci.http.prepare_content("application/json")
luci.http.write_json(e)
end
@@ -1,83 +0,0 @@
m = Map("aliyundrive-webdav")
m.title = translate("AliyunDrive WebDAV")
m.description = translate("<a href=\"https://github.com/messense/aliyundrive-webdav\" target=\"_blank\">Project GitHub URL</a>")
m:section(SimpleSection).template = "aliyundrive-webdav/aliyundrive-webdav_status"
e = m:section(TypedSection, "server")
e.anonymous = true
enable = e:option(Flag, "enable", translate("Enable"))
enable.rmempty = false
refresh_token = e:option(Value, "refresh_token", translate("Refresh Token"))
refresh_token.description = translate("Double click the input box above to get refresh token by scanning qrcode")
qrcode = e:option(DummyValue, '', '')
qrcode.rawhtml = true
qrcode.template = 'aliyundrive-webdav/aliyundrive-webdav_qrcode'
root = e:option(Value, "root", translate("Root Directory"))
root.description = translate("Restrict access to a folder of aliyundrive, defaults to / which means no restrictions")
root.default = "/"
host = e:option(Value, "host", translate("Host"))
host.default = "0.0.0.0"
host.datatype = "ipaddr"
port = e:option(Value, "port", translate("Port"))
port.default = "8080"
port.datatype = "port"
drive_type = e:option(ListValue, "drive_type", translate("Aliyun drive type"))
drive_type.description = translate("Supports drive type: resource, backup")
drive_type:value("resource", "resource");
drive_type:value("backup", "backup");
drive_type.default = "backup"
tls_cert = e:option(Value, "tls_cert", translate("TLS certificate file path"))
tls_key = e:option(Value, "tls_key", translate("TLS private key file path"))
auth_user = e:option(Value, "auth_user", translate("Username"))
auth_password = e:option(Value, "auth_password", translate("Password"))
auth_password.password = true
read_buffer_size = e:option(Value, "read_buffer_size", translate("Read Buffer Size"))
read_buffer_size.default = "10485760"
read_buffer_size.datatype = "uinteger"
prefer_http_download = e:option(Flag, "prefer_http_download", translate("Prefer HTTP Download"))
prefer_http_download.description = translate("Prefer downloading files using HTTP instead of HTTPS protocol")
prefer_http_download.rmempty = false
redirect = e:option(Flag, "redirect", translate("Enable 302 Redirect"))
redirect.description = translate("Enable 302 redirect when possible")
redirect.rmempty = false
upload_buffer_size = e:option(Value, "upload_buffer_size", translate("Upload Buffer Size"))
upload_buffer_size.default = "16777216"
upload_buffer_size.datatype = "uinteger"
skip_upload_same_size = e:option(Flag, "skip_upload_same_size", translate("Skip uploading same size files"))
skip_upload_same_size.description = translate("Reduce the upload traffic by skipping uploading files with the same size")
skip_upload_same_size.rmempty = false
cache_size = e:option(Value, "cache_size", translate("Cache Size"))
cache_size.default = "1000"
cache_size.datatype = "uinteger"
cache_ttl = e:option(Value, "cache_ttl", translate("Cache Expiration Time (seconds)"))
cache_ttl.default = "600"
cache_ttl.datatype = "uinteger"
no_trash = e:option(Flag, "no_trash", translate("Delete file permanently instead of trashing"))
no_trash.rmempty = false
read_only = e:option(Flag, "read_only", translate("Enable read only mode"))
read_only.description = translate("Disallow upload, modify and delete file operations")
read_only.rmempty = false
debug = e:option(Flag, "debug", translate("Debug Mode"))
debug.rmempty = false
return m
@@ -1,9 +0,0 @@
log = SimpleForm("logview")
log.submit = false
log.reset = false
t = log:field(DummyValue, '', '')
t.rawhtml = true
t.template = 'aliyundrive-webdav/aliyundrive-webdav_log'
return log
@@ -1,15 +0,0 @@
<%+cbi/valueheader%>
<textarea id="logview" class="cbi-input-textarea" style="width: 100%" rows="30" readonly="readonly"></textarea>
<script type="text/javascript">
const LOG_URL = '<%=luci.dispatcher.build_url("admin", "services", "aliyundrive-webdav", "logtail")%>';
XHR.poll(1, LOG_URL, null, (x, d) => {
let logview = document.getElementById("logview");
if (!d.running) {
XHR.halt();
}
logview.value = d.log;
logview.scrollTop = logview.scrollHeight;
});
</script>
<%+cbi/valuefooter%>
@@ -1,158 +0,0 @@
<%+cbi/valueheader%>
<script src="https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode.min.js"></script>
<style>
#mask-box {
z-index: 1000;
display: flex;
position: absolute;
text-align: center;
background: rgba(255, 255, 255, .8);
}
#mask-box #code-box {
color: #000000;
width: 288px;
height: 325px;
border: 1px solid #585858;
padding: 15px;
position: absolute;
box-shadow: 0px 0px 7px 3px rgb(0 0 0 / 20%);
background: #fff url('data:image/gif;base64,R0lGODlhQABAAMQAAJSWlNTS1LSytOzq7MTCxNze3PT29KSipLy6vNza3PTy9MzKzOTm5Pz+/KyqrJyenNTW1LS2tOzu7MTGxOTi5Pz6/KSmpLy+vP///wAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAwAYACwAAAAAQABAAAAF/iAmjmRpnmiqrmzrvnAsz3Rt33iu7zxqUBRDr2dAPABIhHCIMxyQyKNlyawZoVhEtWbAHo/IynZGiZoBR8rY1CgQLouBiQEF19XrkUHw6PcXDSRddlgAYnkYDXwPB34PASUIXlBaiBgFfY2ZjIciCo1eBwooCgkMgToEjqt4IwpXaAijJwoBEBAMOwiaqw8JtECzKAMJtgU7C71+cjQVtgnMOQOOjY0OqM0DwjrJqwetli4NAZoHDuDhLxUUCRSd6fDx8vP09SYSCQkS9isVEw4OLDiY8I4fiX8CAw5cU6FgCwkKEwrcV4VBgAC5YCQAKFDiMSbOLgag0iJBQo4AwX8xMSByJAyIHSNSZGIRowyEAAFOWGOApDqcFggaTCGhQIGZQ5MqXcq0qVMWDSpgc+pMgAAE6JZOsMr1Y40GCRYE2IZDAlcHViNMlZHgzYQJa21QEICWqwCfMRa8JTCBrA0GdtGqtRGAgGECeL8isOogggMIKhrELaFgb8YdEiIIcAwIRQMIFy5AcEiigYLEOBowOKoCAoLXCCA7bXABNoILkw3Svh0hdG6Drm/HfpoItGjSSyUTX868ufPn0KMnDQEAIfkECQMAGQAsAAAAAEAAQACEnJqc1NLUtLa07OrsrKqs3N7cxMLE9Pb0pKKk3NrcvL689PL0tLK05ObkzMrM/P78nJ6c1NbUvLq87O7srK6s5OLkxMbE/Pr8pKak////AAAAAAAAAAAAAAAAAAAAAAAABf5gJo5kaZ5oqq5s675wLM90bd94ru88eg2DS693sUAAAIhFOMRdKMgogMJs1gxSqcVauxyzSEiVCxuApQ3yaRCwJA4m8xmZVo8uCgREj0mUvHMQcCYLBQMPPAZ8CHoIBSUWc1slDw4ClwoLOgN7jZ0UiHdQWRihJAGXqQpjNQF7nY0IEyUHRmEKpiMPqQwCvQM5DhAYnhh7wCYHEw25JAepAhK9FTkRscOMgjMPCr7eDJo4B9nErwo1FdACDjsJw68IGOE0FQoMEgHNNxUEjAgSs248uKAvx4Nlg+woXMiwocOHdn4EgfjiQQIKBDBQSFCQYokIBDJiJBBBzQVWLcyehAypkQqXAREiIHsxQKTGlTOJxIyJUkXNlRkzBhxyIUIAoz1TPNF4k4JLKzBlyogwMmhJMie3USXgNEJHj38GMANLtqzZs2jTqlVbwYACB/PWZkjgi0GvuNsaBCiQlMaFuhR8sbPRwIIDC/l2TOjFmME5G20ML9lxwG5guwZuFDhs+OsMS3UFULNxoI2DoToOOGAQ2A+KBxUcOKjgeaBn0hM811PAe7TcDA4USBA++Hdw3m9/i6g3XIJvubBl01ZOvbr169iza9/+OwQAIfkECQMAGgAsAAAAAEAAQACElJaUzM7MtLK07OrspKakxMLE3N7c9Pb0nJ6c1NbUvLq89PL0rK6szMrM/P78nJqc1NLUtLa07O7srKqsxMbE5Obk/Pr8pKKk3NrcvL68////AAAAAAAAAAAAAAAAAAAABf6gJo5kaZ5oqq5s675wLM90bd94ru886hwLR6/nCBAeCEJAOMQ5FMgoQmFp3gLS6CNgrTkIiCwiyezGDmLtwXw6GDCVagkdrksXc8oF8IgMdg4QBAQXFwx/JF9pZCQLewCQkAk6gheElxIlEIsQJBYEkZEPAIg2B4OWqQQKJRYRdmFUJBihtRE4BpeqlnIjgRdhBBC9Ihm1oQ84GLu6ayY/QScKx6FlNBXMlhPWLgXUkBdODNkNMxXfAAU5A7qEAsQw08cXeDkSCoQTDc4zT7X0PSwc4EZjQAEFCjDAY8OwocOHECOqsLBQIosBChgwUFDK4ooBGkMeYuOgIouMDMgmpNxoZkCCBB1bWBDJQIBKk05evsR5YqbKnxp52rCQAMLOGChtamTVxSWEmC1ATlBZswJJoSkwLoXqcSLWrmDDih1LtqxZsgsgBFB4toSECHAjFPi6QoKBCgRvFIigQABcDDckNAjQwAAPB3EV8C1nw8DgwXlpPOkbwW8nGxUeT+KBAa5iBZlsOMAQAAI/HaMVF+A6QsLL0Coi5yhZt0AG27DbakhwW0GBzbp3H7x9ObiE2xky5NYtwWi94NCjS59Ovbr169dDAAAh+QQJAwAaACwAAAAAQABAAISUlpTMzsy0srTs6uzc3tzEwsSkpqT09vTU1tS8urycnpz08vTk5uTMysysrqz8/vzU0tS0trTs7uzk4uTExsSsqqz8+vzc2ty8vrykoqT///8AAAAAAAAAAAAAAAAAAAAF/qAmjmRpnmiqrmzrvnAsz3Rt33iu73z6PL3g4yJQKAQEYBD3oBgVGWNBuawRolFj9FK1FZ9gQZf2AJszlvHpIWEs1mYzVWShGACKxIA3ERgqBhhvJQJZUE9iJAsZAI2OXDkTBn+UAgclF2dGkHQVjp8AezcPfoB/GQYBJQ8FhlBTJBegnwk4A5QVqICJJENFGQIXaSQFnwp4jRk4DKaAzhUpFsMmCbOfOAuUp5O1MhSNx6DKOBjbzpwwA9aNDTkLpZMVsDPFs2g6Bw0CFQkXczEW6jmqMEgNjQENEhQQZrChw4cQI0qcuONAgAQRAlyiyOJAAgcCQEbY2OXBNBgBvkBWAOlAVZcBCBCIgvGRpcguFmJCQPCPRYSQQB10W5Lzws6TLVLucwCy3cudM194ZCnAkhqTNPJhbECSo9evYMOKHUu2rFkXFiZcGNCT7IECETBCaBtjwQS2PSAkwIhBz40FAQIz6AF3b1x0MxgEgLC4x8W4cSfcGBAYAmJbfBNgoPviwQTLXXVQLgAhdIkDEwiYLpuvQAEKq8dOcP1a8lkRBF67JnBbxAEKrmH39p069vDjyJMrX868uXOIIQAAIfkECQMAGwAsAAAAAEAAQACElJaUzM7MtLK07OrspKak3N7cxMLE9Pb0nJ6c1NbUvLq89PL0rK6s5ObkzMrM/P78nJqc1NLUtLa07O7srKqs5OLkxMbE/Pr8pKKk3NrcvL68////AAAAAAAAAAAAAAAABf7gJo5kaZ5oqq5s675wLM90bd94ru9877MDDYNhGPx0CYwSgUEkjrdBc6rEGKE0DZWJQBiwNMaSimGAUZfDA0VhNglcc+kSaGM0E95CQ6EwAhcmBm9LBHclBwQAABCMEAU6CwwUBJQUGmskA1xvTFciDwyNjYuMeTh8lJN9kCVJhBhPJBWMi6OMGjgXlpaVXyYNBpManyMWtrWkGDgHfZXPFAozGrfJjDihqqoEDjMO1qUQFDl1vJXFLxOl4AE5F3zPDLIzFhCkthiBOQ8FBhoO6GI8MGCNwoIzNSY4MGCgQiaEECNKnEixokWBBRxYKPDwx4MKDhxwFGhBgEkBFto68njgQICElw5UrigggEFNk618VHD5UoKACjBa2rxp4YiDnjy7vSh502bRHwF4KnCp1AXNoTVz9qjgs6sEoC8elLTJIOURlkhjYtToEMsFkA4q6LtIt67du3jz6t3b48GCBgf4lngQQIFhsDcODJgg80YFwxoUaAhs40CEyw16FDZsOLONARECJMjQI4NkCRrw3JhwOYLWHAdSRw7QGMaDAQnk+jiQIYDuFBcGDJgreAMdCxYiEOc7wIJGCwH1NncOvbgIOhqVW78+oMHy7eDDix9Pvrz58xVDAAAh+QQJAwAaACwAAAAAQABAAISUlpTMzsy0srTs6uzc3tzEwsSkpqT09vTU1tS8urycnpz08vTk5uTMysysrqz8/vycmpzU0tS0trTs7uzk4uTExsSsqqz8+vzc2ty8vrz///8AAAAAAAAAAAAAAAAAAAAF/qAmjmRpnmiqrmzrvnAsz3Rt33iu73zvs4dAIhE4/HQMi2FpsDCOt4OSubQsoLWAQbHtGgJYWoLKVCTCs7GXeS5dEAKDo3LdXSISR4Zy0lIhSxFuDhCFhQpPORdjFo0WgiULFlxUViUShQCGEAp1NxFyjaETJklLEI18JAObEAAKhRU5EqIOopCRDUMNniMNmbCuhQ45tha2oQ0zv6+usK8GORlKjkoYMxGGzZwQAjkEx0q2DkYyB87Amgg6EeLHA1nPwRAODzsTEQ0I5TQP2cASLqCpcQBBhQiJBipcyLChQxkLCBDo9XDFAgEAMgIQQLHFBAwISB1ZoECjxk4w3DAIECBBwLUfGE1q9OZiwsqbAkTyWCBTZkcUKvNIaLmuB4GeJlWxgDN0pYSiPCgg1fiShU2nDiTo3MFzKoCfKBC0bFm1R8yeNF9MQBASygJXMiGArTjiokmOdFsswIBhbt6/gAMLHpz3wgJ7hE8QyJChwNYaFwYc7jEhQwLGBRATZNuWx2LGl/16ZBuBQA8GCQpcziDQxoIIbBPqeKCLsekbDyYQoKDZDgMC8FQ8WDChd2IRDzA0CIDBeOIFy5c/TjwhQHTRf5MvR+A8ce7Jx8OLH0++vPnz6NPTCAEAIfkECQMAGQAsAAAAAEAAQACElJaUzM7M7OrstLK03N7cxMLE9Pb0pKak1NbUvLq8nJ6c9PL05ObkzMrM/P781NLU7O7stLa05OLkxMbE/Pr8rK6s3NrcvL68pKKk////AAAAAAAAAAAAAAAAAAAAAAAABf5gJo5kaZ5oqq5s675wLM90bd94ru9877MOQqNBcPx0i0HlwIwsjjfHgEk9JCjQGmHJ5B4kWVqjeqhgDo3wbLw0u9Mlh+QyiDywO/mkEHiaCFVmTGAkFAkKiIgHEDoOARWQkAwmhl0YZgNLine truncated
border-radius: 4px;
}
#mask-box #code-box img {
margin-top: 5px;
}
#mask-box #close-link {
float: right;
width: 32px;
height: 32px;
margin: -32px;
cursor: pointer;
overflow: hidden;
background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHhtbDpzcGFjZT0icHJlc2VydmUiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiB5PSIwIiB4PSIwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSLlnJblsaRfMSIgdmVyc2lvbj0iMS4xIiB3aWR0aD0iNDdweCIgaGVpZ2h0PSI0N3B4IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgc3R5bGU9IndpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZC1zaXplOmluaXRpYWw7YmFja2dyb3VuZC1yZXBlYXQteTppbml0aWFsO2JhY2tncm91bmQtcmVwZWF0LXg6aW5pdGlhbDtiYWNrZ3JvdW5kLXBvc2l0aW9uLXk6aW5pdGlhbDtiYWNrZ3JvdW5kLXBvc2l0aW9uLXg6aW5pdGlhbDtiYWNrZ3JvdW5kLW9yaWdpbjppbml0aWFsO2JhY2tncm91bmQtY29sb3I6aW5pdGlhbDtiYWNrZ3JvdW5kLWNsaXA6aW5pdGlhbDtiYWNrZ3JvdW5kLWF0dGFjaG1lbnQ6aW5pdGlhbDthbmltYXRpb24tcGxheS1zdGF0ZTpwYXVzZWQiID48ZyBjbGFzcz0ibGRsLXNjYWxlIiBzdHlsZT0idHJhbnNmb3JtLW9yaWdpbjo1MCUgNTAlO3RyYW5zZm9ybTpyb3RhdGUoMGRlZykgc2NhbGUoMC44LCAwLjgpO2FuaW1hdGlvbi1wbGF5LXN0YXRlOnBhdXNlZCIgPjxjaXJjbGUgZmlsbD0iIzMzMyIgcj0iNDAiIGN5PSI1MCIgY3g9IjUwIiBzdHlsZT0iZmlsbDpyZ2IoODksIDg5LCA4OSk7YW5pbWF0aW9uLXBsYXktc3RhdGU6cGF1c2VkIiA+PC9jaXJjbGU+CjxnIHN0eWxlPSJhbmltYXRpb24tcGxheS1zdGF0ZTpwYXVzZWQiID48cGF0aCBkPSJNMjUuMyA0NWg0OS41djEwSDI1LjN6IiBmaWxsPSIjZTE1YjY0IiB0cmFuc2Zvcm09InJvdGF0ZSgtNDQuOTk2IDQ5Ljk5NyA0OS45OTcpIiBzdHlsZT0iZmlsbDpyZ2IoMjU1LCAyNTUsIDI1NSk7YW5pbWF0aW9uLXBsYXktc3RhdGU6cGF1c2VkIiA+PC9wYXRoPjwvZz4KPGcgc3R5bGU9ImFuaW1hdGlvbi1wbGF5LXN0YXRlOnBhdXNlZCIgPjxwYXRoIGQ9Ik00NSAyNS4zaDEwdjQ5LjVINDV6IiBmaWxsPSIjZTE1YjY0IiB0cmFuc2Zvcm09InJvdGF0ZSgtNDUuMDAxIDUwIDUwKSIgc3R5bGU9ImZpbGw6cmdiKDI1NSwgMjU1LCAyNTUpO2FuaW1hdGlvbi1wbGF5LXN0YXRlOnBhdXNlZCIgPjwvcGF0aD48L2c+CjxtZXRhZGF0YSB4bWxuczpkPSJodHRwczovL2xvYWRpbmcuaW8vc3RvY2svIiBzdHlsZT0iYW5pbWF0aW9uLXBsYXktc3RhdGU6cGF1c2VkIiA+PGQ6bmFtZSBzdHlsZT0iYW5pbWF0aW9uLXBsYXktc3RhdGU6cGF1c2VkIiA+Y2xvc2U8L2Q6bmFtZT4KPGQ6dGFncyBzdHlsZT0iYW5pbWF0aW9uLXBsYXktc3RhdGU6cGF1c2VkIiA+Y2xvc2UscmVqZWN0LG9mZixkaXNhYmxlLHJlbW92ZSxkZWxldGUsY2FuY2VsLGRyb3AsY29sbGFwc2U8L2Q6dGFncz4KPGQ6bGljZW5zZSBzdHlsZT0iYW5pbWF0aW9uLXBsYXktc3RhdGU6cGF1c2VkIiA+Ynk8L2Q6bGljZW5zZT4KPGQ6c2x1ZyBzdHlsZT0iYW5pbWF0aW9uLXBsYXktc3RhdGU6cGF1c2VkIiA+bmVmM2Q0PC9kOnNsdWc+PC9tZXRhZGF0YT48L2c+PCEtLSBnZW5lcmF0ZWQgYnkgaHR0cHM6Ly9sb2FkaW5nLmlvLyAtLT48L3N2Zz4=') no-repeat center center;
}
#mask-box #load-link {
color: #fbfbfb;
left: 0;
right: 0;
margin: 0 10px;
bottom: 115px;
cursor: pointer;
display: block;
position: absolute;
background: #e4393c;
line-height: 48px;
text-decoration: none;
}
div[id$="-html"] {
display: none;
}
</style>
<script type="text/javascript">
(function( window, document, undefined ) {
// 选取 DOM 元素
var selector, section = document.querySelector("[id$='refresh_token']");
// 遮罩容器
var mask = document.createElement('div');
mask.id = 'mask-box';
// 二维码容器
var code = document.createElement('div');
code.id = 'code-box';
code.innerHTML = "请使用 阿里云盘 App 进行扫码认证";
// 刷新按钮
var load = document.createElement('a');
load.id = 'load-link';
load.innerHTML = "刷新";
// 创建二维码
var make = new QRCode( code, { correctLevel: QRCode.CorrectLevel.L });
make.clear = function() {
code.getElementsByTagName("img").item(0).removeAttribute('src');
this._oDrawing.clear();
}
// 关闭按钮
var link = document.createElement('a');
link.id = 'close-link';
link.addEventListener('click', ( e ) => {
XHR.halt();
XHR._q = [];
mask.remove();
return false;
});
// 二维码层居中
var center = function() {
// 调整遮罩层覆盖范围
mask.style.width = section.clientWidth + "px";
mask.style.height = section.clientHeight + "px";
// 二维码层居中
var top = selector.offsetTop - selector.parentNode.offsetTop;
if ( selector.offsetTop <= 380 ) {
code.style.top = top + selector.offsetHeight + "px";
} else {
code.style.top = top - code.offsetHeight + "px";
}
code.style.left = ( ( section.offsetWidth - code.offsetWidth ) / 2 ) + parseInt( ( selector.currentStyle || window.getComputedStyle( selector ) ).marginLeft ) + "px";
};
// 获取二维码
var feedback = function() {
// 清除二维码
make.clear();
// 获取通信数据
XHR.get( '<%=luci.dispatcher.build_url("admin", "services", "aliyundrive-webdav","qrcode")%>', null, ( x, d ) => {
if ( x.status != 200 ) {
alert('获取二维码失败!');
return false;
}
// 移除刷新
load.remove();
// 创建二维码
make.makeCode("https://www.aliyundrive.com/o/oauth/authorize?sid=" + d.sid);
// 监听扫码反馈
XHR.poll( 3, '<%=luci.dispatcher.build_url("admin", "services", "aliyundrive-webdav", "query")%>', { sid: d.sid }, ( x, d ) => {
if ( d.refresh_token.trim() ) {
// 清除线程
XHR.halt();
XHR._q = [];
// 回写 Cookie 数据
mask.remove();
selector.value = d.refresh_token.trim();
}
});
});
};
// 鼠标事件
var event = function( e ) {
// 区分单击、双击事件
if ( e.target.tagName == "INPUT" && e.type == "dblclick" ) {
selector = e.target;
} else if ( e.target.tagName == "IMG" && e.type == "click" && /add/ig.test( e.target.src ) ) {
selector = section.getElementsByTagName("INPUT");
selector = selector.item( selector.length - 1 );
} else {
return false;
}
// 插入容器
if ( !document.contains( mask ) ) {
section.prepend( mask );
mask.prepend( code );
code.prepend( link );
center();
}
// 获取及监听扫码事件
feedback();
};
// 绑定事件
section.addEventListener( 'click', event );
section.addEventListener( 'dblclick', event );
})( window, document );
</script>
<%+cbi/valuefooter%>
@@ -1,36 +0,0 @@
<script type="text/javascript">//<![CDATA[
XHR.poll(3, '<%=url([[admin]], [[services]], [[aliyundrive-webdav]], [[status]])%>', null,
function(x, data) {
var tb = document.getElementById('aliyundrive-webdav_status');
if (data && tb) {
if (data.running) {
tb.innerHTML = '<em><b style=color:green>' + data.application + '<%:RUNNING%></b></em>';
} else {
tb.innerHTML = '<em><b style=color:red>' + data.application + '<%:NOT RUNNING%></b></em>';
}
}
}
);
function invalidateCache(button) {
XHR.get('<%=url([[admin]], [[services]], [[aliyundrive-webdav]], [[invalidate-cache]])%>', null,
function(x, data) {
if (data.ok) {
alert("缓存已清除.");
} else {
alert("清除缓存失败!");
}
}
);
}
//]]>
</script>
<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>
<fieldset class="cbi-section">
<p id="aliyundrive-webdav_status" style="float: left; width: 60%; margin-top: 12px;">
<em><%:Collecting data...%></em>
</p>
<p class="right" style="float: right; width: 40%;">
<button class="cbi-button" onclick="event.stopPropagation(); invalidateCache(this);"><%:Invalidate cache%></button>
</p>
</fieldset>
@@ -1,110 +0,0 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8\n"
msgid "AliyunDrive"
msgstr "阿里云盘"
msgid "AliyunDrive WebDAV"
msgstr "阿里云盘 WebDAV"
msgid "Enable"
msgstr "启用"
msgid "Refresh Token"
msgstr "Refresh Token"
msgid "Root Directory"
msgstr "云盘根目录"
msgid "Host"
msgstr "监听主机"
msgid "Port"
msgstr "监听端口"
msgid "Aliyun drive type"
msgstr "云盘驱动类型"
msgid "Supports drive type: resource, backup"
msgstr "支持驱动器类型:resource, backup"
msgid "TLS certificate file path"
msgstr "TLS 证书文件路径"
msgid "TLS private key file path"
msgstr "TLS 私钥文件路径"
msgid "Username"
msgstr "用户名"
msgid "Password"
msgstr "密码"
msgid "Read Buffer Size"
msgstr "下载缓冲大小(bytes)"
msgid "Upload Buffer Size"
msgstr "上传缓冲大小(bytes)"
msgid "Cache Size"
msgstr "目录缓存大小"
msgid "Cache Expiration Time (seconds)"
msgstr "目录缓存过期时间(单位为秒)"
msgid "Collecting data..."
msgstr "获取数据中..."
msgid "Invalidate cache"
msgstr "清除缓存"
msgid "RUNNING"
msgstr "运行中"
msgid "NOT RUNNING"
msgstr "未运行"
msgid "Settings"
msgstr "设置"
msgid "Log"
msgstr "日志"
msgid "Debug Mode"
msgstr "调试模式"
msgid "<a href=\"https://github.com/messense/aliyundrive-webdav\" target=\"_blank\">Project GitHub URL</a>"
msgstr "<a href=\"https://github.com/messense/aliyundrive-webdav\" target=\"_blank\">GitHub 项目地址</a> | <a href=\"https://t.zsxq.com/0c9sq6Ca8\" target=\"_blank\">加入知识星球</a>"
msgid "Double click the input box above to get refresh token by scanning qrcode"
msgstr "鼠标双击上面的输入框扫码登录自动获取 refresh token"
msgid "Restrict access to a folder of aliyundrive, defaults to / which means no restrictions"
msgstr "限制只能访问该云盘目录,默认为 / 表示不限制,注意这个参数不是本地磁盘路径"
msgid "Delete file permanently instead of trashing"
msgstr "删除文件不放入回收站"
msgid "Enable read only mode"
msgstr "启用只读模式"
msgid "Disallow upload, modify and delete file operations"
msgstr "禁止上传、修改和删除文件操作"
msgid "Skip uploading same size files"
msgstr "跳过上传相同大小的文件"
msgid "Reduce the upload traffic by skipping uploading files with the same size"
msgstr "跳过上传相同大小的文件减少上传流量消耗,但可能会导致修改过的同样大小的文件不会被上传"
msgid "Prefer HTTP Download"
msgstr "使用 HTTP 下载"
msgid "Prefer downloading files using HTTP instead of HTTPS protocol"
msgstr "优先使用 HTTP 而不是 HTTPS 协议下载,低端设备上降低 CPU 占用"
msgid "Enable 302 Redirect"
msgstr "启用 302 重定向"
msgid "Enable 302 redirect when possible"
msgstr "在可能的情况下启用 302 重定向"
-1
View File
@@ -1 +0,0 @@
zh-cn
@@ -1,11 +0,0 @@
#!/bin/sh
uci -q batch <<-EOF >/dev/null
delete ucitrack.@aliyundrive-webdav[-1]
add ucitrack aliyundrive-webdav
set ucitrack.@aliyundrive-webdav[-1].init=aliyundrive-webdav
commit ucitrack
EOF
rm -f /tmp/luci-indexcache
exit 0
@@ -1,11 +0,0 @@
{
"luci-app-aliyundrive-webdav": {
"description": "Grant UCI access for luci-app-aliyundrive-webdav",
"read": {
"uci": [ "aliyundrive-webdav" ]
},
"write": {
"uci": [ "aliyundrive-webdav" ]
}
}
}