Compare commits

..
126 Commits
Author SHA1 Message Date
heavyrain lee 39b62e5942 Update to version 0.23 2019-06-29 12:20:58 +08:00
heavyrain.lee 5bb8ab3d95 update 2019-06-29 12:01:46 +08:00
heavyrain.lee 8dfc23b61d update code 2019-06-29 12:01:37 +08:00
heavyrain lee c8769808b5 Update proto 2019-06-29 12:01:11 +08:00
imndx 2fc106aa26 web route时,返回数据base64编码 2019-06-28 17:27:37 +08:00
imndx da0b725ff8 解决内存中好友备注错误 2019-06-24 22:04:05 +08:00
heavyrain.lee 15703d66fb 封禁用户问题修改 2019-06-23 18:30:58 +08:00
heavyrain.lee c68beeaa51 解决java客户端收消息的问题 2019-06-20 15:24:32 +08:00
heavyrain.lee 5ef8868916 接受新消息通知错误 2019-06-19 14:18:09 +08:00
heavyrain lee 24488cc985 Add group manage info 2019-06-18 08:26:29 +08:00
heavyrain.lee 1c9faaa1e6 apns推送在dev环境下也有voip证书,因此去掉voip一定是pro的假设 2019-06-16 20:25:33 +08:00
heavyrain.lee ac32875b14 fix migration error 2019-06-16 19:57:46 +08:00
heavyrain.lee 07c1dd29e0 alter table of token 2019-06-14 20:04:21 +08:00
imndx bd93233c34 update device token length 2019-06-14 18:43:50 +08:00
heavyrain.lee 20aec2fbcf 添加默认管理员 2019-06-12 23:21:21 +08:00
heavyrain.lee a149139143 添加敏感词命中消息表t_sensitive_messages 2019-06-12 22:57:30 +08:00
heavyrain.lee c857d1abb7 消息表中添加contenttype 2019-06-12 22:36:08 +08:00
heavyrain lee dde9da7006 用户表和群组表添加create_time字段 2019-06-12 21:48:57 +08:00
heavyrain2012 d18a1970e5 update script 2019-06-11 22:46:06 +08:00
heavyrain.lee 66b9aeec17 包名错误 2019-06-11 14:45:58 +08:00
heavyrain.lee ea301a3923 修改内部接口定义 2019-06-09 07:37:33 +08:00
heavyrain.lee ced272a783 update version to 0.22 2019-06-08 17:04:03 +08:00
heavyrain lee c9f320da31 解决api/version乱码问题 2019-06-06 08:15:49 +08:00
heavyrain lee 025873e66b remove userless script 2019-06-06 08:15:20 +08:00
heavyrain lee ecddc40aa5 查询用户时,匹配账户和电话 2019-06-02 10:49:00 +08:00
heavyrain lee cb13a02b75 创建用户时,不添加默认头像 2019-06-01 14:52:46 +08:00
heavyrain.lee 5714a9a1d3 代码优化 2019-06-01 12:06:51 +08:00
heavyrain.lee d0671c1682 add broad cast message 2019-05-31 07:56:31 +08:00
heavyrain lee 88b3ac42bb Ignore target folder 2019-05-30 07:59:39 +08:00
heavyrain.lee 4ecf3dec76 remove java memory limit and add charset to jdbc url 2019-05-29 19:04:53 +08:00
heavyrain.lee b4b70ca7e5 增加协议版本,新版本添加对gzip的支持 2019-05-27 10:06:22 +08:00
heavyrain.lee d3aa68df05 fix error 2019-05-26 23:46:42 +08:00
heavyrain.lee 36aa0518ed add gzip 2019-05-25 22:56:11 +08:00
heavyrain.lee b1c5692322 fix some error 2019-05-25 22:53:10 +08:00
heavyrain.lee db24edf7d5 update 2019-05-25 19:37:48 +08:00
heavyrain.lee 798a576d0b Merge branch 'wildfirechat' of https://github.com/wildfirechat/server into wildfirechat 2019-05-25 19:28:18 +08:00
heavyrain.lee b49225fbf7 add dnoate list 2019-05-25 19:27:48 +08:00
heavyrain2012 439cf82fcc update 2019-05-25 15:42:46 +08:00
heavyrain2012 7527bf4761 update 2019-05-25 15:40:50 +08:00
heavyrain.lee a9abda9ae9 update to version 0.21 2019-05-25 13:56:26 +08:00
heavyrain.lee 757186d77b Merge branch 'refactor_server_api' into wildfirechat
* refactor_server_api:
  update
  update
  update
  update
  update
  update
2019-05-25 13:54:40 +08:00
heavyrain.lee 3e769c885c update 2019-05-25 13:53:51 +08:00
heavyrain.lee af4d73a0d5 推送提示错误 2019-05-25 07:55:58 +08:00
heavyrain.lee 331c38cc98 update 2019-05-25 07:55:30 +08:00
heavyrain.lee fbd1a7f5dc update 2019-05-24 21:08:31 +08:00
heavyrain.lee 675025c0ec 解决session在重启后,内存中不存在的问题 2019-05-24 16:33:35 +08:00
heavyrain.lee 3e1efe4c4c update 2019-05-24 16:12:57 +08:00
heavyrain.lee 679e76a5f6 update 2019-05-23 08:21:48 +08:00
heavyrain.lee 5a338cdba1 update 2019-05-23 07:26:57 +08:00
heavyrain.lee 3ef973ffc5 update 2019-05-22 20:38:35 +08:00
heavyrain.lee d36c3f4f77 update 2019-05-22 20:24:21 +08:00
heavyrain.lee 79bd0c3304 add sdk 2019-05-22 08:38:55 +08:00
heavyrain.lee 721abfe3a5 解决同一局域网多人调试问题 2019-05-22 08:20:35 +08:00
heavyrain.lee 77a5d61861 调整代码目录结构 2019-05-22 07:23:09 +08:00
heavyrain.lee 34aee2290c 调整编译顺序 2019-05-22 07:05:59 +08:00
heavyrain.lee 4b93157816 server api群组功能添加 2019-05-21 21:55:20 +08:00
heavyrain.lee d66b01c681 修改部分错误 2019-05-21 21:55:20 +08:00
imndx 939dfc2c9b update readme 2019-05-21 21:52:58 +08:00
heavyrain.lee 1578c4c77d 好友关系api 2019-05-20 20:16:16 +08:00
heavyrain.lee 640a4fa47c 用户关系的api 2019-05-20 19:51:57 +08:00
heavyrain.lee 3d50b65ad9 优化敏感词设置 2019-05-20 19:34:49 +08:00
heavyrain.lee 3f9eef9538 服务api时间戳检查开关 2019-05-20 19:34:12 +08:00
heavyrain.lee f655f519d0 server api时间戳检查开关 2019-05-20 19:33:22 +08:00
heavyrain.lee 59add35703 jmeter tools 2019-05-19 23:07:37 +08:00
heavyrain.lee 0ff21e70b5 add trycatch for load git.properties failure 2019-05-18 14:12:54 +08:00
heavyrain.lee cfc97e602e 完善jmeter插件 2019-05-15 23:03:18 +08:00
heavyrain.lee 4661b8c856 优化imclient代码 2019-05-15 23:02:55 +08:00
heavyrain.lee e955153d53 修改野火IM jmeter插件的连接测试case 2019-05-15 00:00:18 +08:00
heavyrain.lee 911dcb99ec java client interface should be public 2019-05-14 23:59:21 +08:00
heavyrain.lee 40ff829c72 update 2019-05-14 22:31:31 +08:00
heavyrain.lee 729f3485de 修改服务启动提示 2019-05-14 13:41:09 +08:00
heavyrain.lee 84db868244 remove test db of c3p0 2019-05-14 13:40:52 +08:00
heavyrain.lee 126a9af2ac .git文件未找到时,继续编译 2019-05-14 13:12:34 +08:00
heavyrain.lee c9dc33d285 修正乱码问题 2019-05-12 20:25:37 +08:00
heavyrain.lee 49ee1d1d57 fix warning 2019-05-12 19:07:43 +08:00
heavyrain.lee 1a477068fb fix warning 2019-05-12 18:59:35 +08:00
heavyrain.lee d633830f7a fix error 2019-05-12 11:21:42 +08:00
heavyrain.lee b2bc616e18 add groupid in group notification 2019-05-11 20:56:20 +08:00
heavyrain.lee 934f8ba4d7 update version to 0.20 2019-05-11 09:18:15 +08:00
heavyrain.lee 477616ce38 Merge branch 'flyway' into wildfirechat
* flyway:
  Add flyway migrate tool
2019-05-11 09:15:51 +08:00
imndx f66d0e5cd7 fix load remote messae issue 2019-05-10 16:53:24 +08:00
heavyrain lee 2bb6de1198 Add flyway migrate tool 2019-05-10 08:35:47 +08:00
imndx 6570d71234 user pull seq 2019-05-08 21:20:41 +08:00
heavyrain lee 64c7da70e7 消息id分表错误问题 2019-05-06 08:18:01 +08:00
heavyrain2012 a2eadf5a78 Update README.md
update
2019-05-04 22:05:51 +08:00
heavyrain lee 7fb040ac1a Add LoadRemoteMessages 2019-05-03 09:31:43 +08:00
heavyrain lee b575274680 Friend alias 2019-05-02 22:10:54 +08:00
heavyrain.lee 8bfe3583b9 fix build error 2019-05-02 21:45:27 +08:00
heavyrain.lee ab3882e1d4 friend alias 2019-05-02 21:43:01 +08:00
heavyrain.lee 0cbb9fd1a4 alter table t_friend add column alias 2019-05-02 18:44:07 +08:00
heavyrain lee 115a597038 no message 2019-05-02 09:19:49 +08:00
heavyrain lee a8fde271ea 优化java client 2019-05-02 09:09:50 +08:00
heavyrain lee b0143bb5bf 机器人信息错误 2019-05-02 08:05:13 +08:00
heavyrain lee 025af5eae0 解决server API发送消息返回结果为空的问题 2019-05-01 23:49:11 +08:00
heavyrain lee ce16f87e12 Load remote messages 2019-05-01 23:47:28 +08:00
heavyrain lee b47084f61f Fix error 2019-05-01 08:13:40 +08:00
heavyrain lee 936e3581b4 update build script 2019-04-29 23:17:47 +08:00
heavyrain lee cc756842c4 Fix jmeter plugin error 2019-04-29 23:17:09 +08:00
heavyrain lee 9aa29685ef java client 2019-04-29 23:06:46 +08:00
heavyrain lee c1bb45fe14 Java client 2019-04-29 23:06:46 +08:00
heavyrain.lee 928555b36e use okhttp for http request 2019-04-27 10:43:04 +08:00
heavyrain.lee 744d516932 解决启动错误 2019-04-26 09:47:21 +08:00
heavyrain.lee 8721c80a9f robot h2 db缺少字段 2019-04-26 09:47:09 +08:00
heavyrain lee 06698a54e1 Server api发送消息时,必须带上发送者 2019-04-26 08:12:38 +08:00
heavyrain lee 7f48b54b73 admin 不检查是否有权限,不过滤敏感词 2019-04-26 08:12:08 +08:00
heavyrain lee cf619ebeee Add admin flag for all handler 2019-04-26 08:06:02 +08:00
heavyrain lee 9fdc6c2e1b Add admin flag 2019-04-26 08:02:14 +08:00
heavyrain.lee 1d309816ba fix get chatroom error 2019-04-25 15:16:20 +08:00
heavyrain lee 21aa248d49 Log level 2019-04-25 08:19:07 +08:00
heavyrain lee 90c8e49808 服务重启后,用户登录时加载用户session 2019-04-25 08:15:28 +08:00
heavyrain.lee 2326850538 update 2019-04-24 14:18:12 +08:00
heavyrain.lee cef0cb1076 update 2019-04-24 13:02:41 +08:00
heavyrain lee 9b34e51494 add default robot 2019-04-23 08:48:53 +08:00
heavyrain lee 61dc1e2c2d Version 0.11 -> 0.12 2019-04-20 09:52:15 +08:00
heavyrain lee 2458782c73 Fix modify group not work issue 2019-04-20 09:43:51 +08:00
heavyrain lee 0f05d63a3b Add load history message function 2019-04-19 08:15:27 +08:00
heavyrain lee b82f7dea3d move mysql_tune to docs 2019-04-19 08:14:50 +08:00
heavyrain lee 6df626afd3 Remove useless file 2019-04-19 08:14:22 +08:00
heavyrain lee ac2d2a530a clean useless scripts 2019-04-19 08:13:43 +08:00
heavyrain lee 99a0590c7e Add port of upload token result and add to user list in message 2019-04-14 12:23:43 +08:00
heavyrain.lee 58c98bbbfa 调整再次添加好友逻辑:
1,如果没发过好友请求,或者上次发送好友请求状态为接受,可以发送
2,如果发送过好友请求,且状态不为接受,时间小于7天的,返回已经请求过错误码。
3,如果发送过好友请求,且状态不为接受,时间大于7天的,如果状态为reject,30天以内不能发送(返回拉黑错误码),30天以上可以再次发送
4,如果发送过好友请求,且状态不为接受,时间大于7天的,如果状态为sent,可以再次发送
2019-04-12 16:06:07 +08:00
heavyrain.lee 9560b9c202 1, 修改本地运行时version检查错误。2,修改好友被删除后再次添加好友。3,优化部分流程 2019-04-12 14:37:52 +08:00
imndx 24ebe429cc update readme 2019-04-11 22:58:00 +08:00
heavyrain2012 8ef92d0c1b fix modify group notification timestamp issue 2019-04-04 07:39:41 +08:00
heavyrain2012 e3e122edc4 机器人限频错误 2019-04-03 23:52:36 +08:00
imndx ab0e51feac update readme 2019-04-03 22:50:06 +08:00
268 changed files with 10622 additions and 3229 deletions
+7
View File
@@ -47,3 +47,10 @@ broker/nbactions-Server.xml
maven-metadata.xml
/.gradle/
/bin/
broker/config/git.properties
distribution/src/main/resources/git.properties
broker/h2db
broker/media
common/target
server/target
sdk/target
-48
View File
@@ -53,51 +53,3 @@ Except for the limited purpose of indicating to the public that the Work is lice
Creative Commons may be contacted at http://creativecommons.org/.
Copyright (c) <2019> <wildfirechat>
996 License Version 1.0 (Draft)
Permission is hereby granted to any individual or legal entity
obtaining a copy of this licensed work (including the source code,
documentation and/or related items, hereinafter collectively referred
to as the "licensed work"), free of charge, to deal with the licensed
work for any purpose, including without limitation, the rights to use,
reproduce, prepare derivative works of, distribute and sublicense the
licensed work, subject to the following conditions:
1. The individual or the legal entity must conspicuously display,
without modification, this License on each redistributed or derivative
copy of the Licensed Work.
2. The individual or the legal entity must strictly comply with all
applicable laws, regulations, rules and standards of the jurisdiction
relating to labor and employment where the individual is physically
located or where the individual was born or naturalized; or where the
legal entity is registered or is operating (whichever is stricter). In
case that the jurisdiction has no such laws, regulations, rules and
standards or its laws, regulations, rules and standards are
unenforceable, the individual or the legal entity are required to
comply with Core International Labor Standards.
3. The individual or the legal entity shall not induce or force its
employee(s), whether full-time or part-time, or its independent
contractor(s), in any methods, to agree in oral or written form, to
directly or indirectly restrict, weaken or relinquish his or her
rights or remedies under such laws, regulations, rules and standards
relating to labor and employment as mentioned above, no matter whether
such written or oral agreement are enforceable under the laws of the
said jurisdiction, nor shall such individual or the legal entity
limit, in any methods, the rights of its employee(s) or independent
contractor(s) from reporting or complaining to the copyright holder or
relevant authorities monitoring the compliance of the license about
its violation(s) of the said license.
THE LICENSED WORK IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN ANY WAY CONNECTION WITH THE
LICENSED WORK OR THE USE OR OTHER DEALINGS IN THE LICENSED WORK.
+46
View File
@@ -0,0 +1,46 @@
Copyright (c) <2019> <wildfirechat>
Anti 996 License Version 1.0 (Draft)
Permission is hereby granted to any individual or legal entity
obtaining a copy of this licensed work (including the source code,
documentation and/or related items, hereinafter collectively referred
to as the "licensed work"), free of charge, to deal with the licensed
work for any purpose, including without limitation, the rights to use,
reproduce, modify, prepare derivative works of, distribute, publish
and sublicense the licensed work, subject to the following conditions:
1. The individual or the legal entity must conspicuously display,
without modification, this License and the notice on each redistributed
or derivative copy of the Licensed Work.
2. The individual or the legal entity must strictly comply with all
applicable laws, regulations, rules and standards of the jurisdiction
relating to labor and employment where the individual is physically
located or where the individual was born or naturalized; or where the
legal entity is registered or is operating (whichever is stricter). In
case that the jurisdiction has no such laws, regulations, rules and
standards or its laws, regulations, rules and standards are
unenforceable, the individual or the legal entity are required to
comply with Core International Labor Standards.
3. The individual or the legal entity shall not induce or force its
employee(s), whether full-time or part-time, or its independent
contractor(s), in any methods, to agree in oral or written form, to
directly or indirectly restrict, weaken or relinquish his or her
rights or remedies under such laws, regulations, rules and standards
relating to labor and employment as mentioned above, no matter whether
such written or oral agreement are enforceable under the laws of the
said jurisdiction, nor shall such individual or the legal entity
limit, in any methods, the rights of its employee(s) or independent
contractor(s) from reporting or complaining to the copyright holder or
relevant authorities monitoring the compliance of the license about
its violation(s) of the said license.
THE LICENSED WORK IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN ANY WAY CONNECTION WITH THE
LICENSED WORK OR THE USE OR OTHER DEALINGS IN THE LICENSED WORK.
+37 -13
View File
@@ -2,20 +2,20 @@
野火IM是一套跨平台、全开源的即时通讯解决方案,主要包含以下内容。
| 仓库 | 说明 | 备注 |
| ------------------------------------------------------------ | ------------------------------------------------------- | ---- |
| [android-chat](https://github.com/wildfirechat/android-chat) | Android平台的SDK和Demo | |
| [ios-chat](https://github.com/wildfirechat/ios-chat) | iOS平台的SDK和Demo | |
| [pc-chat](https://github.com/wildfirechat/pc-chat) | 基于[Electron](https://electronjs.org/)开发的PC平台Demo | |
| [proto](https://github.com/wildfirechat/proto) | 野火IM的协议栈实现 | |
| [server](https://github.com/wildfirechat/server) | IM server | |
| [app server](https://github.com/wildfirechat/app_server) | 应用服务端Demo | |
| [robot_server](https://github.com/wildfirechat/robot_server) | 机器人服务端Demo | |
| [push_server](https://github.com/wildfirechat/push_server) | 推送服务器 | |
| [docs](https://github.com/wildfirechat/docs) | 野火IM相关文档,包含设计、概念、开发、使用说明 | |
| 仓库 | 说明 | 备注 |
| ------------------------------------------------------------ | ------------------------------------------------------- | ---------------------------------------------- |
| [android-chat](https://github.com/wildfirechat/android-chat) | 野火IM Android SDK源码和App源码 | 可以很方便地进行二次开发,或集成到现有应用当中 |
| [ios-chat](https://github.com/wildfirechat/ios-chat) | 野火IM iOS SDK源码和App源码 | 可以很方便地进行二次开发,或集成到现有应用当中 |
| [pc-chat](https://github.com/wildfirechat/pc-chat) | 基于[Electron](https://electronjs.org/)开发的PC平台应用 | |
| [proto](https://github.com/wildfirechat/proto) | 野火IM的协议栈实现 | |
| [server](https://github.com/wildfirechat/server) | IM server | |
| [app server](https://github.com/wildfirechat/app_server) | 应用服务端 | |
| [robot_server](https://github.com/wildfirechat/robot_server) | 机器人服务端 | |
| [push_server](https://github.com/wildfirechat/push_server) | 推送服务器 | |
| [docs](https://github.com/wildfirechat/docs) | 野火IM相关文档,包含设计、概念、开发、使用说明 | |
# server
本工程为野火IM 社区版IM服务软件。野火IM作为一个通用的即时通讯SDK,可以集成到各种应用中。请阅读[docs](http://docs.wildfirechat.cn)或下载服务器[发布版本](https://github.com/wildfirechat/server/releases)
本工程为野火IM 社区版IM服务软件。野火IM作为一个通用的即时通讯解决方案,可以集成到各种应用中。请阅读[docs](http://docs.wildfirechat.cn)或下载服务器[发布版本](https://github.com/wildfirechat/server/releases)
开发一套IM系统真的很艰辛,请路过的朋友们给点个star,支持我们坚持下去🙏🙏🙏🙏🙏
@@ -24,7 +24,11 @@
### 联系我们
问题讨论请加群:822762829
<img src="http://static.wildfirechat.cn/qr_qqgroup.jpeg" width = 50% height = 50% />
微信公众号:
<img src="http://static.wildfirechat.cn/wx_wfc_qrcode.jpg" width = 50% height = 50% />
> 强烈建议关注我们的公众号。我们有新版本发布或者有重大更新会通过公众号通知大家,另外我们也会不定期的发布一些关于野火IM的技术介绍。
#### 体验Demo
我们提供了体验demo,请使用微信扫码下载安装体验
@@ -53,3 +57,23 @@
<img src="http://static.wildfirechat.cn/ios-location-view.png" width = 50% height = 50% />
<img src="http://static.wildfirechat.cn/ios-voip-view.png" width = 50% height = 50% />
## 编译
在安装JDK1.8以上及maven的前提下,在命令行中执行```mvn clean compile package```,生成的目标文件在```./distribution/target/distribution-xxxx-bundle-tar.tar.gz```
## 捐赠者名单
| 捐赠者 | 商标 | 金额 | 简介 |
| ----- | ---- | -------- | --- |
| [SAMOS](http://samos.io) | ![SAMOS](http://static.wildfirechat.cn/SAMOS.png) | 每月2000¥ | 一站式区块链解决方案服务商(http://samos.io) |
## 特别感谢
1. [moquette](https://github.com/moquette-io/moquette) 本项目是基于此项目二次开发而来,处理MQTT相关业务。
2. [loServer](https://github.com/looly/loServer) 本项目使用loServer处理HTTP相关业务。
*** 对他们表示诚挚的感谢🙏 ***
## License
1. Under the Creative Commons Attribution-NoDerivs 3.0 Unported license. See the [LICENSE](https://github.com/wildfirechat/server/blob/wildfirechat/LICENSE) file for details.
2. Under the Anti 996 License. See the [Anti 996 LICENSE](https://github.com/wildfirechat/server/blob/wildfirechat/LICENSE_996) file for details.
-15
View File
@@ -1,15 +0,0 @@
#Generated by Git-Commit-Id-Plugin
#Wed Apr 03 15:25:25 CST 2019
git.commit.id.abbrev=cc82c5b
git.commit.user.email=[email protected]
git.commit.message.full=update version to 0.1.1\n
git.commit.id=cc82c5b420061994bc0621e807bb6c961370aef2
git.commit.message.short=update version to 0.1.1
git.commit.user.name=heavyrain2012
git.build.user.name=heavyrain2012
git.commit.id.describe=0.1.1-dirty
git.build.user.email=[email protected]
git.branch=wildfirechat
git.commit.time=20190403134707
git.build.time=20190403152525
git.remote.origin.url=https\://github.com/wildfirechat/server.git
+1 -7
View File
@@ -3,15 +3,9 @@
xsi:schemaLocation="http://www.hazelcast.com/schema/config
http://www.hazelcast.com/schema/config/hazelcast-config-3.5.xsd"
xmlns="http://www.hazelcast.com/schema/config">
<group>
<!--<name>wfc-dev</name>-->
<name>wfc-pro</name>
</group>
<network>
<join>
<multicast enabled="true"/>
<multicast enabled="false"/>
</join>
</network>
+6 -2
View File
@@ -3,7 +3,7 @@
#*********************************************************************
#服务器的接入IP。给客户端提供是${server.ip}和${http_port}。
#客户端会从${http_port}端口获取到长链接端口。
server.ip 0.0.0.0
server.ip 192.168.1.100
##原生客户端长链接端口
port 1883
@@ -27,11 +27,15 @@ host 0.0.0.0
local_port 80
##是否使用内置DB。0使用mysql;1使用h2db
embed.db 1
embed.db 0
##服务器管理接口密钥
http.admin.secret_key 123456
##服务器API接口参数是否检查时间。当设置为false时,所有的请求会检查时间的有效性;当设置为true时,可以在http.admin.secret_key保持不变的情况下,使用固定的服务API签名
##nonce = "76616", timestamp = "1558350862502", sign = "b98f9b0717f59febccf1440067a7f50d9b31bdde"
http.admin.no_check_time true
##客户端协议栈密钥,需要与客户端协议栈文件libemqq.cc文件中的aes_key值保持一致,16进制byte用逗号分割。这个密钥对安全性帮助不大,客户不要修改
client.proto.secret_key 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F
+3
View File
@@ -0,0 +1,3 @@
insert into t_user (`_uid`,`_name`,`_display_name`,`_type`,`_dt`) values ('admin','admin','系统管理员',3,1);
+1
View File
@@ -0,0 +1 @@
ALTER TABLE t_user_session MODIFY _token VARCHAR(240) DEFAULT NULL;
+4
View File
@@ -0,0 +1,4 @@
alter table `t_group` add column `_mute` tinyint NOT NULL DEFAULT 0;
alter table `t_group` add column `_join_type` tinyint NOT NULL DEFAULT 0;
alter table `t_group` add column `_private_chat` tinyint NOT NULL DEFAULT 0;
alter table `t_group` add column `_searchable` tinyint NOT NULL DEFAULT 0;
View File
@@ -1,26 +1,4 @@
DROP TABLE IF EXISTS `t_messages`;
CREATE TABLE `t_messages` (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`_mid` bigint(20) NOT NULL,
`_from` varchar(64) NOT NULL,
`_type` tinyint NOT NULL DEFAULT 0,
`_target` varchar(64) NOT NULL,
`_line` int(11) NOT NULL DEFAULT 0,
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL DEFAULT NOW(),
UNIQUE INDEX `message_uid_index` (`_mid` ASC)
);
DROP TABLE IF EXISTS `t_user_messages`;
CREATE TABLE `t_user_messages` (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`_mid` bigint(20) NOT NULL,
`_uid` varchar(64) NOT NULL,
`_seq` bigint(20) NOT NULL,
`_dt` DATETIME NOT NULL DEFAULT NOW(),
UNIQUE INDEX `message_seq_uid_index` (`_uid` DESC, `_seq` DESC)
);
DROP TABLE IF EXISTS `t_group`;
CREATE TABLE `t_group` (
@@ -181,6 +159,7 @@ CREATE TABLE `t_robot` (
`_owner` varchar(64) DEFAULT '',
`_secret` varchar(64) DEFAULT '',
`_callback` varchar(1024) DEFAULT '',
`_state` tinyint DEFAULT 0,
`_extra` TEXT DEFAULT NULL,
`_dt` bigint(20) NOT NULL,
UNIQUE INDEX `robot_uid_index` (`_uid` ASC),
@@ -219,11 +198,3 @@ CREATE TABLE `t_sensitiveword` (
`_word` TEXT DEFAULT NULL
);
insert into t_chatroom (`_cid`, `_title`, `_desc`,`_dt`) values ('chatroom1','火信聊天室1','火信测试聊天室1,用来演示聊天室功能', 1);
insert into t_chatroom (`_cid`, `_title`, `_desc`,`_dt`) values ('chatroom2','火信聊天室2','火信测试聊天室2,用来演示聊天室功能', 1);
insert into t_chatroom (`_cid`, `_title`, `_desc`,`_dt`) values ('chatroom3','火信聊天室3','火信测试聊天室3,用来演示聊天室功能', 1);
+24
View File
@@ -0,0 +1,24 @@
DROP TABLE IF EXISTS `t_messages`;
CREATE TABLE `t_messages` (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`_mid` bigint(20) NOT NULL,
`_from` varchar(64) NOT NULL,
`_type` tinyint NOT NULL DEFAULT 0,
`_target` varchar(64) NOT NULL,
`_line` int(11) NOT NULL DEFAULT 0,
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL DEFAULT NOW(),
UNIQUE INDEX `message_uid_index` (`_mid` ASC)
);
DROP TABLE IF EXISTS `t_user_messages`;
CREATE TABLE `t_user_messages` (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`_mid` bigint(20) NOT NULL,
`_uid` varchar(64) NOT NULL,
`_seq` bigint(20) NOT NULL,
`_dt` DATETIME NOT NULL DEFAULT NOW(),
UNIQUE INDEX `message_seq_uid_index` (`_uid` DESC, `_seq` DESC)
);
+6
View File
@@ -0,0 +1,6 @@
insert into t_chatroom (`_cid`, `_title`, `_desc`,`_dt`) values ('chatroom1','火信聊天室1','火信测试聊天室1,用来演示聊天室功能', 1);
insert into t_chatroom (`_cid`, `_title`, `_desc`,`_dt`) values ('chatroom2','火信聊天室2','火信测试聊天室2,用来演示聊天室功能', 1);
insert into t_chatroom (`_cid`, `_title`, `_desc`,`_dt`) values ('chatroom3','火信聊天室3','火信测试聊天室3,用来演示聊天室功能', 1);
+4
View File
@@ -0,0 +1,4 @@
insert into t_user (`_uid`,`_name`,`_display_name`,`_portrait`,`_type`,`_dt`) values ('FireRobot','FireRobot','小火','http://cdn2.wildfirechat.cn/robot.png',1,1);
insert into t_robot (`_uid`,`_owner`,`_secret`,`_callback`,`_state`,`_dt`) values ('FireRobot', 'FireRobot', '123456', 'http://127.0.0.1:8883/robot/recvmsg', 0, 1);
+2
View File
@@ -0,0 +1,2 @@
alter table t_friend add column `_alias` varchar(64) DEFAULT NULL;
@@ -0,0 +1,2 @@
alter table t_user add column `_createTime` TIMESTAMP default CURRENT_TIMESTAMP;
alter table t_group add column `_createTime` TIMESTAMP default CURRENT_TIMESTAMP;
+1
View File
@@ -0,0 +1 @@
alter table `t_messages` add column `_content_type` int(11) NOT NULL DEFAULT '0';
+15
View File
@@ -0,0 +1,15 @@
DROP TABLE IF EXISTS `t_sensitive_messages`;
CREATE TABLE `t_sensitive_messages` (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`_mid` bigint(20) NOT NULL,
`_from` varchar(64) NOT NULL,
`_type` tinyint NOT NULL DEFAULT 0,
`_target` varchar(64) NOT NULL,
`_line` int(11) NOT NULL DEFAULT 0,
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL DEFAULT NOW(),
`_content_type` int(11) NOT NULL DEFAULT 0,
UNIQUE INDEX `sensitive_message_uid_index` (`_mid` ASC)
);
+3
View File
@@ -0,0 +1,3 @@
insert into t_user (`_uid`,`_name`,`_display_name`,`_type`,`_dt`) values ('admin','admin','系统管理员',3,1);
+1
View File
@@ -0,0 +1 @@
ALTER TABLE t_user_session MODIFY _token VARCHAR(240) DEFAULT NULL;
+4
View File
@@ -0,0 +1,4 @@
alter table `t_group` add column `_mute` tinyint NOT NULL DEFAULT 0;
alter table `t_group` add column `_join_type` tinyint NOT NULL DEFAULT 0;
alter table `t_group` add column `_private_chat` tinyint NOT NULL DEFAULT 0;
alter table `t_group` add column `_searchable` tinyint NOT NULL DEFAULT 0;
View File
@@ -1,3 +1,4 @@
DROP TABLE IF EXISTS `t_messages`;
CREATE TABLE `t_messages` (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
insert into t_user (`_uid`,`_name`,`_display_name`,`_portrait`,`_type`,`_dt`) values ('FireRobot','FireRobot','小火','http://cdn2.wildfirechat.cn/robot.png',1,1);
insert into t_robot (`_uid`,`_owner`,`_secret`,`_callback`,`_state`,`_dt`) values ('FireRobot', 'FireRobot', '123456', 'http://127.0.0.1:8883/robot/recvmsg', 0, 1);
+1
View File
@@ -0,0 +1 @@
alter table t_friend add column `_alias` varchar(64) DEFAULT NULL;
@@ -0,0 +1,2 @@
alter table t_user add column `_createTime` TIMESTAMP default CURRENT_TIMESTAMP;
alter table t_group add column `_createTime` TIMESTAMP default CURRENT_TIMESTAMP;
+36
View File
@@ -0,0 +1,36 @@
alter table `t_messages_0` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_1` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_2` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_3` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_4` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_5` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_6` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_7` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_8` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_9` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_10` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_11` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_12` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_13` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_14` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_15` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_16` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_17` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_18` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_19` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_20` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_21` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_22` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_23` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_24` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_25` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_26` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_27` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_28` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_29` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_30` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_31` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_32` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_33` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_34` add column `_content_type` int(11) NOT NULL DEFAULT '0';
alter table `t_messages_35` add column `_content_type` int(11) NOT NULL DEFAULT '0';
+18
View File
@@ -0,0 +1,18 @@
DROP TABLE IF EXISTS `t_sensitive_messages`;
CREATE TABLE `t_sensitive_messages` (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`_mid` bigint(20) NOT NULL,
`_from` varchar(64) NOT NULL,
`_type` tinyint NOT NULL DEFAULT 0,
`_target` varchar(64) NOT NULL,
`_line` int(11) NOT NULL DEFAULT 0,
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
`_content_type` int(11) NOT NULL DEFAULT '0',
INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_unicode_ci;
+24 -16
View File
@@ -5,7 +5,7 @@
<relativePath>../</relativePath>
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>0.11</version>
<version>0.23</version>
</parent>
<artifactId>moquette-broker</artifactId>
@@ -37,6 +37,12 @@
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>cn.wildfirechat</groupId>
<artifactId>common</artifactId>
<version>${project.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
@@ -44,13 +50,6 @@
<version>1.2.14</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
@@ -127,13 +126,6 @@
<version>3.2.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java -->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>com.librato.metrics</groupId>
<artifactId>metrics-librato</artifactId>
@@ -249,6 +241,22 @@
<version>1.4.197</version>
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.13.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.flywaydb/flyway-core -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.2.4</version>
</dependency>
</dependencies>
@@ -333,7 +341,7 @@
<!--指定"git.properties"文件的存放路径(相对于${project.basedir}的一个路径);-->
<generateGitPropertiesFilename>config/git.properties</generateGitPropertiesFilename>
<!--".git"文件夹未找到时,构建是否失败;若设置true,则构建失败;若设置false,则跳过执行该目标;默认值:true;-->
<failOnNoGitDirectory>true</failOnNoGitDirectory>
<failOnNoGitDirectory>false</failOnNoGitDirectory>
<!--git描述配置,可选;由JGit提供实现;-->
<gitDescribe>
-1
View File
@@ -1 +0,0 @@
CREATE DATABASE IF NOT EXISTS wfchat CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-83
View File
@@ -1,83 +0,0 @@
#!/bin/bash
show_help_info(){
echo "### Usage: ./initial_db.sh -u{user} -p{password}"
echo "### 初始化数据库。"
echo "###"
}
for i in "$@"
do
PFLAG=`echo $i|cut -b1-2`
PPARAM=`echo $i|cut -b3-`
if [ $PFLAG = "-u" ]; then
USER=${PPARAM}
elif [ $PFLAG = "-p" ]; then
PASSWORD=${PPARAM}
elif [ $PFLAG = "-h" ]; then
show_help_info
exit 1
fi
done
echo
if [ "${USER}" = "" ]; then
show_help_info
exit 1
elif [ "${PASSWORD}" = "" ]; then
show_help_info
exit 1
fi
mysql -u${USER} -p${PASSWORD} -e"source 1_create_database.sql;"
mysql -u${USER} -p${PASSWORD} -e"use wfchat; source 2_create_table.sql; source 3_create_default_chatroom.sql;"
for((i=0;i<36;i++));
do
create_message_tbl_sql="USE wfchat;
DROP TABLE IF EXISTS \`t_messages_${i}\`;
CREATE TABLE \`t_messages_${i}\` (
\`id\` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
\`_mid\` bigint(20) NOT NULL,
\`_from\` varchar(64) NOT NULL,
\`_type\` tinyint NOT NULL DEFAULT 0,
\`_target\` varchar(64) NOT NULL,
\`_line\` int(11) NOT NULL DEFAULT 0,
\`_data\` BLOB NOT NULL,
\`_searchable_key\` TEXT DEFAULT NULL,
\`_dt\` DATETIME NOT NULL,
INDEX \`message_uid_index\` (\`_mid\` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_unicode_ci;
"
echo "create table t_messages_$i"
mysql -u${USER} -p${PASSWORD} -e"${create_message_tbl_sql}"
done
for((i=0;i<128;i++));
do
create_user_message_tbl_sql="USE wfchat;
DROP TABLE IF EXISTS \`t_user_messages_${i}\`;
CREATE TABLE \`t_user_messages_${i}\` (
\`id\` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
\`_mid\` bigint(20) NOT NULL,
\`_uid\` varchar(64) NOT NULL,
\`_seq\` bigint(20) NOT NULL,
\`_dt\` DATETIME NOT NULL DEFAULT NOW(),
INDEX \`message_seq_uid_index\` (\`_uid\` DESC, \`_seq\` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_unicode_ci;
"
echo "create table t_user_messages_$i"
mysql -u${USER} -p${PASSWORD} -e"${create_user_message_tbl_sql}"
done
@@ -30,14 +30,14 @@ public class ThreadPoolExecutorWrapper {
public void execute(Runnable task) {
int startCount = runCounter.incrementAndGet();
LOG.info("Submit task and current taskcount {}", startCount);
LOG.debug("Submit task and current task count {}", startCount);
final long startTime = System.currentTimeMillis();
executor.execute(() -> {
try {
task.run();
} finally {
int endCount = runCounter.decrementAndGet();
LOG.info("Finish task and current taskcount {} use time {}", endCount, System.currentTimeMillis()-startTime);
LOG.debug("Finish task and current task count {} use time {}", endCount, System.currentTimeMillis()-startTime);
}
});
}
@@ -8,7 +8,7 @@
package com.xiaoleilu.loServer;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
public class RestResult {
@@ -10,7 +10,6 @@ package com.xiaoleilu.loServer.action;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.action.admin.GetIMTokenAction;
import com.xiaoleilu.loServer.annotation.RequireAuthentication;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
@@ -21,10 +20,9 @@ import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import win.liyufan.im.DBUtil;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import static win.liyufan.im.ErrorCode.ERROR_CODE_SUCCESS;
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS;
/**
* 请求处理接口<br>
@@ -39,8 +37,6 @@ abstract public class Action {
public ChannelHandlerContext ctx;
protected boolean isSync = true;
public ErrorCode preAction(Request request, Response response) {
if (getClass().getAnnotation(RequireAuthentication.class) != null) {
//do authentication
@@ -50,6 +46,7 @@ abstract public class Action {
}
public boolean doAction(Request request, Response response) {
ErrorCode errorCode = preAction(request, response);
boolean isSync = true;
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
//事务逻辑有缺陷,先注释掉
// if (isTransactionAction() && !(this instanceof IMAction)) {
@@ -63,9 +60,8 @@ abstract public class Action {
// throw e;
// }
// } else {
action(request, response);
isSync = action(request, response);
// }
afterAction(request, response);
} else {
response.setStatus(HttpResponseStatus.OK);
if (errorCode == null) {
@@ -77,19 +73,12 @@ abstract public class Action {
response.send();
}
if(this instanceof IMAction || this instanceof RouteAction || this instanceof GetIMTokenAction) {
isSync = false;
}
return isSync;
}
public boolean isTransactionAction() {
return false;
}
abstract public void action(Request request, Response response);
public void afterAction(Request request, Response response) {
}
abstract public boolean action(Request request, Response response);
protected <T> T getRequestBody(HttpRequest request, Class<T> cls) {
if (request instanceof FullHttpRequest) {
@@ -12,7 +12,8 @@ import io.moquette.spi.IMessagesStore;
*/
public class DefaultIndexAction extends Action{
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
response.setContent("Welcome to LoServer.");
return true;
}
}
@@ -34,15 +34,15 @@ public class FileAction extends Action {
private static final org.slf4j.Logger Logger = LoggerFactory.getLogger(FileAction.class);
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (false == Request.METHOD_GET.equalsIgnoreCase(request.getMethod())) {
response.sendError(HttpResponseStatus.METHOD_NOT_ALLOWED, "Please use GET method to request file!");
return;
return true;
}
if(ServerSetting.isRootAvailable() == false){
response.sendError(HttpResponseStatus.NOT_FOUND, "404 Root dir not avaliable!");
return;
return true;
}
final File file = getFileByPath(request.getPath());
@@ -51,13 +51,13 @@ public class FileAction extends Action {
// 隐藏文件,跳过
if (file.isHidden() || !file.exists()) {
response.sendError(HttpResponseStatus.NOT_FOUND, "404 File not found!");
return;
return true;
}
// 非文件,跳过
if (false == file.isFile()) {
response.sendError(HttpResponseStatus.FORBIDDEN, "403 Forbidden!");
return;
return true;
}
// Cache Validation
@@ -76,12 +76,13 @@ public class FileAction extends Action {
if (ifModifiedSinceDateSeconds == fileLastModifiedSeconds) {
Logger.debug("File {} not modified.", file.getPath());
response.sendNotModified();
return;
return true;
}
}
}
response.setContent(file);
return true;
}
private static final Pattern INSECURE_URI = Pattern.compile(".*[<>&\"].*");
@@ -25,7 +25,7 @@ import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import java.util.Base64;
import java.util.concurrent.Executor;
@@ -35,7 +35,7 @@ import java.util.concurrent.Executor;
public class IMAction extends Action {
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
FullHttpRequest fullHttpRequest = (FullHttpRequest)request.getNettyRequest();
@@ -46,15 +46,15 @@ public class IMAction extends Action {
bytes = Base64.getDecoder().decode(str);
} catch (IllegalArgumentException e) {
sendResponse(response, ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH, null);
return;
return true;
}
String cid = fullHttpRequest.headers().get("cid");
byte[] cbytes = Base64.getDecoder().decode(cid);
cbytes = AES.AESDecrypt(cbytes, null, true);
cbytes = AES.AESDecrypt(cbytes, "", true);
if (cbytes == null) {
sendResponse(response, ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH, null);
return;
return true;
}
cid = new String(cbytes);
@@ -64,13 +64,13 @@ public class IMAction extends Action {
bytes = AES.AESDecrypt(bytes, session.getSecret(), true);
} else {
sendResponse(response, ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH, null);
return;
return true;
}
if (bytes == null) {
sendResponse(response, ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH, null);
return;
return true;
}
try {
@@ -102,12 +102,14 @@ public class IMAction extends Action {
ctx.executor().execute(command);
};
}
});
}, false);
return false;
}
} catch (InvalidProtocolBufferException e) {
sendResponse(response, ErrorCode.ERROR_CODE_INVALID_DATA, null);
}
}
return true;
}
private void sendResponse(Response response, ErrorCode errorCode, byte[] contents) {
@@ -27,7 +27,8 @@ public class NotFoundAction extends Action{
private final static String TEMPLATE_ERROR = "<!DOCTYPE html><html><head><title>LoServer - Error report</title><style>h1,h3 {color:white; background-color: gray;}</style></head><body><h1>HTTP Status {} - {}</h1><hr size=\"1\" noshade=\"noshade\" /><p>{}</p><hr size=\"1\" noshade=\"noshade\" /><h3>LoServer</h3></body></html>";
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
response.sendError(HttpResponseStatus.NOT_FOUND, "404 Not found!");
return true;
}
}
@@ -26,7 +26,7 @@ import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import java.util.Base64;
import java.util.concurrent.Executor;
@@ -36,11 +36,11 @@ import java.util.concurrent.Executor;
public class RouteAction extends Action {
private static final Logger LOG = LoggerFactory.getLogger(RouteAction.class);
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
response.setContentType("application/octet-stream");
FullHttpRequest fullHttpRequest = (FullHttpRequest)request.getNettyRequest();
FullHttpRequest fullHttpRequest = (FullHttpRequest) request.getNettyRequest();
boolean b = false;
if ("web".equalsIgnoreCase(fullHttpRequest.headers().get("p"))) {
b = true;
@@ -55,34 +55,34 @@ public class RouteAction extends Action {
bytes = Base64.getDecoder().decode(str);
} catch (IllegalArgumentException e) {
sendResponse(response, ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH, null, base64Response);
return;
return true;
}
String cid = fullHttpRequest.headers().get("cid");
byte[] cbytes = Base64.getDecoder().decode(cid);
cbytes = AES.AESDecrypt(cbytes, null, true);
cbytes = AES.AESDecrypt(cbytes, "", true);
if (cbytes == null) {
sendResponse(response, ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH, null, base64Response);
return;
return true;
}
cid = new String(cbytes);
String uid = fullHttpRequest.headers().get("uid");
byte[] ubytes = Base64.getDecoder().decode(uid);
ubytes = AES.AESDecrypt(ubytes, null, true);
ubytes = AES.AESDecrypt(ubytes, "", true);
if (ubytes == null) {
sendResponse(response, ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH, null, base64Response);
return;
return true;
}
uid = new String(ubytes);
MemorySessionStore.Session session = sessionsStore.sessionForClientAndUser(uid, cid);
if (session == null) {
ErrorCode errorCode = sessionsStore.createNewSession(uid, cid, true);
ErrorCode errorCode = sessionsStore.createNewSession(uid, cid, true, true);
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
sendResponse(response, errorCode, null, base64Response);
return;
return true;
}
session = sessionsStore.sessionForClientAndUser(uid, cid);
}
@@ -92,13 +92,13 @@ public class RouteAction extends Action {
bytes = AES.AESDecrypt(bytes, session.getSecret(), true);
} else {
sendResponse(response, ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH, null, base64Response);
return;
return true;
}
if (bytes == null) {
sendResponse(response, ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH, null, base64Response);
return;
return true;
}
@@ -132,20 +132,26 @@ public class RouteAction extends Action {
ctx.executor().execute(command);
};
}
});
}, false);
return false;
}
} catch (InvalidProtocolBufferException e) {
sendResponse(response, ErrorCode.ERROR_CODE_INVALID_DATA, null, false);
}
}
return true;
}
private void sendResponse(Response response, ErrorCode errorCode, byte[] contents, boolean base64Response) {
response.setStatus(HttpResponseStatus.OK);
if(contents == null) {
if (contents == null) {
ByteBuf ackPayload = Unpooled.buffer();
ackPayload.ensureWritable(1).writeByte(errorCode.getCode());
response.setContent(ackPayload);
contents = ackPayload.array();
}
if (base64Response) {
byte[] base64Data = Base64.getEncoder().encode(contents);
response.setContent(base64Data);
} else {
response.setContent(contents);
}
@@ -27,7 +27,8 @@ public class UnknownErrorAction extends Action{
private final static String TEMPLATE_ERROR = "<!DOCTYPE html><html><head><title>LoServer - Error report</title><style>h1,h3 {color:white; background-color: gray;}</style></head><body><h1>HTTP Status {} - {}</h1><hr size=\"1\" noshade=\"noshade\" /><p>{}</p><hr size=\"1\" noshade=\"noshade\" /><h3>LoServer</h3></body></html>";
@Override
public void action(Request request, Response response) {
response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
public boolean action(Request request, Response response) {
response.setStatus(HttpResponseStatus.NOT_FOUND);
return true;
}
}
@@ -73,7 +73,7 @@ public class UploadFileAction extends Action {
}
@Override
public void action(Request r, Response response) {
public boolean action(Request r, Response response) {
if (r.getNettyRequest() instanceof FullHttpRequest) {
FullHttpRequest request = (FullHttpRequest) r.getNettyRequest();
@@ -84,12 +84,13 @@ public class UploadFileAction extends Action {
logger.warn("http decode failed!");
response.setStatus(HttpResponseStatus.BAD_REQUEST);
response.setContent("http decode failed");
return;
return true;
}
multipartUpload(request, requestId, response);
}
return true;
}
@@ -9,23 +9,18 @@
package com.xiaoleilu.loServer.action;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import com.xiaoleilu.loServer.pojos.InputUserLogin;
import com.xiaoleilu.loServer.pojos.OutputLoginData;
import io.moquette.spi.impl.Utils;
import io.moquette.spi.impl.security.TokenAuthenticator;
import cn.wildfirechat.pojos.InputUserLogin;
import cn.wildfirechat.pojos.OutputLoginData;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import win.liyufan.im.ErrorCode;
import win.liyufan.im.GitRepositoryState;
import win.liyufan.im.Utility;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@Route("/api/version")
@HttpMethod("GET")
@@ -33,16 +28,18 @@ public class VersionAction extends Action {
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
response.setStatus(HttpResponseStatus.OK);
try {
response.setContent(new Gson().toJson(GitRepositoryState.getGitRepositoryState()));
response.setContent(Utility.formatJson(new Gson().toJson(GitRepositoryState.getGitRepositoryState())));
} catch (IOException e) {
e.printStackTrace();
response.setContent("No version info!");
response.setContent("{\"version\":\"unknown\"}");
}
}
return true;
}
}
@@ -0,0 +1,84 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import cn.wildfirechat.pojos.InputAddGroupMember;
import io.moquette.persistence.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import java.util.concurrent.Executor;
@Route(APIPath.Group_Member_Add)
@HttpMethod("POST")
public class AddGroupMemberAction extends AdminAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputAddGroupMember inputAddGroupMember = getRequestBody(request.getNettyRequest(), InputAddGroupMember.class);
if (inputAddGroupMember.isValide()) {
RPCCenter.getInstance().sendRequest(inputAddGroupMember.getOperator(), null, IMTopic.AddGroupMemberTopic, inputAddGroupMember.toProtoGroupRequest().toByteArray(), inputAddGroupMember.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
@Override
public void onSuccess(byte[] result) {
ByteBuf byteBuf = Unpooled.buffer();
byteBuf.writeBytes(result);
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
sendResponse(response, null, null);
} else {
sendResponse(response, errorCode, null);
}
}
@Override
public void onError(ErrorCode errorCode) {
sendResponse(response, errorCode, null);
}
@Override
public void onTimeout() {
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
}
@Override
public Executor getResponseExecutor() {
return command -> {
ctx.executor().execute(command);
};
}
}, true);
return false;
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -13,24 +13,28 @@ import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.action.Action;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import com.xiaoleilu.loServer.pojos.InputCreateUser;
import io.moquette.persistence.RPCCenter;
import io.moquette.spi.impl.Utils;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import org.apache.commons.codec.digest.DigestUtils;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.RateLimiter;
abstract public class AdminAction extends Action {
private static String SECRET_KEY = "123456";
private static boolean NO_CHECK_TIME = false;
private final RateLimiter mLimitCounter = new RateLimiter(10, 500);
public static void setSecretKey(String secretKey) {
SECRET_KEY = secretKey;
}
public static void setNoCheckTime(String noCheckTime) {
try {
NO_CHECK_TIME = Boolean.parseBoolean(noCheckTime);
} catch (Exception e) {
}
}
@Override
public ErrorCode preAction(Request request, Response response) {
if (!mLimitCounter.isGranted("admin")) {
@@ -51,8 +55,8 @@ abstract public class AdminAction extends Action {
return ErrorCode.INVALID_PARAMETER;
}
if (System.currentTimeMillis() - ts > 2 * 60 * 60 * 1000) {
// return ErrorCode.ERROR_CODE_SIGN_EXPIRED;
if (!NO_CHECK_TIME && System.currentTimeMillis() - ts > 2 * 60 * 60 * 1000) {
return ErrorCode.ERROR_CODE_SIGN_EXPIRED;
}
String str = nonce + "|" + SECRET_KEY + "|" + timestamp;
@@ -8,21 +8,22 @@
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import com.xiaoleilu.loServer.pojos.InputOutputUserBlockStatus;
import cn.wildfirechat.pojos.InputOutputUserBlockStatus;
import io.moquette.persistence.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
@Route("admin/user/status")
@Route(APIPath.User_Update_Block_Status)
@HttpMethod("POST")
public class BlockUserAction extends AdminAction {
@@ -32,7 +33,7 @@ public class BlockUserAction extends AdminAction {
}
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputOutputUserBlockStatus inputUserBlock = getRequestBody(request.getNettyRequest(), InputOutputUserBlockStatus.class);
if (inputUserBlock != null
@@ -44,7 +45,9 @@ public class BlockUserAction extends AdminAction {
result = RestResult.resultOf(errorCode);
response.setContent(new Gson().toJson(result));
RPCCenter.getInstance().sendRequest(null, null, RPCCenter.KICKOFF_USER_REQUEST, inputUserBlock.getUserId().getBytes(), inputUserBlock.getUserId(), TargetEntry.Type.TARGET_TYPE_USER, null);
if (inputUserBlock.getStatus() == 2) {
RPCCenter.getInstance().sendRequest(null, null, RPCCenter.KICKOFF_USER_REQUEST, inputUserBlock.getUserId().getBytes(), inputUserBlock.getUserId(), TargetEntry.Type.TARGET_TYPE_USER, null, true);
}
sendResponse(response, ErrorCode.ERROR_CODE_SUCCESS, null);
} else {
@@ -54,5 +57,6 @@ public class BlockUserAction extends AdminAction {
}
}
return true;
}
}
@@ -0,0 +1,90 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.BroadMessageData;
import cn.wildfirechat.pojos.BroadMessageResult;
import cn.wildfirechat.pojos.SendMessageData;
import cn.wildfirechat.pojos.SendMessageResult;
import com.google.gson.Gson;
import com.hazelcast.util.StringUtil;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import io.moquette.persistence.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import win.liyufan.im.IMTopic;
import java.util.concurrent.Executor;
@Route(APIPath.Msg_Broadcast)
@HttpMethod("POST")
public class BroadcastMessageAction extends AdminAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
BroadMessageData sendMessageData = getRequestBody(request.getNettyRequest(), BroadMessageData.class);
if (BroadMessageData.isValide(sendMessageData) && !StringUtil.isNullOrEmpty(sendMessageData.getSender())) {
RPCCenter.getInstance().sendRequest(sendMessageData.getSender(), null, IMTopic.BroadcastMessageTopic, sendMessageData.toProtoMessage().toByteArray(), sendMessageData.getSender(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
@Override
public void onSuccess(byte[] result) {
ByteBuf byteBuf = Unpooled.buffer();
byteBuf.writeBytes(result);
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
long messageId = byteBuf.readLong();
long count = byteBuf.readLong();
sendResponse(response, null, new BroadMessageResult(messageId, count));
} else {
sendResponse(response, errorCode, null);
}
}
@Override
public void onError(ErrorCode errorCode) {
sendResponse(response, errorCode, null);
}
@Override
public void onTimeout() {
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
}
@Override
public Executor getResponseExecutor() {
return command -> {
ctx.executor().execute(command);
};
}
}, true);
return false;
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -8,19 +8,19 @@
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import com.xiaoleilu.loServer.pojos.InputGetUserInfo;
import com.xiaoleilu.loServer.pojos.OutputCreateUser;
import cn.wildfirechat.pojos.InputGetUserInfo;
import io.moquette.persistence.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.util.internal.StringUtil;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
@Route("/admin/user/onlinestatus")
@Route(APIPath.User_Get_Online_Status)
@HttpMethod("POST")
public class CheckUserOnlineAction extends AdminAction {
@@ -30,16 +30,17 @@ public class CheckUserOnlineAction extends AdminAction {
}
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputGetUserInfo inputUserId = getRequestBody(request.getNettyRequest(), InputGetUserInfo.class);
if (inputUserId == null || !StringUtil.isNullOrEmpty(inputUserId.getUserId())) {
RPCCenter.getInstance().sendRequest(null, null, RPCCenter.CHECK_USER_ONLINE_REQUEST, inputUserId.getUserId().getBytes(), inputUserId.getUserId(), TargetEntry.Type.TARGET_TYPE_USER, null);
return;
RPCCenter.getInstance().sendRequest(null, null, RPCCenter.CHECK_USER_ONLINE_REQUEST, inputUserId.getUserId().getBytes(), inputUserId.getUserId(), TargetEntry.Type.TARGET_TYPE_USER, null, true);
return true;
} else {
sendResponse(response, ErrorCode.INVALID_PARAMETER, null);
}
}
return true;
}
}
@@ -8,6 +8,7 @@
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
@@ -15,17 +16,16 @@ import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import com.xiaoleilu.loServer.pojos.InputCreateChatroom;
import com.xiaoleilu.loServer.pojos.OutputCreateChatroom;
import cn.wildfirechat.pojos.InputCreateChatroom;
import cn.wildfirechat.pojos.OutputCreateChatroom;
import io.moquette.spi.impl.Utils;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import win.liyufan.im.ErrorCode;
import win.liyufan.im.UUIDGenerator;
import cn.wildfirechat.common.ErrorCode;
@Route("/admin/chatroom")
@HttpMethod("PUT")
@Route(APIPath.Create_Chatroom)
@HttpMethod("POST")
public class CreateChatroomAction extends AdminAction {
@Override
@@ -34,7 +34,7 @@ public class CreateChatroomAction extends AdminAction {
}
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
FullHttpRequest fullHttpRequest = (FullHttpRequest)request.getNettyRequest();
byte[] bytes = Utils.readBytesAndRewind(fullHttpRequest.content());
@@ -67,5 +67,6 @@ public class CreateChatroomAction extends AdminAction {
}
}
return true;
}
}
@@ -9,27 +9,28 @@
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import com.xiaoleilu.loServer.pojos.InputCreateGroup;
import com.xiaoleilu.loServer.pojos.OutputCreateGroupResult;
import cn.wildfirechat.pojos.InputCreateGroup;
import cn.wildfirechat.pojos.OutputCreateGroupResult;
import io.moquette.persistence.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import java.util.concurrent.Executor;
@Route("admin/group")
@HttpMethod("PUT")
@Route(APIPath.Create_Group)
@HttpMethod("POST")
public class CreateGroupAction extends AdminAction {
@Override
@@ -38,7 +39,7 @@ public class CreateGroupAction extends AdminAction {
}
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputCreateGroup inputCreateGroup = getRequestBody(request.getNettyRequest(), InputCreateGroup.class);
if (inputCreateGroup.isValide()) {
@@ -74,12 +75,14 @@ public class CreateGroupAction extends AdminAction {
ctx.executor().execute(command);
};
}
});
}, true);
return false;
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -8,6 +8,7 @@
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
@@ -15,15 +16,15 @@ import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import com.xiaoleilu.loServer.pojos.InputCreateRobot;
import com.xiaoleilu.loServer.pojos.OutputCreateRobot;
import cn.wildfirechat.pojos.InputCreateRobot;
import cn.wildfirechat.pojos.OutputCreateRobot;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.UUIDGenerator;
@Route("admin/robot/create")
@Route(APIPath.Create_Robot)
@HttpMethod("POST")
public class CreateRobotAction extends AdminAction {
@@ -33,7 +34,7 @@ public class CreateRobotAction extends AdminAction {
}
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputCreateRobot inputCreateRobot = getRequestBody(request.getNettyRequest(), InputCreateRobot.class);
if (inputCreateRobot != null
@@ -76,5 +77,6 @@ public class CreateRobotAction extends AdminAction {
}
}
return true;
}
}
@@ -8,6 +8,7 @@
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
@@ -15,15 +16,15 @@ import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import com.xiaoleilu.loServer.pojos.InputCreateUser;
import com.xiaoleilu.loServer.pojos.OutputCreateUser;
import cn.wildfirechat.pojos.InputOutputUserInfo;
import cn.wildfirechat.pojos.OutputCreateUser;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.UUIDGenerator;
@Route("admin/user/create")
@Route(APIPath.Create_User)
@HttpMethod("POST")
public class CreateUserAction extends AdminAction {
@@ -33,9 +34,9 @@ public class CreateUserAction extends AdminAction {
}
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputCreateUser inputCreateUser = getRequestBody(request.getNettyRequest(), InputCreateUser.class);
InputOutputUserInfo inputCreateUser = getRequestBody(request.getNettyRequest(), InputOutputUserInfo.class);
if (inputCreateUser != null
&& !StringUtil.isNullOrEmpty(inputCreateUser.getName())) {
@@ -47,10 +48,6 @@ public class CreateUserAction extends AdminAction {
inputCreateUser.setUserId(messagesStore.getShortUUID());
}
if (inputCreateUser.getPortrait() == null || inputCreateUser.getPortrait().length() == 0) {
inputCreateUser.setPortrait("https://avatars.io/gravatar/" + inputCreateUser.getUserId());
}
WFCMessage.User.Builder newUserBuilder = WFCMessage.User.newBuilder()
.setUid(StringUtil.isNullOrEmpty(inputCreateUser.getUserId()) ? "" : inputCreateUser.getUserId());
if (inputCreateUser.getName() != null)
@@ -90,5 +87,6 @@ public class CreateUserAction extends AdminAction {
}
}
return true;
}
}
@@ -8,21 +8,22 @@
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import com.xiaoleilu.loServer.pojos.InputDestoryChatroom;
import cn.wildfirechat.pojos.InputDestoryChatroom;
import io.moquette.spi.impl.Utils;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
@Route("/admin/chatroom")
@HttpMethod("DELETE")
@Route(APIPath.Chatroom_Destroy)
@HttpMethod("POST")
public class DestoryChatroomAction extends AdminAction {
@Override
@@ -31,7 +32,7 @@ public class DestoryChatroomAction extends AdminAction {
}
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
FullHttpRequest fullHttpRequest = (FullHttpRequest)request.getNettyRequest();
byte[] bytes = Utils.readBytesAndRewind(fullHttpRequest.content());
@@ -54,5 +55,6 @@ public class DestoryChatroomAction extends AdminAction {
}
}
return true;
}
}
@@ -0,0 +1,84 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import cn.wildfirechat.pojos.InputDismissGroup;
import io.moquette.persistence.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import java.util.concurrent.Executor;
@Route(APIPath.Group_Dismiss)
@HttpMethod("POST")
public class DismissGroupAction extends AdminAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputDismissGroup inputDismissGroup = getRequestBody(request.getNettyRequest(), InputDismissGroup.class);
if (inputDismissGroup.isValide()) {
RPCCenter.getInstance().sendRequest(inputDismissGroup.getOperator(), null, IMTopic.DismissGroupTopic, inputDismissGroup.toProtoGroupRequest().toByteArray(), inputDismissGroup.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
@Override
public void onSuccess(byte[] result) {
ByteBuf byteBuf = Unpooled.buffer();
byteBuf.writeBytes(result);
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
sendResponse(response, null, null);
} else {
sendResponse(response, errorCode, null);
}
}
@Override
public void onError(ErrorCode errorCode) {
sendResponse(response, errorCode, null);
}
@Override
public void onTimeout() {
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
}
@Override
public Executor getResponseExecutor() {
return command -> {
ctx.executor().execute(command);
};
}
}, true);
return false;
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -0,0 +1,88 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import cn.wildfirechat.pojos.InputFriendRequest;
import io.moquette.persistence.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import java.util.concurrent.Executor;
@Route(APIPath.Friend_Update_Status)
@HttpMethod("POST")
public class FriendRelationAction extends AdminAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputFriendRequest friendAdd = getRequestBody(request.getNettyRequest(), InputFriendRequest.class);
if (friendAdd != null
&& !StringUtil.isNullOrEmpty(friendAdd.getUserId())
&& !StringUtil.isNullOrEmpty(friendAdd.getFriendUid())
) {
WFCMessage.HandleFriendRequest friendRequest = WFCMessage.HandleFriendRequest.newBuilder().setTargetUid(friendAdd.getFriendUid()).setStatus(friendAdd.getStatus()).build();
RPCCenter.getInstance().sendRequest(friendAdd.getUserId(), null, IMTopic.HandleFriendRequestTopic, friendRequest.toByteArray(), friendAdd.getFriendUid(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
@Override
public void onSuccess(byte[] result) {
ByteBuf byteBuf = Unpooled.buffer();
byteBuf.writeBytes(result);
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
sendResponse(response, null, null);
} else {
sendResponse(response, errorCode, null);
}
}
@Override
public void onError(ErrorCode errorCode) {
sendResponse(response, errorCode, null);
}
@Override
public void onTimeout() {
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
}
@Override
public Executor getResponseExecutor() {
return command -> ctx.executor().execute(command);
}
}, true);
return false;
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -0,0 +1,52 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import com.xiaoleilu.loServer.model.FriendData;
import cn.wildfirechat.pojos.InputGetFriendList;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import java.util.ArrayList;
import java.util.List;
@Route(APIPath.Friend_Get_List)
@HttpMethod("POST")
public class FriendRelationGetAction extends AdminAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputGetFriendList inputGetFriendList = getRequestBody(request.getNettyRequest(), InputGetFriendList.class);
List<FriendData> dataList = messagesStore.getFriendList(inputGetFriendList.getUserId(), 0);
List<String> list = new ArrayList<>();
for (FriendData data : dataList) {
if (data.getState() == inputGetFriendList.getStatus()) {
list.add(data.getFriendUid());
}
}
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.ok(list);
response.setContent(new Gson().toJson(result));
}
return true;
}
}
@@ -8,6 +8,8 @@
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.pojos.*;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
@@ -15,14 +17,13 @@ import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import com.xiaoleilu.loServer.pojos.OutputGetChatroomInfo;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
@Route("/admin/chatroom")
@HttpMethod("GET")
@Route(APIPath.Chatroom_Info)
@HttpMethod("POST")
public class GetChatroomInfoAction extends AdminAction {
@Override
@@ -31,19 +32,19 @@ public class GetChatroomInfoAction extends AdminAction {
}
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
String chatroomid = request.getParam("id");
InputGetChatroomInfo getChatroomInfo = getRequestBody(request.getNettyRequest(), InputGetChatroomInfo.class);
String chatroomid = getChatroomInfo.getChatroomId();
if (!StringUtil.isNullOrEmpty(chatroomid)) {
WFCMessage.ChatroomInfo info = messagesStore.getChatroomInfo(chatroomid);
RestResult result;
if (info == null) {
if (info != null) {
result = RestResult.ok(new OutputGetChatroomInfo(chatroomid, messagesStore.getChatroomMemberCount(chatroomid), info));
} else {
result = RestResult.resultOf(ErrorCode.ERROR_CODE_SUCCESS);
result = RestResult.resultOf(ErrorCode.ERROR_CODE_NOT_EXIST);
}
response.setStatus(HttpResponseStatus.OK);
@@ -56,5 +57,6 @@ public class GetChatroomInfoAction extends AdminAction {
}
}
return true;
}
}
@@ -0,0 +1,71 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputGetGroup;
import cn.wildfirechat.pojos.InputGetUserInfo;
import cn.wildfirechat.pojos.InputOutputUserInfo;
import cn.wildfirechat.pojos.PojoGroupInfo;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
@Route(APIPath.Group_Get_Info)
@HttpMethod("POST")
public class GetGroupInfoAction extends AdminAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputGetGroup inputGetGroup = getRequestBody(request.getNettyRequest(), InputGetGroup.class);
if (inputGetGroup != null
&& (!StringUtil.isNullOrEmpty(inputGetGroup.getGroupId()))) {
WFCMessage.GroupInfo groupInfo = messagesStore.getGroupInfo(inputGetGroup.getGroupId());
response.setStatus(HttpResponseStatus.OK);
RestResult result;
if (groupInfo == null) {
result = RestResult.resultOf(ErrorCode.ERROR_CODE_NOT_EXIST);
} else {
PojoGroupInfo pojoGroupInfo = new PojoGroupInfo();
pojoGroupInfo.setExtra(groupInfo.getExtra());
pojoGroupInfo.setName(groupInfo.getName());
pojoGroupInfo.setOwner(groupInfo.getOwner());
pojoGroupInfo.setPortrait(groupInfo.getPortrait());
pojoGroupInfo.setTarget_id(groupInfo.getTargetId());
pojoGroupInfo.setType(groupInfo.getType());
result = RestResult.ok(pojoGroupInfo);
}
response.setContent(new Gson().toJson(result));
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -0,0 +1,78 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputGetGroup;
import cn.wildfirechat.pojos.OutputGroupMemberList;
import cn.wildfirechat.pojos.PojoGroupInfo;
import cn.wildfirechat.pojos.PojoGroupMember;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import java.util.ArrayList;
import java.util.List;
@Route(APIPath.Group_Member_List)
@HttpMethod("POST")
public class GetGroupMembersAction extends AdminAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputGetGroup inputGetGroup = getRequestBody(request.getNettyRequest(), InputGetGroup.class);
if (inputGetGroup != null
&& (!StringUtil.isNullOrEmpty(inputGetGroup.getGroupId()))) {
List<WFCMessage.GroupMember> members = new ArrayList<>();
ErrorCode errorCode = messagesStore.getGroupMembers(inputGetGroup.getGroupId(), 0, members);
response.setStatus(HttpResponseStatus.OK);
RestResult result;
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
result = RestResult.resultOf(errorCode);
} else {
OutputGroupMemberList out = new OutputGroupMemberList();
out.setMembers(new ArrayList<>());
for (WFCMessage.GroupMember member : members) {
PojoGroupMember pm = new PojoGroupMember();
pm.setMember_id(member.getMemberId());
pm.setAlias(member.getAlias());
pm.setType(member.getType());
out.getMembers().add(pm);
}
result = RestResult.ok(out);
}
response.setContent(new Gson().toJson(result));
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -8,23 +8,24 @@
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.proto.WFCMessage;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import com.xiaoleilu.loServer.pojos.InputGetToken;
import com.xiaoleilu.loServer.pojos.OutputGetIMTokenData;
import cn.wildfirechat.pojos.InputGetToken;
import cn.wildfirechat.pojos.OutputGetIMTokenData;
import io.moquette.persistence.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.handler.codec.http.FullHttpRequest;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import java.util.Base64;
import java.util.concurrent.Executor;
@Route("/admin/user/token")
@Route(APIPath.User_Get_Token)
@HttpMethod("POST")
public class GetIMTokenAction extends AdminAction {
@@ -34,7 +35,7 @@ public class GetIMTokenAction extends AdminAction {
}
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputGetToken input = getRequestBody(request.getNettyRequest(), InputGetToken.class);
String userId = input.getUserId();
@@ -75,7 +76,9 @@ public class GetIMTokenAction extends AdminAction {
ctx.executor().execute(command);
};
}
});
}, true);
return false;
}
return true;
}
}
@@ -8,6 +8,7 @@
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
@@ -15,15 +16,14 @@ import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import com.xiaoleilu.loServer.pojos.InputCreateUser;
import com.xiaoleilu.loServer.pojos.InputGetUserInfo;
import com.xiaoleilu.loServer.pojos.OutputCreateUser;
import cn.wildfirechat.pojos.InputOutputUserInfo;
import cn.wildfirechat.pojos.InputGetUserInfo;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
@Route("admin/user/info")
@Route(APIPath.User_Get_Info)
@HttpMethod("POST")
public class GetUserAction extends AdminAction {
@@ -33,11 +33,11 @@ public class GetUserAction extends AdminAction {
}
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputGetUserInfo inputUserId = getRequestBody(request.getNettyRequest(), InputGetUserInfo.class);
if (inputUserId != null
&& (!StringUtil.isNullOrEmpty(inputUserId.getUserId()) || !StringUtil.isNullOrEmpty(inputUserId.getName()))) {
&& (!StringUtil.isNullOrEmpty(inputUserId.getUserId()) || !StringUtil.isNullOrEmpty(inputUserId.getName()) || !StringUtil.isNullOrEmpty(inputUserId.getMobile()))) {
WFCMessage.User user = null;
if(!StringUtil.isNullOrEmpty(inputUserId.getUserId())) {
@@ -53,7 +53,7 @@ public class GetUserAction extends AdminAction {
if (user == null) {
result = RestResult.resultOf(ErrorCode.ERROR_CODE_NOT_EXIST);
} else {
result = RestResult.ok(InputCreateUser.fromPbUser(user));
result = RestResult.ok(InputOutputUserInfo.fromPbUser(user));
}
response.setContent(new Gson().toJson(result));
@@ -64,5 +64,6 @@ public class GetUserAction extends AdminAction {
}
}
return true;
}
}
@@ -8,6 +8,8 @@
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.pojos.OutputUserBlockStatusList;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
@@ -17,7 +19,7 @@ import com.xiaoleilu.loServer.handler.Response;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
@Route("admin/user/statuslist")
@Route(APIPath.User_Get_Blocked_List)
@HttpMethod("POST")
public class GetUserBlockListAction extends AdminAction {
@@ -27,11 +29,14 @@ public class GetUserBlockListAction extends AdminAction {
}
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.ok(messagesStore.getUserStatusList());
OutputUserBlockStatusList list = new OutputUserBlockStatusList();
list.setStatusList(messagesStore.getUserStatusList());
RestResult result = RestResult.ok(list);
response.setContent(new Gson().toJson(result));
}
return true;
}
}
@@ -8,21 +8,21 @@
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import com.xiaoleilu.loServer.pojos.InputGetUserInfo;
import com.xiaoleilu.loServer.pojos.OutputCreateUser;
import com.xiaoleilu.loServer.pojos.OutputUserStatus;
import cn.wildfirechat.pojos.InputGetUserInfo;
import cn.wildfirechat.pojos.OutputUserStatus;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
@Route("admin/user/checkstatus")
@Route(APIPath.User_Check_Block_Status)
@HttpMethod("POST")
public class GetUserBlockStatusAction extends AdminAction {
@@ -32,7 +32,7 @@ public class GetUserBlockStatusAction extends AdminAction {
}
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputGetUserInfo inputUserId = getRequestBody(request.getNettyRequest(), InputGetUserInfo.class);
if (inputUserId != null
@@ -49,5 +49,6 @@ public class GetUserBlockStatusAction extends AdminAction {
}
}
return true;
}
}
@@ -0,0 +1,84 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import cn.wildfirechat.pojos.InputKickoffGroupMember;
import io.moquette.persistence.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import java.util.concurrent.Executor;
@Route(APIPath.Group_Member_Kickoff)
@HttpMethod("POST")
public class KickoffGroupMemberAction extends AdminAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputKickoffGroupMember inputKickoffGroupMember = getRequestBody(request.getNettyRequest(), InputKickoffGroupMember.class);
if (inputKickoffGroupMember.isValide()) {
RPCCenter.getInstance().sendRequest(inputKickoffGroupMember.getOperator(), null, IMTopic.AddGroupMemberTopic, inputKickoffGroupMember.toProtoGroupRequest().toByteArray(), inputKickoffGroupMember.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
@Override
public void onSuccess(byte[] result) {
ByteBuf byteBuf = Unpooled.buffer();
byteBuf.writeBytes(result);
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
sendResponse(response, null, null);
} else {
sendResponse(response, errorCode, null);
}
}
@Override
public void onError(ErrorCode errorCode) {
sendResponse(response, errorCode, null);
}
@Override
public void onTimeout() {
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
}
@Override
public Executor getResponseExecutor() {
return command -> {
ctx.executor().execute(command);
};
}
}, true);
return false;
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -8,6 +8,7 @@
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
@@ -15,7 +16,7 @@ import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import com.xiaoleilu.loServer.pojos.RecallMessageData;
import cn.wildfirechat.pojos.RecallMessageData;
import io.moquette.persistence.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
@@ -23,12 +24,12 @@ import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import java.util.concurrent.Executor;
@Route("admin/message/recall")
@Route(APIPath.Msg_Recall)
@HttpMethod("POST")
public class RecallMessageAction extends AdminAction {
@@ -38,7 +39,7 @@ public class RecallMessageAction extends AdminAction {
}
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
RecallMessageData recallMessageData = getRequestBody(request.getNettyRequest(), RecallMessageData.class);
if (recallMessageData != null && !StringUtil.isNullOrEmpty(recallMessageData.getOperator())) {
@@ -69,12 +70,14 @@ public class RecallMessageAction extends AdminAction {
ctx.executor().execute(command);
};
}
});
}, true);
return false;
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -9,26 +9,28 @@
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import com.google.gson.Gson;
import com.hazelcast.util.StringUtil;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import com.xiaoleilu.loServer.pojos.SendMessageData;
import com.xiaoleilu.loServer.pojos.SendMessageResult;
import cn.wildfirechat.pojos.SendMessageData;
import cn.wildfirechat.pojos.SendMessageResult;
import io.moquette.persistence.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import java.util.concurrent.Executor;
@Route("admin/message/send")
@Route(APIPath.Msg_Send)
@HttpMethod("POST")
public class SendMessageAction extends AdminAction {
@@ -38,10 +40,10 @@ public class SendMessageAction extends AdminAction {
}
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
SendMessageData sendMessageData = getRequestBody(request.getNettyRequest(), SendMessageData.class);
if (SendMessageData.isValide(sendMessageData)) {
if (SendMessageData.isValide(sendMessageData) && !StringUtil.isNullOrEmpty(sendMessageData.getSender())) {
RPCCenter.getInstance().sendRequest(sendMessageData.getSender(), null, IMTopic.SendMessageTopic, sendMessageData.toProtoMessage().toByteArray(), sendMessageData.getSender(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
@Override
public void onSuccess(byte[] result) {
@@ -73,12 +75,14 @@ public class SendMessageAction extends AdminAction {
ctx.executor().execute(command);
};
}
});
}, true);
return false;
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -8,22 +8,19 @@
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import com.xiaoleilu.loServer.pojos.InputOutputSensitiveWords;
import com.xiaoleilu.loServer.pojos.InputOutputUserBlockStatus;
import io.moquette.persistence.RPCCenter;
import io.moquette.persistence.TargetEntry;
import cn.wildfirechat.pojos.InputOutputSensitiveWords;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
@Route("admin/sensitive/add")
@Route(APIPath.Sensitive_Add)
@HttpMethod("POST")
public class SensitiveWordAddAction extends AdminAction {
@@ -33,7 +30,7 @@ public class SensitiveWordAddAction extends AdminAction {
}
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputOutputSensitiveWords input = getRequestBody(request.getNettyRequest(), InputOutputSensitiveWords.class);
if (input != null && input.getWords() != null && !input.getWords().isEmpty()) {
@@ -47,5 +44,6 @@ public class SensitiveWordAddAction extends AdminAction {
}
}
return true;
}
}
@@ -8,18 +8,19 @@
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import com.xiaoleilu.loServer.pojos.InputOutputSensitiveWords;
import cn.wildfirechat.pojos.InputOutputSensitiveWords;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
@Route("admin/sensitive/del")
@Route(APIPath.Sensitive_Del)
@HttpMethod("POST")
public class SensitiveWordDeleteAction extends AdminAction {
@@ -29,7 +30,7 @@ public class SensitiveWordDeleteAction extends AdminAction {
}
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputOutputSensitiveWords input = getRequestBody(request.getNettyRequest(), InputOutputSensitiveWords.class);
if (input != null && input.getWords() != null && !input.getWords().isEmpty()) {
@@ -44,5 +45,6 @@ public class SensitiveWordDeleteAction extends AdminAction {
}
}
return true;
}
}
@@ -8,20 +8,18 @@
package com.xiaoleilu.loServer.action.admin;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import cn.wildfirechat.common.APIPath;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import com.xiaoleilu.loServer.pojos.InputOutputSensitiveWords;
import cn.wildfirechat.pojos.InputOutputSensitiveWords;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import java.util.List;
@Route("admin/sensitive/query")
@Route(APIPath.Sensitive_Query)
@HttpMethod("POST")
public class SensitiveWordQueryAction extends AdminAction {
@@ -31,12 +29,13 @@ public class SensitiveWordQueryAction extends AdminAction {
}
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
List<String> words = messagesStore.getAllSensitiveWords();
InputOutputSensitiveWords out = new InputOutputSensitiveWords();
out.setWords(words);
sendResponse(response, ErrorCode.ERROR_CODE_SUCCESS, out);
}
return true;
}
}
@@ -0,0 +1,84 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import cn.wildfirechat.pojos.InputTransferGroup;
import io.moquette.persistence.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import java.util.concurrent.Executor;
@Route(APIPath.Group_Transfer)
@HttpMethod("POST")
public class TransferGroupAction extends AdminAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputTransferGroup inputDismissGroup = getRequestBody(request.getNettyRequest(), InputTransferGroup.class);
if (inputDismissGroup.isValide()) {
RPCCenter.getInstance().sendRequest(inputDismissGroup.getOperator(), null, IMTopic.TransferGroupTopic, inputDismissGroup.toProtoGroupRequest().toByteArray(), inputDismissGroup.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
@Override
public void onSuccess(byte[] result) {
ByteBuf byteBuf = Unpooled.buffer();
byteBuf.writeBytes(result);
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
sendResponse(response, null, null);
} else {
sendResponse(response, errorCode, null);
}
}
@Override
public void onError(ErrorCode errorCode) {
sendResponse(response, errorCode, null);
}
@Override
public void onTimeout() {
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
}
@Override
public Executor getResponseExecutor() {
return command -> {
ctx.executor().execute(command);
};
}
}, true);
return false;
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -14,14 +14,13 @@ import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.action.Action;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import io.moquette.persistence.RPCCenter;
import io.moquette.spi.impl.Utils;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import org.apache.commons.codec.digest.DigestUtils;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.RateLimiter;
abstract public class ChannelAction extends Action {
@@ -9,30 +9,30 @@
package com.xiaoleilu.loServer.action.channel;
import cn.wildfirechat.common.APIPath;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.action.admin.AdminAction;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import com.xiaoleilu.loServer.pojos.Conversation;
import com.xiaoleilu.loServer.pojos.SendMessageData;
import com.xiaoleilu.loServer.pojos.SendMessageResult;
import cn.wildfirechat.pojos.Conversation;
import cn.wildfirechat.pojos.SendMessageData;
import cn.wildfirechat.pojos.SendMessageResult;
import io.moquette.persistence.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import java.util.concurrent.Executor;
import static cn.wildfirechat.proto.ProtoConstants.ConversationType.ConversationType_Channel;
@Route("channel/message/send")
@Route(APIPath.Channel_Message_Send)
@HttpMethod("POST")
public class SendMessageAction extends ChannelAction {
@@ -42,7 +42,7 @@ public class SendMessageAction extends ChannelAction {
}
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
SendMessageData sendMessageData = getRequestBody(request.getNettyRequest(), SendMessageData.class);
sendMessageData.setConv(new Conversation());
@@ -81,12 +81,14 @@ public class SendMessageAction extends ChannelAction {
ctx.executor().execute(command);
};
}
});
}, false);
return false;
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -8,6 +8,7 @@
package com.xiaoleilu.loServer.action.robot;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
@@ -15,24 +16,23 @@ import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import com.xiaoleilu.loServer.pojos.InputCreateUser;
import com.xiaoleilu.loServer.pojos.InputGetUserInfo;
import com.xiaoleilu.loServer.pojos.OutputCreateUser;
import cn.wildfirechat.pojos.InputOutputUserInfo;
import cn.wildfirechat.pojos.InputGetUserInfo;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
@Route("admin/robot/user_info")
@Route(APIPath.Robot_User_Info)
@HttpMethod("POST")
public class GetUserAction extends RobotAction {
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputGetUserInfo inputUserId = getRequestBody(request.getNettyRequest(), InputGetUserInfo.class);
if (inputUserId != null
&& (!StringUtil.isNullOrEmpty(inputUserId.getUserId()) || !StringUtil.isNullOrEmpty(inputUserId.getName()))) {
&& (!StringUtil.isNullOrEmpty(inputUserId.getUserId()) || !StringUtil.isNullOrEmpty(inputUserId.getName()) || !StringUtil.isNullOrEmpty(inputUserId.getMobile()))) {
WFCMessage.User user = null;
if(!StringUtil.isNullOrEmpty(inputUserId.getUserId())) {
@@ -48,7 +48,7 @@ public class GetUserAction extends RobotAction {
if (user == null) {
result = RestResult.resultOf(ErrorCode.ERROR_CODE_NOT_EXIST);
} else {
result = RestResult.ok(InputCreateUser.fromPbUser(user));
result = RestResult.ok(InputOutputUserInfo.fromPbUser(user));
}
response.setContent(new Gson().toJson(result));
@@ -59,5 +59,6 @@ public class GetUserAction extends RobotAction {
}
}
return true;
}
}
@@ -14,16 +14,17 @@ import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.action.Action;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import io.moquette.persistence.RPCCenter;
import io.moquette.spi.impl.Utils;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import org.apache.commons.codec.digest.DigestUtils;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.RateLimiter;
import java.io.UnsupportedEncodingException;
abstract public class RobotAction extends Action {
private final RateLimiter mLimitCounter = new RateLimiter(10, 1000);
@@ -39,7 +40,7 @@ abstract public class RobotAction extends Action {
return ErrorCode.INVALID_PARAMETER;
}
if (mLimitCounter.isGranted(rid)) {
if (!mLimitCounter.isGranted(rid)) {
return ErrorCode.ERROR_CODE_OVER_FREQUENCY;
}
@@ -80,10 +81,15 @@ abstract public class RobotAction extends Action {
if (request instanceof FullHttpRequest) {
FullHttpRequest fullHttpRequest = (FullHttpRequest) request;
byte[] bytes = Utils.readBytesAndRewind(fullHttpRequest.content());
String content = new String(bytes);
Gson gson = new Gson();
T t = gson.fromJson(content, cls);
return t;
String content = null;
try {
content = new String(bytes, "UTF-8");
Gson gson = new Gson();
T t = gson.fromJson(content, cls);
return t;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return null;
}
@@ -9,28 +9,27 @@
package com.xiaoleilu.loServer.action.robot;
import cn.wildfirechat.proto.ProtoConstants;
import cn.wildfirechat.common.APIPath;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.action.admin.AdminAction;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import com.xiaoleilu.loServer.pojos.SendMessageData;
import com.xiaoleilu.loServer.pojos.SendMessageResult;
import cn.wildfirechat.pojos.SendMessageData;
import cn.wildfirechat.pojos.SendMessageResult;
import io.moquette.persistence.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import java.util.concurrent.Executor;
@Route("admin/robot/send")
@Route(APIPath.Robot_Message_Send)
@HttpMethod("POST")
public class SendMessageAction extends RobotAction {
@@ -40,7 +39,7 @@ public class SendMessageAction extends RobotAction {
}
@Override
public void action(Request request, Response response) {
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
SendMessageData sendMessageData = getRequestBody(request.getNettyRequest(), SendMessageData.class);
sendMessageData.setSender(robot.getUid());
@@ -76,12 +75,14 @@ public class SendMessageAction extends RobotAction {
ctx.executor().execute(command);
};
}
});
}, false);
return false;
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -13,13 +13,15 @@ import java.io.Serializable;
public class FriendData implements Serializable {
private String userId;
private String friendUid;
private String alias;
private int state;
private long timestamp;
public FriendData(String userId, String friendUid, int state, long timestamp) {
public FriendData(String userId, String friendUid, String alias, int state, long timestamp) {
this.userId = userId;
this.friendUid = friendUid;
this.alias = alias;
this.state = state;
this.timestamp = timestamp;
}
@@ -43,6 +45,14 @@ public class FriendData implements Serializable {
this.friendUid = friendUid;
}
public String getAlias() {
return alias;
}
public void setAlias(String alias) {
this.alias = alias;
}
public int getState() {
return state;
}
@@ -1,108 +0,0 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.pojos;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
import com.google.protobuf.ByteString;
import io.moquette.BrokerConstants;
import java.util.List;
public class GroupNotificationBinaryContent {
//operator
private String o;
//name
private String n;
//members
private List<String> ms;
//members
private String m;
public GroupNotificationBinaryContent(String o, String n, String m) {
this.o = o;
this.n = n;
this.m = m;
}
public GroupNotificationBinaryContent(String operator, String name, List<String> members) {
this.o = operator;
this.n = name;
this.ms = members;
}
public String getO() {
return o;
}
public void setO(String o) {
this.o = o;
}
public String getN() {
return n;
}
public void setN(String n) {
this.n = n;
}
public List<String> getMs() {
return ms;
}
public void setMs(List<String> ms) {
this.ms = ms;
}
public WFCMessage.MessageContent getGroupNotifyContent(int groupContentType) {
return WFCMessage.MessageContent.newBuilder().setType(groupContentType).setData(ByteString.copyFromUtf8(new Gson().toJson(this))).build();
}
public WFCMessage.MessageContent getAddGroupNotifyContent() {
return getGroupNotifyContent(BrokerConstants.MESSAGE_CONTENT_TYPE_ADD_GROUP_MEMBER);
}
public WFCMessage.MessageContent getCreateGroupNotifyContent() {
return getGroupNotifyContent(BrokerConstants.MESSAGE_CONTENT_TYPE_CREATE_GROUP);
}
public WFCMessage.MessageContent getDismissGroupNotifyContent() {
return getGroupNotifyContent(BrokerConstants.MESSAGE_CONTENT_TYPE_DISMISS_GROUP);
}
public WFCMessage.MessageContent getKickokfMemberGroupNotifyContent() {
return getGroupNotifyContent(BrokerConstants.MESSAGE_CONTENT_TYPE_KICKOF_GROUP_MEMBER);
}
public WFCMessage.MessageContent getQuitGroupNotifyContent() {
return getGroupNotifyContent(BrokerConstants.MESSAGE_CONTENT_TYPE_QUIT_GROUP);
}
public WFCMessage.MessageContent getTransferGroupNotifyContent() {
return getGroupNotifyContent(BrokerConstants.MESSAGE_CONTENT_TYPE_TRANSFER_GROUP_OWNER);
}
public WFCMessage.MessageContent getChangeGroupNameNotifyContent() {
return getGroupNotifyContent(BrokerConstants.MESSAGE_CONTENT_TYPE_CHANGE_GROUP_NAME);
}
public WFCMessage.MessageContent getChangeGroupPortraitNotifyContent() {
return getGroupNotifyContent(BrokerConstants.MESSAGE_CONTENT_TYPE_CHANGE_GROUP_PORTRAIT);
}
public WFCMessage.MessageContent getModifyGroupMemberAliasNotifyContent() {
return getGroupNotifyContent(BrokerConstants.MESSAGE_CONTENT_TYPE_MODIFY_GROUP_ALIAS);
}
}
@@ -100,6 +100,8 @@ public final class BrokerConstants {
public static final String HZ_Cluster_Node_External_Short_Port = "node_external_short_port";
public static final String HZ_Cluster_Node_ID = "node_id";
public static final String HTTP_SERVER_SECRET_KEY = "http.admin.secret_key";
public static final String HTTP_SERVER_API_NO_CHECK_TIME = "http.admin.no_check_time";
public static final String CLIENT_PROTO_SECRET_KEY = "client.proto.secret_key";
public static final String TOKEN_SECRET_KEY = "token.key ";
@@ -113,17 +115,6 @@ public final class BrokerConstants {
public static final int MESSAGE_CONTENT_TYPE_CREATE_GROUP = 104;
public static final int MESSAGE_CONTENT_TYPE_ADD_GROUP_MEMBER = 105;
public static final int MESSAGE_CONTENT_TYPE_KICKOF_GROUP_MEMBER = 106;
public static final int MESSAGE_CONTENT_TYPE_QUIT_GROUP = 107;
public static final int MESSAGE_CONTENT_TYPE_DISMISS_GROUP = 108;
public static final int MESSAGE_CONTENT_TYPE_TRANSFER_GROUP_OWNER = 109;
public static final int MESSAGE_CONTENT_TYPE_CHANGE_GROUP_NAME = 110;
public static final int MESSAGE_CONTENT_TYPE_MODIFY_GROUP_ALIAS = 111;
public static final int MESSAGE_CONTENT_TYPE_CHANGE_GROUP_PORTRAIT = 112;
private BrokerConstants() {
}
}
@@ -12,16 +12,16 @@ import cn.wildfirechat.proto.ProtoConstants;
import cn.wildfirechat.proto.WFCMessage;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import static win.liyufan.im.ErrorCode.ERROR_CODE_SUCCESS;
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS;
import static win.liyufan.im.IMTopic.HandleFriendRequestTopic;
@Handler(IMTopic.AddFriendRequestTopic)
public class AddFriendHandler extends GroupHandler<WFCMessage.AddFriendRequest> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, WFCMessage.AddFriendRequest request, Qos1PublishHandler.IMCallback callback) {
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.AddFriendRequest request, Qos1PublishHandler.IMCallback callback) {
long[] head = new long[1];
ErrorCode errorCode = m_messagesStore.saveAddFriendRequest(fromUser, request, head);
if (errorCode == ERROR_CODE_SUCCESS) {
@@ -30,7 +30,7 @@ public class AddFriendHandler extends GroupHandler<WFCMessage.AddFriendRequest>
publisher.publishNotification(IMTopic.NotifyFriendRequestTopic, request.getTargetUid(), head[0]);
} else if(user != null && user.getType() == ProtoConstants.UserType.UserType_Robot) {
WFCMessage.HandleFriendRequest handleFriendRequest = WFCMessage.HandleFriendRequest.newBuilder().setTargetUid(fromUser).setStatus(ProtoConstants.FriendRequestStatus.RequestStatus_Accepted).build();
mServer.internalRpcMsg(request.getTargetUid(), null, handleFriendRequest.toByteArray(), 0, fromUser, HandleFriendRequestTopic);
mServer.internalRpcMsg(request.getTargetUid(), null, handleFriendRequest.toByteArray(), 0, fromUser, HandleFriendRequestTopic, false);
}
}
return errorCode;
@@ -9,26 +9,25 @@
package io.moquette.imhandler;
import cn.wildfirechat.proto.WFCMessage;
import com.google.protobuf.InvalidProtocolBufferException;
import com.xiaoleilu.loServer.pojos.GroupNotificationBinaryContent;
import cn.wildfirechat.pojos.GroupNotificationBinaryContent;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import static win.liyufan.im.ErrorCode.ERROR_CODE_SUCCESS;
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS;
@Handler(value = IMTopic.AddGroupMemberTopic)
public class AddGroupMember extends GroupHandler<WFCMessage.AddGroupMemberRequest> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, WFCMessage.AddGroupMemberRequest request, Qos1PublishHandler.IMCallback callback) {
ErrorCode errorCode = m_messagesStore.addGroupMembers(fromUser, request.getGroupId(), request.getAddedMemberList());
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.AddGroupMemberRequest request, Qos1PublishHandler.IMCallback callback) {
ErrorCode errorCode = m_messagesStore.addGroupMembers(fromUser, isAdmin, request.getGroupId(), request.getAddedMemberList());
if (errorCode == ERROR_CODE_SUCCESS) {
if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent());
} else {
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(fromUser, null, getMemberIdList(request.getAddedMemberList())).getAddGroupNotifyContent();
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, getMemberIdList(request.getAddedMemberList())).getAddGroupNotifyContent();
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), content);
}
}
@@ -11,15 +11,15 @@ package io.moquette.imhandler;
import cn.wildfirechat.proto.WFCMessage;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import static win.liyufan.im.ErrorCode.ERROR_CODE_SUCCESS;
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS;
@Handler(IMTopic.BlackListUserTopic)
public class BlackListRequestHandler extends GroupHandler<WFCMessage.BlackUserRequest> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, WFCMessage.BlackUserRequest request, Qos1PublishHandler.IMCallback callback) {
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.BlackUserRequest request, Qos1PublishHandler.IMCallback callback) {
long[] head = new long[1];
ErrorCode errorCode = m_messagesStore.blackUserRequest(fromUser, request.getUid(), request.getStatus(), head);
if (errorCode == ERROR_CODE_SUCCESS) {
@@ -0,0 +1,49 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package io.moquette.imhandler;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.proto.ProtoConstants;
import cn.wildfirechat.proto.WFCMessage;
import com.hazelcast.util.StringUtil;
import io.moquette.BrokerConstants;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import win.liyufan.im.IMTopic;
import win.liyufan.im.MessageShardingUtil;
import java.util.Set;
import static cn.wildfirechat.proto.ProtoConstants.ContentType.Text;
@Handler(value = IMTopic.BroadcastMessageTopic)
public class BroadcastMessageHandler extends IMHandler<WFCMessage.Message> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.Message message, Qos1PublishHandler.IMCallback callback) {
ErrorCode errorCode = ErrorCode.ERROR_CODE_SUCCESS;
if (message != null) {
if (!isAdmin) { //only admin can broadcast message
return ErrorCode.ERROR_CODE_NOT_RIGHT;
}
long timestamp = System.currentTimeMillis();
long messageId = MessageShardingUtil.generateId();
message = message.toBuilder().setFromUser(fromUser).setMessageId(messageId).setServerTimestamp(timestamp).setConversation(WFCMessage.Conversation.newBuilder().setTarget(fromUser).setLine(message.getConversation().getLine()).setType(ProtoConstants.ConversationType.ConversationType_Private).build()).build();
long count = saveAndBroadcast(fromUser, clientID, message);
ackPayload = ackPayload.capacity(20);
ackPayload.writeLong(messageId);
ackPayload.writeLong(count);
} else {
errorCode = ErrorCode.ERROR_CODE_INVALID_MESSAGE;
}
return errorCode;
}
}
@@ -9,13 +9,11 @@
package io.moquette.imhandler;
import cn.wildfirechat.proto.WFCMessage;
import com.xiaoleilu.loServer.pojos.GroupNotificationBinaryContent;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import static win.liyufan.im.ErrorCode.ERROR_CODE_SUCCESS;
import static win.liyufan.im.IMTopic.PutUserSettingTopic;
import static win.liyufan.im.UserSettingScope.kUserSettingListenedChannels;
@@ -23,11 +21,11 @@ import static win.liyufan.im.UserSettingScope.kUserSettingListenedChannels;
public class ChannelListenMember extends IMHandler<WFCMessage.ListenChannel> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, WFCMessage.ListenChannel request, Qos1PublishHandler.IMCallback callback) {
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.ListenChannel request, Qos1PublishHandler.IMCallback callback) {
ErrorCode errorCode = m_messagesStore.listenChannel(fromUser, request.getChannelId(), request.getListen()>0);
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
WFCMessage.ModifyUserSettingReq modifyUserSettingReq = WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingListenedChannels).setKey(request.getChannelId()).setValue(request.getListen() > 0 ? "1" : "0").build();
mServer.internalRpcMsg(fromUser, null, modifyUserSettingReq.toByteArray(), 0, fromUser, PutUserSettingTopic);
mServer.internalRpcMsg(fromUser, null, modifyUserSettingReq.toByteArray(), 0, fromUser, PutUserSettingTopic, false);
publisher.notifyChannelListenStatusChanged(m_messagesStore.getChannelInfo(request.getChannelId()), fromUser, request.getListen() > 0);
}
@@ -11,7 +11,7 @@ package io.moquette.imhandler;
import cn.wildfirechat.proto.WFCMessage;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import java.util.List;
@@ -19,7 +19,7 @@ import java.util.List;
@Handler(IMTopic.ChannelSearchTopic)
public class ChannelSearchHandler extends IMHandler<WFCMessage.SearchUserRequest> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, WFCMessage.SearchUserRequest request, Qos1PublishHandler.IMCallback callback) {
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.SearchUserRequest request, Qos1PublishHandler.IMCallback callback) {
List<WFCMessage.ChannelInfo> users = m_messagesStore.searchChannel(request.getKeyword(), request.getFuzzy() > 0, request.getPage());
WFCMessage.SearchChannelResult.Builder builder = WFCMessage.SearchChannelResult.newBuilder();
builder.addAllChannel(users);
@@ -10,22 +10,18 @@ package io.moquette.imhandler;
import cn.wildfirechat.proto.WFCMessage;
import com.hazelcast.util.StringUtil;
import com.xiaoleilu.loServer.pojos.GroupNotificationBinaryContent;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import win.liyufan.im.ErrorCode;
import win.liyufan.im.IDUtils;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import win.liyufan.im.UUIDGenerator;
import static win.liyufan.im.IMTopic.PutUserSettingTopic;
import static win.liyufan.im.UserSettingScope.kUserSettingListenedChannels;
import static win.liyufan.im.UserSettingScope.kUserSettingMyChannels;
@Handler(value = IMTopic.CreateChannelTopic)
public class CreateChannelHandler extends GroupHandler<WFCMessage.ChannelInfo> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, WFCMessage.ChannelInfo request, Qos1PublishHandler.IMCallback callback) {
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.ChannelInfo request, Qos1PublishHandler.IMCallback callback) {
WFCMessage.ChannelInfo.Builder builder = request.toBuilder();
if (StringUtil.isNullOrEmpty(request.getTargetId())) {
builder.setTargetId(m_messagesStore.getShortUUID());
@@ -44,7 +40,7 @@ public class CreateChannelHandler extends GroupHandler<WFCMessage.ChannelInfo> {
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
WFCMessage.ModifyUserSettingReq modifyUserSettingReq = WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingMyChannels).setKey(request.getTargetId()).setValue("1").build();
mServer.internalRpcMsg(fromUser, null, modifyUserSettingReq.toByteArray(), 0, fromUser, PutUserSettingTopic);
mServer.internalRpcMsg(fromUser, null, modifyUserSettingReq.toByteArray(), 0, fromUser, PutUserSettingTopic, false);
byte[] data = request.getTargetId().getBytes();
ackPayload.ensureWritable(data.length).writeBytes(data);
return ErrorCode.ERROR_CODE_SUCCESS;
@@ -9,25 +9,30 @@
package io.moquette.imhandler;
import cn.wildfirechat.proto.WFCMessage;
import com.google.protobuf.InvalidProtocolBufferException;
import com.xiaoleilu.loServer.pojos.GroupNotificationBinaryContent;
import cn.wildfirechat.pojos.GroupNotificationBinaryContent;
import com.hazelcast.util.StringUtil;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import static io.moquette.BrokerConstants.MESSAGE_CONTENT_TYPE_CREATE_GROUP;
@Handler(value = IMTopic.CreateGroupTopic)
public class CreateGroupHandler extends GroupHandler<WFCMessage.CreateGroupRequest> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, WFCMessage.CreateGroupRequest request, Qos1PublishHandler.IMCallback callback) {
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.CreateGroupRequest request, Qos1PublishHandler.IMCallback callback) {
if (!StringUtil.isNullOrEmpty(request.getGroup().getGroupInfo().getTargetId())) {
WFCMessage.GroupInfo existGroupInfo = m_messagesStore.getGroupInfo(request.getGroup().getGroupInfo().getTargetId());
if (existGroupInfo != null) {
return ErrorCode.ERROR_CODE_GROUP_ALREADY_EXIST;
}
}
WFCMessage.GroupInfo groupInfo = m_messagesStore.createGroup(fromUser, request.getGroup().getGroupInfo(), request.getGroup().getMembersList());
if (groupInfo != null) {
if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
sendGroupNotification(fromUser, groupInfo.getTargetId(), request.getToLineList(), request.getNotifyContent());
} else {
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(fromUser, groupInfo.getName(), "").getCreateGroupNotifyContent();
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(groupInfo.getTargetId(), fromUser, groupInfo.getName(), "").getCreateGroupNotifyContent();
sendGroupNotification(fromUser, groupInfo.getTargetId(), request.getToLineList(), content);
}
}
@@ -11,13 +11,13 @@ package io.moquette.imhandler;
import cn.wildfirechat.proto.WFCMessage;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
@Handler(IMTopic.DeleteFriendTopic)
public class DeleteFriendHandler extends IMHandler<WFCMessage.IDBuf> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, WFCMessage.IDBuf request, Qos1PublishHandler.IMCallback callback) {
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.IDBuf request, Qos1PublishHandler.IMCallback callback) {
return m_messagesStore.deleteFriend(fromUser, request.getId());
}
}
@@ -10,33 +10,33 @@ package io.moquette.imhandler;
import cn.wildfirechat.proto.ProtoConstants;
import cn.wildfirechat.proto.WFCMessage;
import com.xiaoleilu.loServer.pojos.GroupNotificationBinaryContent;
import cn.wildfirechat.pojos.GroupNotificationBinaryContent;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import static win.liyufan.im.IMTopic.DismissGroupTopic;
@Handler(value = DismissGroupTopic)
public class DismissGroupHandler extends GroupHandler<WFCMessage.DismissGroupRequest> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, WFCMessage.DismissGroupRequest request, Qos1PublishHandler.IMCallback callback) {
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.DismissGroupRequest request, Qos1PublishHandler.IMCallback callback) {
WFCMessage.GroupInfo groupInfo = m_messagesStore.getGroupInfo(request.getGroupId());
ErrorCode errorCode;
if (groupInfo == null) {
errorCode = m_messagesStore.dismissGroup(fromUser, request.getGroupId());
errorCode = m_messagesStore.dismissGroup(fromUser, request.getGroupId(), isAdmin);
} else if ((groupInfo.getType() == ProtoConstants.GroupType.GroupType_Normal || groupInfo.getType() == ProtoConstants.GroupType.GroupType_Restricted)
} else if (isAdmin || (groupInfo.getType() == ProtoConstants.GroupType.GroupType_Normal || groupInfo.getType() == ProtoConstants.GroupType.GroupType_Restricted)
&& groupInfo.getOwner() != null && groupInfo.getOwner().equals(fromUser)) {
//send notify message first, then dismiss group
if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
sendGroupNotification(fromUser, groupInfo.getTargetId(), request.getToLineList(), request.getNotifyContent());
} else {
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(fromUser, null, "").getDismissGroupNotifyContent();
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(groupInfo.getTargetId(), fromUser, null, "").getDismissGroupNotifyContent();
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), content);
}
errorCode = m_messagesStore.dismissGroup(fromUser, request.getGroupId());
errorCode = m_messagesStore.dismissGroup(fromUser, request.getGroupId(), isAdmin);
} else {
errorCode = ErrorCode.ERROR_CODE_NOT_RIGHT;
}
@@ -11,7 +11,7 @@ package io.moquette.imhandler;
import cn.wildfirechat.proto.WFCMessage;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import static win.liyufan.im.IMTopic.PutUserSettingTopic;
@@ -20,11 +20,11 @@ import static win.liyufan.im.UserSettingScope.kUserSettingMyChannels;
@Handler(value = IMTopic.DestoryChannelInfoTopic)
public class DistoryChannelHandler extends GroupHandler<WFCMessage.IDBuf> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, WFCMessage.IDBuf request, Qos1PublishHandler.IMCallback callback) {
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.IDBuf request, Qos1PublishHandler.IMCallback callback) {
ErrorCode errorCode = m_messagesStore.distoryChannel(fromUser, request.getId());
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
WFCMessage.ModifyUserSettingReq modifyUserSettingReq = WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingMyChannels).setKey(request.getId()).setValue("0").build();
mServer.internalRpcMsg(fromUser, null, modifyUserSettingReq.toByteArray(), 0, fromUser, PutUserSettingTopic);
mServer.internalRpcMsg(fromUser, null, modifyUserSettingReq.toByteArray(), 0, fromUser, PutUserSettingTopic, false);
}
return errorCode;
}
@@ -12,7 +12,7 @@ import cn.wildfirechat.proto.WFCMessage;
import com.xiaoleilu.loServer.model.FriendData;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import java.util.List;
@@ -20,12 +20,12 @@ import java.util.List;
@Handler(IMTopic.FriendPullTopic)
public class FriendPullHandler extends IMHandler<WFCMessage.Version> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, WFCMessage.Version request, Qos1PublishHandler.IMCallback callback) {
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.Version request, Qos1PublishHandler.IMCallback callback) {
List<FriendData> friendDatas = m_messagesStore.getFriendList(fromUser, request.getVersion());
WFCMessage.GetFriendsResult.Builder builder = WFCMessage.GetFriendsResult.newBuilder();
for (FriendData data : friendDatas
) {
builder.addEntry(WFCMessage.Friend.newBuilder().setState(data.getState()).setUid(data.getFriendUid()).setUpdateDt(data.getTimestamp()).build());
builder.addEntry(WFCMessage.Friend.newBuilder().setState(data.getState()).setUid(data.getFriendUid()).setUpdateDt(data.getTimestamp()).setAlias(data.getAlias()).build());
}
byte[] data = builder.build().toByteArray();
ackPayload.ensureWritable(data.length).writeBytes(data);
@@ -11,7 +11,7 @@ package io.moquette.imhandler;
import cn.wildfirechat.proto.WFCMessage;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import java.util.List;
@@ -19,7 +19,7 @@ import java.util.List;
@Handler(IMTopic.FriendRequestPullTopic)
public class FriendRequestPullHandler extends IMHandler<WFCMessage.Version> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, WFCMessage.Version request, Qos1PublishHandler.IMCallback callback) {
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.Version request, Qos1PublishHandler.IMCallback callback) {
List<WFCMessage.FriendRequest> friendDatas = m_messagesStore.getFriendRequestList(fromUser, request.getVersion());
WFCMessage.GetFriendRequestResult.Builder builder = WFCMessage.GetFriendRequestResult.newBuilder();
builder.addAllEntry(friendDatas);
@@ -11,13 +11,13 @@ package io.moquette.imhandler;
import cn.wildfirechat.proto.WFCMessage;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
@Handler(IMTopic.ChannelPullTopic)
public class GetChannelInfoHandler extends IMHandler<WFCMessage.PullChannelInfo> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, WFCMessage.PullChannelInfo request, Qos1PublishHandler.IMCallback callback) {
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.PullChannelInfo request, Qos1PublishHandler.IMCallback callback) {
ErrorCode errorCode = ErrorCode.ERROR_CODE_SUCCESS;
WFCMessage.ChannelInfo info = m_messagesStore.getChannelInfo(request.getChannelId());
if (info == null) {
@@ -11,13 +11,13 @@ package io.moquette.imhandler;
import cn.wildfirechat.proto.WFCMessage;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
@Handler(IMTopic.GetChatroomInfoTopic)
public class GetChatroomInfoHandler extends IMHandler<WFCMessage.GetChatroomInfoRequest> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, WFCMessage.GetChatroomInfoRequest request, Qos1PublishHandler.IMCallback callback) {
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.GetChatroomInfoRequest request, Qos1PublishHandler.IMCallback callback) {
ErrorCode errorCode = ErrorCode.ERROR_CODE_SUCCESS;
WFCMessage.ChatroomInfo info = m_messagesStore.getChatroomInfo(request.getChatroomId());
if (info == null) {
@@ -11,13 +11,13 @@ package io.moquette.imhandler;
import cn.wildfirechat.proto.WFCMessage;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
@Handler(IMTopic.GetChatroomMemberTopic)
public class GetChatroomMemberHandler extends IMHandler<WFCMessage.GetChatroomMemberInfoRequest> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, WFCMessage.GetChatroomMemberInfoRequest request, Qos1PublishHandler.IMCallback callback) {
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.GetChatroomMemberInfoRequest request, Qos1PublishHandler.IMCallback callback) {
ErrorCode errorCode = ErrorCode.ERROR_CODE_SUCCESS;
WFCMessage.ChatroomMemberInfo info = m_messagesStore.getChatroomMemberInfo(request.getChatroomId(), request.getMaxCount());
if (info != null) {
@@ -11,7 +11,7 @@ package io.moquette.imhandler;
import cn.wildfirechat.proto.WFCMessage;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import java.util.List;
@@ -19,7 +19,7 @@ import java.util.List;
@Handler(IMTopic.GetGroupInfoTopic)
public class GetGroupInfoHandler extends IMHandler<WFCMessage.PullUserRequest> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, WFCMessage.PullUserRequest request, Qos1PublishHandler.IMCallback callback) {
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.PullUserRequest request, Qos1PublishHandler.IMCallback callback) {
List<WFCMessage.GroupInfo> infos = m_messagesStore.getGroupInfos(request.getRequestList());
WFCMessage.PullGroupInfoResult result = WFCMessage.PullGroupInfoResult.newBuilder().addAllInfo(infos).build();
@@ -11,18 +11,18 @@ package io.moquette.imhandler;
import cn.wildfirechat.proto.WFCMessage;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import java.util.ArrayList;
import java.util.List;
import static win.liyufan.im.ErrorCode.ERROR_CODE_SUCCESS;
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS;
@Handler(IMTopic.GetGroupMemberTopic)
public class GetGroupMemberHandler extends IMHandler<WFCMessage.PullGroupMemberRequest> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, WFCMessage.PullGroupMemberRequest request, Qos1PublishHandler.IMCallback callback) {
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.PullGroupMemberRequest request, Qos1PublishHandler.IMCallback callback) {
List<WFCMessage.GroupMember> members = new ArrayList<>();
ErrorCode errorCode = m_messagesStore.getGroupMembers(request.getTarget(), request.getHead(), members);
@@ -14,13 +14,13 @@ import com.xiaoleilu.loServer.action.UploadFileAction;
import io.moquette.server.config.MediaServerConfig;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
@Handler(IMTopic.GetQiniuUploadTokenTopic)
public class GetQiniuUploadTokenHandler extends IMHandler<Byte> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, Byte request, Qos1PublishHandler.IMCallback callback) {
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, Byte request, Qos1PublishHandler.IMCallback callback) {
int type = request;
String token;
@@ -76,10 +76,12 @@ public class GetQiniuUploadTokenHandler extends IMHandler<Byte> {
token = auth.uploadToken(bucketName);
resultBuilder.setDomain(bucketDomain)
.setServer(MediaServerConfig.QINIU_SERVER_URL);
resultBuilder.setPort(80);
} else {
token = UploadFileAction.getToken(type);
resultBuilder.setDomain("http://" + MediaServerConfig.SERVER_IP + ":" + MediaServerConfig.HTTP_SERVER_PORT)
.setServer(MediaServerConfig.SERVER_IP);
resultBuilder.setPort(MediaServerConfig.HTTP_SERVER_PORT);
}
resultBuilder.setToken(token);
@@ -13,13 +13,13 @@ import io.moquette.persistence.MemorySessionStore;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.moquette.spi.impl.security.TokenAuthenticator;
import io.netty.buffer.ByteBuf;
import win.liyufan.im.ErrorCode;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
@Handler(IMTopic.GetTokenTopic)
public class GetTokenHandler extends IMHandler<WFCMessage.GetTokenRequest> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, WFCMessage.GetTokenRequest request, Qos1PublishHandler.IMCallback callback) {
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.GetTokenRequest request, Qos1PublishHandler.IMCallback callback) {
MemorySessionStore.Session session = m_sessionsStore.createUserSession(fromUser, clientID);
TokenAuthenticator authenticator = new TokenAuthenticator();
String strToken = authenticator.generateToken(fromUser);

Some files were not shown because too many files have changed in this diff Show More