Skip to content

Commit

Permalink
fix bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
reruin committed Nov 2, 2018
1 parent ca481b5 commit 92ec5b7
Show file tree
Hide file tree
Showing 40 changed files with 312 additions and 341 deletions.
134 changes: 91 additions & 43 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,67 +1,115 @@
# ShareList

在线挂载 GoogleDrive、OneDrive 的简易工具,可通过插件扩展功能。

## 特性
- 通过插件支持多种网盘系统。可通过自定义插件提供更多的类型支持
插件请置于plugins目录,自动启用。
- 支持目录嵌套
- 加密目录
在文件夹内新建 ```.密码.passwd``` 命名的文件即可,例如
```.123456.passwd```
不要省略最前方的```.```
- 国际化支持
- 即将支持WebDAV

## 已内置插件
### GoogleDrive
提供对GoogleDrive的访问。协议名 gd,id为 分享文件夹ID
### OneDrive
提供对OneDrive的访问。协议名 od,id为 分享文件夹ID
### OneDrive For Business
提供对OneDrive Business的访问。协议名 odb,id为 分享的url
### HTTP(S)
提供对HTTP链接的访问。协议名 http,id为 uri
### LocalFileSystem
ShareList 是一个易用的网盘工具,支持快速挂载 GoogleDrive、OneDrive ,可通过插件扩展功能。

## 目录
* [ShareList特性](#特性)
* [功能说明](#功能说明)
* [挂载对象](#挂载对象)
* [目录加密](#目录加密)
* [虚拟目录](#虚拟目录)
* [虚拟文件](#虚拟文件)
* [WebDAV](#WebDAV)
* [插件机制](#插件机制)
* [内置插件](#内置插件)
* [常规插件](#常规插件)
* [插件开发](#插件开发)
* [安装](#安装)

## 特性
- 多种网盘系统快速挂载。
- 支持虚拟目录和虚拟文件。
- 支持目录加密。
- 插件机制。
- 国际化支持。
- WebDAV导出。

## 功能说明
### 挂载对象
首次使用时将提示选在挂载源,选择挂载源,填入对应路径即可。
系统内置了本地路径(FileSystem)挂载源。

### 目录加密
在需加密目录内新建 ```.passwd``` 文件,```type```为验证方式,```data```为验证内容。
```yaml
type: basic
data:
- user1:111111
- user2:aaaaaa
```
```basic```是内置的验证方式,使用用户名密码对进行判断,上面的例子中可使用```user1```的密码为```111```,```user2```的密码为```aaaaaa```。[请参考](blob/master/example/SecretFolder/.passwd)。

### 虚拟目录
在需创建虚拟目录处新建```目录名.d.ln```文件。 其内容为```挂载源:挂载路径```
如:创建虚拟目录指向本地```/root```。
```
fs:/root
```
其中挂载源```fs```表示本地磁盘,```/root```代表路径。
再如:创建虚拟目录指向GoogleDrive的某个共享文件夹
```
gd:0BwfTxffUGy_GNF9KQ25Xd0xxxxxxx
```
```gd```是GoogleDrive的挂载源标示,冒号后的是共享文件夹ID。
### 虚拟文件
与虚拟目录类似,目标指向具体文件。
在需创建虚拟文件处新建```文件名.后缀名.ln```文件。 其内容为```挂载源:挂载路径```。
如:创建一个```ubuntu_18.iso```的虚拟文件,请参考[example/linkTo_download_ubuntu_18.iso.ln](example)。
### WebDAV
系统部分支持WebDAV。可使用的功能包括列目录、展示内容、权限校验。由于系统仅做挂载用途,不支持写入、删除、重命名、复制等操作。默认根路径为```/WebDAV```。
## 插件机制
插件可用于扩展挂载源、扩展加密方式。插件请置于plugins目录。
### 内置插件
内置插件位于[app/plugins](app/plugins)
#### HTTP(S)(内置)
为指向HTTP(S)的虚拟文件提供访问支持。挂载标示http(s),实际url作为路径。
#### FileSystem(内置)
提供对本地文件系统的访问。协议名 fd,id为 文件路径,统一使用linux的路径,例如 windows D盘 为 ```/d/```。
### ShareListDrive
ShareListDrive是ShareList内置的一种虚拟文件系统,使用yaml构建。以```xd```作为后缀保存。参考 ```example/download.xd```
### Ln(快捷方式)
提供一种快捷方式的实现。只需要新建类似 ```名称.类型后缀.ln``` 的文件,文件内容为```协议:id``` 即可。
特别的,文件夹将使用```d```这个预设类型后缀。
例子:
1. 重定向到 某个http链接对应的文件 参考 ```example/http_download_ubuntu_18.iso.ln```
2. 重定向到 GoogleDrive的某个目录 参考 ```example/GoogleDrive.d.ln```
3. 重定向到 本地上级目录 参考 ```example/parent_folder.d.ln```
#### ShareListDrive(内置)
ShareListDrive是ShareList内置的一种虚拟文件系统,使用yaml构建。以```sld```作为后缀保存。参考[example/ShareListDrive.sld](example)。
#### BasicAuth(内置)
提供基础文件夹加密方式。
## 插件开发
待补充

## 已知BUG
1. GoogleDrive插件:目录内文件过多时无法完全显示,也无法分页。
### 常规插件
常用插件位于[plugins](plugins)
#### GoogleDrive
提供对GoogleDrive的访问。挂载标示:```gd```,分享文件夹ID作为路径。
#### OneDrive
提供对OneDrive的访问。挂载标示```od```,分享文件夹ID作为路径。
#### OneDrive For Business
提供对OneDrive Business的访问。挂载标示odb,分享的url作为路径。
### 插件开发
待完善
## 安装
### Shell
````bash
```bash
bash install.sh
````
```

### Docker support
````bash
```bash
docker build -t yourname/sharelist .

docker run -d -v /etc/sharelist:/app/cache -p 33001:33001 --name="sharelist" yourname/sharelist
````
```

OR

````bash
```bash
docker-compose up
````
```

访问 `http://localhost:33001`
WebDAV 目录 `http://localhost:33001/webdav`


### Heroku
Expand Down
7 changes: 2 additions & 5 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,8 @@ if(!fs.existsSync('./cache')){
fs.mkdirSync('./cache');
}

/**
* Get port from environment and store in Express.
*/

var port = normalizePort(config.port || 33001);
var port = normalizePort(config.getPort() || 33001);

var server = http.createServer(app.callback());

Expand Down Expand Up @@ -82,5 +79,5 @@ function onError(error) {

function onListening() {
console.log(new Date().toISOString())
console.log('App is running at http://'+getIpv4()+':'+config.port+'/')
console.log('App is running at http://'+getIpv4()+':'+port+'/')
}
28 changes: 13 additions & 15 deletions app/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,16 @@ const fs = require('fs')
const os = require('os')
const config_path = process.cwd() +'/cache/config.json'
const port = process.env.PORT || 33001
const plugin = require('./services/plugin')


var data = {
port ,

enabled_proxy : 0 ,
proxy_enable : 0 ,

enabled_proxy_header: 0 ,
//目录刷新时间 15分钟
cache_refresh_dir:15 * 60 * 1000,
max_age_dir: 15 * 60 * 1000,
//外链 10分钟
cache_refresh_file: 5 * 60 * 1000
max_age_file: 5 * 60 * 1000
}

const save = async (d) => {
Expand All @@ -41,6 +38,15 @@ const installed = () => data.token && data.path

const getTitle = () => data.title || 'ShareList'

const getConfig = () => ({proxy_enable:data.proxy_enable , max_age_dir:data.max_age_dir , max_age_file:data.max_age_file})

const getToken = () => data.token

const getAllConfig = () => ({...data})

const getPort = () => data.port

const getPath = () => [].concat( data.path || [] )

try{
let cfg = fs.readFileSync(config_path,'utf-8');
Expand All @@ -55,12 +61,4 @@ try{

}


const getVendors = () => {
return plugin.getVendors()
}


module.exports = {
data, save , installed , port , getTitle , getVendors
}
module.exports = { get:getAllConfig, getConfig , getToken , getPath , getPort , getTitle , save , installed }
4 changes: 3 additions & 1 deletion app/controllers/install.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
const base = require('../utils/base')
const request = require('request')
const config = require('../config')
const { getVendors } = require('../services/plugin')

const cache = require('../utils/cache')

module.exports = {
Expand All @@ -10,7 +12,7 @@ module.exports = {
ctx.redirect('/')
}
else{
await ctx.render('install' , {vendors:config.getVendors()})
await ctx.render('install' , {vendors:getVendors()})
}
}
,
Expand Down
39 changes: 18 additions & 21 deletions app/controllers/manage.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ const base = require('../utils/base')
const request = require('request')
const config = require('../config')
const cache = require('../utils/cache')
const { getVendors } = require('../services/plugin')

module.exports = {

Expand All @@ -12,7 +13,7 @@ module.exports = {
let message , access = false

if( token ){
if( token == config.data.token ){
if( token == config.getToken() ){
access = true
}else{
message = 'Invalid Password'
Expand All @@ -21,9 +22,9 @@ module.exports = {
}

if(act == 'export'){
ctx.body = config.data
ctx.body = config.get()
}else{
await ctx.render('manage',{access , message , config:config.data , vendors:config.getVendors()})
await ctx.render('manage',{access , message , config:config.get() , vendors:getVendors()})
}
},

Expand All @@ -32,7 +33,7 @@ module.exports = {
let act = ctx.request.body.a
let message = ''

if(token !== config.data.token){
if(token !== config.getToken()){
ctx.redirect('/manage')
return
}
Expand Down Expand Up @@ -82,37 +83,33 @@ module.exports = {
message = 'Success'
}
else if(act == 'cfg'){
let {enabled_proxy , enabled_proxy_header , cache_refresh_dir , cache_refresh_file} = ctx.request.body
let {proxy_enable , max_age_dir , max_age_file} = ctx.request.body
let opts = {}
if(cache_refresh_dir){
cache_refresh_dir = parseInt(cache_refresh_dir)
if(!isNaN(cache_refresh_dir)){
opts.cache_refresh_dir = cache_refresh_dir * 1000
if(max_age_dir !== undefined){
max_age_dir = parseInt(max_age_dir)
if(!isNaN(max_age_dir)){
opts.max_age_dir = max_age_dir * 1000
}
}

if(cache_refresh_file){
cache_refresh_file = parseInt(cache_refresh_file)
if(!isNaN(cache_refresh_file)){
opts.cache_refresh_file = cache_refresh_file * 1000
if(max_age_file){
max_age_file = parseInt(max_age_file)
if(!isNaN(max_age_file)){
opts.max_age_file = max_age_file * 1000
}
}

if(enabled_proxy){
enabled_proxy = enabled_proxy == '1' ? 1 : 0
opts.enabled_proxy = enabled_proxy
if(proxy_enable){
proxy_enable = proxy_enable == '1' ? 1 : 0
opts.proxy_enable = proxy_enable
}

if(enabled_proxy_header){
enabled_proxy_header = enabled_proxy_header == '1' ? 1 : 0
opts.enabled_proxy_header = enabled_proxy_header
}
await config.save( opts )
message = 'Success'

}

await ctx.render('manage',{ message , access : true , config:config.data , vendors:config.getVendors()})
await ctx.render('manage',{ message , access : true , config:config.get() , vendors:getVendors()})

}

Expand Down
Loading

0 comments on commit 92ec5b7

Please sign in to comment.