Code Monkey home page Code Monkey logo

88250 / symphony Goto Github PK

View Code? Open in Web Editor NEW
2.5K 35.0 463.0 45.69 MB

🎶 一款用 Java 实现的现代化社区(论坛/问答/BBS/社交网络/博客)系统平台。A modern community (forum/Q&A/BBS/SNS/blog) system platform implemented in Java. https://ld246.com

Home Page: https://b3log.org/sym

License: GNU Affero General Public License v3.0

HTML 6.69% Dockerfile 0.01% JavaScript 8.87% Java 54.41% CSS 0.13% FreeMarker 26.87% SCSS 3.00%
forum bbs sns community discussion java sym vditor markdown

symphony's Issues

关于商业版和社区版

看了商业版的对比,发现放在第一的是安全性,我个人是很难接受这一点的:
个人观点认为即便是免费社区版,也不应该在【安全性】上做妥协!

商业版可以在功能性上做扩充,而不应该把这个做为卖点。

20210114_101107

存储密码时使用安全 Hash 算法并加盐

目前,symphony 在数据库中存储用户密码的 MD5,相关代码如下:

final JSONObject user = new JSONObject();
user.put(User.USER_NAME, userName);
user.put(User.USER_EMAIL, email);
user.put(User.USER_PASSWORD, DigestUtils.md5Hex(password));
user.put(UserExt.USER_APP_ROLE, appRole);
user.put(UserExt.USER_STATUS, UserExt.USER_STATUS_C_VALID);

早在十余年前,MD5 已被证实不安全。因而,建议更新 Hash 算法并检查是否存在其它算法问题,一些供参考的算法如下:

  • 非对称加密算法:RSA2048 (国际) 、SM2(国内)。
  • 对称加密算法:AES256 (国际) 、SM4 (国内)。
  • Hash 算法:SHA256 (国际) 、SM3 (国内)。

此外,在存储密码时,需要加盐后进行 Hash,保证即使攻击者获取了数据库中的密码,也无法在短时间内破译以实现任意用户登录,相关实现可以参考 SpringSecurity 中的 BCryptPasswordEncoder。

Provide mechanism for non-Chinese supporters to pay

你在什么场景下需要该功能? In what scenarios do you need this function?

I love this product - and I would like to contribute to purchase a lifetime license. I could not figure out a way to do this. Please let me know if there is another way to contribute to activate the lifetime license.

Emoji alias inconsistent with Vditor/Lute

The "🙃" emoji, aliased as "upside_down_face" in lute's emoji map, appears broken in vditor's emoji tooltip.

The emojis in this tooltip are fetched from sym, where emojis and their aliases are maintained by an external package, com.vdurmont.emoji.EmojiParser, in which the emoji in question is aliased as "upside_down" or "flipped_face". Trying to find an emoji by "upside_down_face" alias will fallback to custom emoji, and fail in the attempt to fetch the image from CDN.

To fix this, either update sym's dependency, or change lute's emoji mapping.

支持RSS订阅

你在什么场景下需要该功能? In what scenarios do you need this function?

支持用户使用RSS阅读器订阅

重构请求路由

  • 废弃注解式路由 @RequestProcessing@RequestProcessor,使用函数式路由
  • 废弃注解式拦截 @Before@After,使用中间件处理

用户隐私设置开关常量统一键名

  • USER_XXX_STATUS_C_PUBLICUSER_JOIN_XXX_C_JOIN 统一使用 USER_XXX_STATUS_C_ENABLED
  • USER_XXX_STATUS_C_PRIVATEUSER_JOIN_XXX_C_NOT_JOIN 统一使用 USER_XXX_STATUS_C_DISABLED

只涉及代码重构,数据库数据不用修改。

运行时后台抛异常,但不影响功能

java.io.FileNotFoundException: File '/export/symphony-1/target/symphony/js/index.js' does not exist

index.js压根项目就没有这个静态资源。是属于非正常的请求吧?

docker

有docker镜像直接部署吗

移动端跳转到指定笔记

你在什么场景下需要该功能? In what scenarios do you need this function?

前置条件:同时使用PC端和安卓移动端,在启动思源时会进行云同步。在PC端添加了一条笔记
操作:

  1. 在PC端复制了新笔记的块超链接,通过第三方软件发送到了移动端
  2. 在移动端点击此链接
    预期:和PC端一样,可以打开思源笔记并定位到链接的笔记
    实际:可以打开思源笔记,但定位到最后打开的笔记,而非链接的笔记

支持 Unix domain socket

增加启动参数 --unix_domain_socket_path 用于指定 Unix domain socket 路径,示例:

--unix_domain_socket_path=/dev/shm/sym.sock

NGINX 配置:

upstream backend {
    server unix:/dev/shm/sym.sock
}

感谢 @CismonX 贡献框架支持 88250/latke#27

更新前后端密码传递方式

目前,symphony 在前端计算密码的 MD5 后发送到后端进行登录,可能存在以下问题:

  • MD5 本身的安全问题。
  • 在后端进行比较时,可能存在定时攻击问题。

相关代码如下:

final String userPassword = user.optString(User.USER_PASSWORD);
if (userPassword.equals(requestJSONObject.optString(User.USER_PASSWORD))) {
    // ......
}

建议修改前后端密码传递方式,以下过程供参考,也可以参考 SpringSecurity 中的处理:

  • 前端通过静态资源或 API 获得 RSA 公钥。
  • 前端将用户的密码使用 RSA 公钥加密后发给后端。
  • 后端使用 RSA 私钥解密获得明文密码。
  • 后端对明文密码进行安全 Hash。
  • 后端 Constant Time 比对计算结果和数据库中的密码。

支持 TextBundle

一直以来,md 文档插入图片都是问题:

  • 用图床链接,不稳定

  • 用本地文件链接,容易丢,也不方便分享

这也是我在用 md 做记录时候的烦恼。

不过,Marked 开发者和 Ulysses 团队开发出了一种解决方法,就是 TextBundle,简要解释一下,它是这样的结构:

一个叫 文档.textbundle 的文件夹或叫 文档.textpack 的zip压缩包,内包含:

o    一个 assets 文件夹,用于存放图片等附件

o    一个 info.json 文件,用于存放相关的元数据

o    一个 text.md 文件,用于存放文档内容。文档通过相对路径引用 assets 文件夹内的图片和其它媒体文件。

可以实现一个文包内,既包含 md 文档,也包含图片,预览时无需询问权限,同时又方便直接编辑,非常便捷。

每一个文档都存储在一个 textbundle 中,这样,即便导出,复制到其它设备、平台上,都可以用各种 markdown 编辑器打开文档,正常浏览里面的图片。

Ulysses, Bear这样的流行的写作工具,甚至是Mindnode等思维导图工具,都支持 textbundle。

如果支持textbundle格式。那么我们在快速写作的时候,就可以更加安心。因为我们确认所有的创作内容都可以方便导出带格式、带图片资源版本,轻松在其他专用工具中进一步加工。

对于文件所在合法目录判断上的缺陷

描述:

!new File(path).getCanonicalPath().startsWith(new File(Symphonys.UPLOAD_LOCAL_DIR).getCanonicalPath())) {

这段代码用于确保getFile()函数获取的文件的路径在UPLOAD_LOCAL_DIR目录上,但实际上这个判断语句对于文件路径符合/UPLOAD_LOCAL_DIR*/模板的文件也将返回真。

如UPLOAD_LOCAL_DIR = "/home/safe", 文件路径为"/home/safe_bak/filename", 因为文件路径是以"/home/safe"开头,所以会返回真。这就使得用户可以获取符合"/home/safe*/"特征目录下的文件。

如图所示:
unnamed

修复

使用 java.nio.files.Path.startsWith() 来替代原来的比较,该函数将对路径进行比较,而不是子字符串.
如果继续使用String.startWith()来比较路径, 需要确保被比较的路径以File.separator结尾, 如 String.startsWith(Symphonys.UPLOAD_LOCAL_DIR).getCanonicalPath() + File.separator).

代码位置:

!new File(path).getCanonicalPath().startsWith(new File(Symphonys.UPLOAD_LOCAL_DIR).getCanonicalPath())) {

可以给一个单元测试的demo

你在什么场景下需要该功能?

我在自定义一些service时,希望可以使用类似SpringBootTest的单元测试,可以很大程度上方便做测试覆盖,而不是仅能通过processor的返回值确定下层的repository、service等的正确性。

其他信息

可能也有过开发,尝试过检索黑客派,但是没有发现合适的相关文档
欢迎任何指教,非常感谢

一个关于登录注册的问题

 final Request request = context.getRequest();
        final Response response = context.getResponse();
        //final JSONObject requestJSONObject = (JSONObject) context.attr(Keys.REQUEST);
        final JSONObject requestJSONObject = context.getRequest().getJSON();

LoginProcessor这段代码,在进行step 1 step2 阶段注册时,如果使用注释的那行将NPE,通过断点发现context.getRequest().getJSON()能够拿到正确的body 参数

在标签树上点击多个标签时,无法实现切换,只是点一个加一个

描述问题 Describe the problem

在标签树上点击多个标签时,无法实现切换,只是点一个加一个

期待的结果 Expected result

期待点击一个标签就切换一个标签,而不是多个标签累加在一块进行检索

截屏或录像 Screenshot or video

图片

版本环境 Version environment

  • 版本 Version:
  • 操作系统 Operating system:
  • 浏览器(如果使用)Browser (if used):

其他信息 Other information

匿名机制 someone 改进

  • 初始化 someone 用户
  • 后端使用 someone 用户填充匿名内容作者
  • 前端不判断用户名,直接按后端填充的用户展现

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.