Skip to content

Commit

Permalink
Merge pull request #99 from jamebal/develop
Browse files Browse the repository at this point in the history
feat: 私密分享添加右键"复制下载链接"的选项
  • Loading branch information
jamebal authored Jun 15, 2024
2 parents b413376 + ce117d7 commit 257df6d
Show file tree
Hide file tree
Showing 7 changed files with 66 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,14 @@ public ResponseResult<Object> generateLink(@RequestBody ShareDO share) {
return shareService.generateLink(share);
}

@Operation(summary = "生成shareToken")
@GetMapping("/share/generate/share-token")
@Permission("cloud:file:list")
@LogOperatingFun
public ResponseResult<Object> generateShareToken(@RequestParam String fileId) {
return shareService.generateShareToken(fileId);
}

@Operation(summary = "获取分享信息")
@GetMapping("/get/share")
@Permission("cloud:file:list")
Expand Down
26 changes: 14 additions & 12 deletions src/main/java/com/jmal/clouddisk/controller/sse/SseController.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.async.AsyncRequestTimeoutException;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
Expand Down Expand Up @@ -43,7 +42,7 @@ public SseEmitter events(@RequestParam String username, @RequestParam String uui
uuids.add(uuid);
users.put(username, uuids);
}
SseEmitter emitter = new SseEmitter(60 * 1000L);
SseEmitter emitter = new SseEmitter(30 * 60 * 1000L);
emitters.put(uuid, emitter);
emitter.onCompletion(() -> emitters.remove(uuid));
return emitter;
Expand All @@ -66,31 +65,34 @@ public ResponseEntity<String> handleAsyncRequestTimeoutException() {
public void sendEvent(@RequestBody Message message) {
String username = message.getUsername();
if (users.containsKey(username)) {
users.get(username).forEach(uuid -> sendMessage(message, uuid));
users.get(username).forEach(uuid -> sendMessage(message, username, uuid));
}
}

private void sendMessage(Object message, String uuid) {
private void sendMessage(Object message, String username, String uuid) {
SseEmitter emitter = emitters.get(uuid);
if (emitter != null) {
try {
emitter.send(message);
} catch (IllegalStateException e) {
if (e.getMessage().contains("completed")) {
emitters.remove(uuid);
removeUuid(username, uuid);
}
} catch (IOException e) {
emitters.remove(uuid);
removeUuid(username, uuid);
}
}
}

/**
* 每5秒发送一次心跳消息
*/
@Scheduled(fixedRate = 5000)
public void heartbeat() {
emitters.forEach((uuid, emitter) -> sendMessage("h", uuid));
private void removeUuid(String username, String uuid) {
emitters.remove(uuid);
Set<String> uuids = users.get(username);
if (uuids != null) {
uuids.remove(uuid);
if (uuids.isEmpty()) {
users.remove(username);
}
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -215,11 +215,11 @@ public boolean isNotAllowAccess(FileDocument fileDocument, HttpServletRequest re
if (fileDocument == null) {
return true;
}
if (fileDocument.getIsPublic() != null && fileDocument.getIsPublic()) {
if (BooleanUtil.isTrue(fileDocument.getIsPublic())) {
return false;
}
// 分享文件
if (fileDocument.getIsShare() != null) {
if (BooleanUtil.isTrue(fileDocument.getIsShare())) {
return validShareFile(fileDocument, request);
}
return true;
Expand Down
2 changes: 0 additions & 2 deletions src/main/java/com/jmal/clouddisk/office/OfficeController.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.jmal.clouddisk.office;

import com.alibaba.fastjson.JSON;
import com.jmal.clouddisk.annotation.Permission;
import com.jmal.clouddisk.office.callbacks.CallbackHandler;
import com.jmal.clouddisk.office.model.OfficeConfigDTO;
Expand Down Expand Up @@ -40,7 +39,6 @@ public class OfficeController {
@Permission("cloud:file:list")
public String track(@RequestParam(Constants.FILE_ID) String fileId, @RequestBody Track body) {
body.setFileId(fileId);
log.info("callbackHandler, {}", JSON.toJSONString(body));
int error = callbackHandler.handle(body);
return "{\"error\":" + error + "}";
}
Expand Down
7 changes: 7 additions & 0 deletions src/main/java/com/jmal/clouddisk/service/IShareService.java
Original file line number Diff line number Diff line change
Expand Up @@ -110,4 +110,11 @@ public interface IShareService {
* @param upload UploadApiParamDTO
*/
void mountFile(UploadApiParamDTO upload);

/**
* 生成分享token
* @param fileId fileId
* @return ResponseResult
*/
ResponseResult<Object> generateShareToken(String fileId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,27 @@ public void mountFile(UploadApiParamDTO upload) {
mongoTemplate.upsert(query, update, FileDocument.class);
}

@Override
public ResponseResult<Object> generateShareToken(String fileId) {
FileDocument fileDocument = fileService.getById(fileId);
if (fileDocument == null || fileDocument.getShareId() == null) {
return ResultUtil.warning("文件不存在");
}
ShareDO shareDO = getShare(fileDocument.getShareId());
if (shareDO == null || BooleanUtil.isFalse(shareDO.getIsPrivacy())) {
return ResultUtil.warning("分享不存在或不是私密分享");
}
if (!fileDocument.getUserId().equals(userLoginHolder.getUserId())) {
// 非本人判断是否有挂载
if (!existsMountFile(shareDO.getFileId(), userLoginHolder.getUserId())) {
return ResultUtil.error(ExceptionType.PERMISSION_DENIED);
}
}
// 生成share-token, share-token有效期等于分享有效期
String shareToken = TokenUtil.createToken(shareDO.getId(), shareDO.getExpireDate());
return ResultUtil.success(shareToken);
}

public void validShare(String shareToken, ShareDO shareDO) {
if (checkWhetherExpired(shareDO)) {
throw new CommonException(ExceptionType.WARNING.getCode(), SHARE_EXPIRED);
Expand Down Expand Up @@ -311,7 +332,7 @@ public void validShareCode(String shareToken, ShareDO shareDO) {
if (CharSequenceUtil.isBlank(shareToken)) {
String userId = userLoginHolder.getUserId();
if (CharSequenceUtil.isBlank(userId)) {
throw new CommonException(ExceptionType.SYSTEM_SUCCESS, shareDO);
shareValidFailed(shareDO);
}
if (existsMountFile(shareDO.getFileId(), userId)) {
return;
Expand All @@ -320,11 +341,23 @@ public void validShareCode(String shareToken, ShareDO shareDO) {
// 再检查share-token是否正确
if (!shareDO.getId().equals(TokenUtil.getTokenKey(shareToken))) {
// 验证失败
throw new CommonException(ExceptionType.SYSTEM_SUCCESS, shareDO);
shareValidFailed(shareDO);
}
}
}

/**
* 分享验证失败·
* @param shareDO 分享信息
*/
private static void shareValidFailed(ShareDO shareDO) {
shareDO.setExtractionCode(null);
shareDO.setOperationPermissionList(null);
shareDO.setUserId(null);
shareDO.setFileId(null);
throw new CommonException(ExceptionType.SYSTEM_SUCCESS, shareDO);
}

private boolean existsMountFile(String fileId, String userId) {
Query query = new Query();
query.addCriteria(Criteria.where("mountFileId").is(fileId));
Expand Down
21 changes: 0 additions & 21 deletions src/main/java/com/jmal/clouddisk/util/TokenUtil.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package com.jmal.clouddisk.util;


import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.HexUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
Expand All @@ -20,7 +18,6 @@
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
* @author jmal
Expand Down Expand Up @@ -103,22 +100,4 @@ private static Map<String, Claim> verifyToken(String token, String password) {
return Collections.emptyMap();
}

public static void main(String[] args) {
String key = "jmal";
String password = "oiyugihiyuighjiougihbjhug";
LocalDateTime ldt = LocalDateTimeUtil.now().plusSeconds(2);
String token = createToken(key, password, ldt);
String verifyKey1 = getTokenKey(token, password);
Console.log("verifyKey1: ", verifyKey1);
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
String verifyKey2 = getTokenKey(token, password);
Console.log("verifyKey2: ", verifyKey2);

}


}

0 comments on commit 257df6d

Please sign in to comment.