From 84eb3a98625f714672f2ecb8b95f1bc40895cacc Mon Sep 17 00:00:00 2001 From: rekoe Date: Mon, 21 Mar 2016 18:14:32 +0800 Subject: [PATCH] add --- README.md | 5 + apidoc.json | 7 + pom.xml | 319 +++++++++++++ .../com/rekoe/annotation/PermissionTag.java | 21 + .../rekoe/annotation/PlatformProvider.java | 17 + .../cms/socialauth/AbstractOAuthProvider.java | 165 +++++++ .../cms/socialauth/qq/QQAuthProvider.java | 92 ++++ .../qqweibo/QQWeiboAuthProvider.java | 126 ++++++ src/main/java/com/rekoe/common/AppleVO.java | 28 ++ src/main/java/com/rekoe/common/GooglePVO.java | 37 ++ src/main/java/com/rekoe/common/GoogleVO.java | 102 +++++ src/main/java/com/rekoe/common/Message.java | 56 +++ src/main/java/com/rekoe/common/PackageVO.java | 34 ++ .../java/com/rekoe/common/PlatformVO.java | 33 ++ .../java/com/rekoe/common/page/Paginable.java | 62 +++ .../com/rekoe/common/page/Pagination.java | 80 ++++ .../com/rekoe/common/page/SimplePage.java | 181 ++++++++ src/main/java/com/rekoe/domain/AuthType.java | 16 + .../java/com/rekoe/domain/CdkeyCategory.java | 64 +++ .../java/com/rekoe/domain/CdkeyEntity.java | 63 +++ src/main/java/com/rekoe/domain/CdkeyLog.java | 88 ++++ .../java/com/rekoe/domain/GameServer.java | 222 +++++++++ src/main/java/com/rekoe/domain/Notice.java | 138 ++++++ .../java/com/rekoe/domain/OAuthClient.java | 64 +++ src/main/java/com/rekoe/domain/OAuthUser.java | 135 ++++++ .../java/com/rekoe/domain/OfficialServer.java | 120 +++++ src/main/java/com/rekoe/domain/PayRefund.java | 111 +++++ .../java/com/rekoe/domain/Permission.java | 124 +++++ .../com/rekoe/domain/PermissionCategory.java | 59 +++ .../java/com/rekoe/domain/PlatformConfig.java | 90 ++++ .../java/com/rekoe/domain/PlatformUser.java | 138 ++++++ src/main/java/com/rekoe/domain/ReportAds.java | 104 +++++ src/main/java/com/rekoe/domain/Role.java | 101 +++++ .../java/com/rekoe/domain/ServerHistory.java | 102 +++++ src/main/java/com/rekoe/domain/User.java | 172 +++++++ .../java/com/rekoe/domain/VerifyServer.java | 111 +++++ .../exception/CreateUserSaltException.java | 29 ++ .../exception/IncorrectCaptchaException.java | 29 ++ .../filter/AbstractCrossOriginFilter.java | 28 ++ .../rekoe/filter/AuthenticationFilter.java | 34 ++ .../filter/ChectServerExitsActionFilter.java | 57 +++ src/main/java/com/rekoe/filter/IPFilter.java | 120 +++++ .../rekoe/filter/OauthCrossOriginFilter.java | 19 + .../filter/SelectServerActionFilter.java | 46 ++ .../filter/ServerPermisionActionFilter.java | 75 ++++ .../java/com/rekoe/mobile/AbstractParam.java | 8 + .../java/com/rekoe/mobile/AuthProvider.java | 11 + src/main/java/com/rekoe/mobile/Profile.java | 64 +++ .../mobile/exception/SignatureException.java | 56 +++ .../SocialAuthConfigurationException.java | 57 +++ .../mobile/exception/SocialAuthException.java | 56 +++ .../SocialAuthManagerStateException.java | 41 ++ .../mobile/provider/AbstractProvider.java | 199 ++++++++ .../mobile/provider/PlatformProvider.java | 27 ++ .../provider/PlatformProviderFactory.java | 32 ++ .../rekoe/mobile/provider/a91/A91Param.java | 40 ++ .../mobile/provider/a91/A91Provider.java | 58 +++ .../mobile/provider/a91/A91ReturnParam.java | 53 +++ .../mobile/provider/a91/A91UserInfo.java | 14 + .../mobile/provider/google/GoogleParam.java | 16 + .../provider/google/GoogleProvider.java | 20 + .../mobile/provider/googlep/GooglePParam.java | 41 ++ .../provider/googlep/GooglePProvider.java | 141 ++++++ .../mobile/provider/googlep/TokenStatus.java | 43 ++ .../mobile/provider/guest/GuestParam.java | 45 ++ .../mobile/provider/guest/GuestProvider.java | 26 ++ .../com/rekoe/mobile/provider/hw/HwParam.java | 39 ++ .../rekoe/mobile/provider/hw/HwProvider.java | 61 +++ .../rekoe/mobile/provider/hw/UserInfo.java | 84 ++++ .../rekoe/mobile/provider/msdk/MSDKParam.java | 45 ++ .../mobile/provider/msdk/MSDKProvider.java | 84 ++++ .../mobile/provider/msdk/MSDKUserInfo.java | 204 +++++++++ .../mobile/provider/qihu360/QiHu360Param.java | 40 ++ .../provider/qihu360/QiHu360Provider.java | 44 ++ .../com/rekoe/mobile/provider/qq/QQParam.java | 64 +++ .../rekoe/mobile/provider/qq/QQProvider.java | 85 ++++ .../rekoe/mobile/provider/qq/QQUserInfo.java | 208 +++++++++ .../com/rekoe/mobile/provider/rk/RKParam.java | 40 ++ .../rekoe/mobile/provider/rk/RKProvider.java | 73 +++ .../com/rekoe/mobile/provider/sg/SGParam.java | 45 ++ .../rekoe/mobile/provider/sg/SGProvider.java | 26 ++ .../rekoe/mobile/provider/uc/UCResponse.java | 28 ++ .../mobile/provider/uc/UCResponseData.java | 22 + .../mobile/provider/uc/UCResponseState.java | 24 + .../com/rekoe/mobile/provider/uc/UcParam.java | 43 ++ .../rekoe/mobile/provider/uc/UcProvider.java | 108 +++++ .../mobile/provider/xiaomi/XiaoMiParam.java | 55 +++ .../provider/xiaomi/XiaoMiProvider.java | 59 +++ .../com/rekoe/module/AccessTokenModule.java | 117 +++++ .../com/rekoe/module/AuthorizeAction.java | 149 ++++++ .../java/com/rekoe/module/BaseAction.java | 127 ++++++ src/main/java/com/rekoe/module/CdkeyBean.java | 63 +++ .../java/com/rekoe/module/ExchargeAction.java | 70 +++ src/main/java/com/rekoe/module/IndexAct.java | 28 ++ .../java/com/rekoe/module/IpSearchAction.java | 22 + .../java/com/rekoe/module/NoticeModule.java | 78 ++++ .../com/rekoe/module/OAuthUserAction.java | 324 ++++++++++++++ .../java/com/rekoe/module/OauthLoginAct.java | 146 ++++++ .../com/rekoe/module/ReportAdsModule.java | 49 ++ src/main/java/com/rekoe/module/Status.java | 28 ++ src/main/java/com/rekoe/module/Test.java | 67 +++ .../java/com/rekoe/module/UserInfoAction.java | 124 +++++ .../rekoe/module/admin/AdminAccountAct.java | 48 ++ .../module/admin/AdminCdKeyCategoryAct.java | 107 +++++ .../rekoe/module/admin/AdminCommonAct.java | 40 ++ .../module/admin/AdminGameServerAct.java | 165 +++++++ .../com/rekoe/module/admin/AdminLoginAct.java | 82 ++++ .../rekoe/module/admin/AdminNoticeAct.java | 149 ++++++ .../module/admin/AdminOauthClientAct.java | 87 ++++ .../rekoe/module/admin/AdminOauthUserAct.java | 52 +++ .../rekoe/module/admin/AdminOfficialAct.java | 128 ++++++ .../admin/AdminPlatformConfigAction.java | 185 ++++++++ .../rekoe/module/admin/AdminReportAdsAct.java | 48 ++ .../com/rekoe/module/admin/AdminRoleAct.java | 117 +++++ .../com/rekoe/module/admin/AdminUserAct.java | 308 +++++++++++++ .../rekoe/module/admin/AdminVerifyAct.java | 91 ++++ .../java/com/rekoe/module/admin/FrameAct.java | 207 +++++++++ .../com/rekoe/module/admin/PayRefundAct.java | 152 +++++++ .../com/rekoe/module/admin/PermissionAct.java | 110 +++++ .../module/admin/PermissionCategoryAct.java | 86 ++++ .../com/rekoe/module/admin/WelcomeAct.java | 58 +++ .../module/facebook/FaceBookLoginAct.java | 179 ++++++++ .../facebook/FacebookSignedRequest.java | 125 ++++++ .../com/rekoe/module/facebook/ReFund.java | 38 ++ .../com/rekoe/module/facebook/pay/Action.java | 62 +++ .../module/facebook/pay/Application.java | 32 ++ .../rekoe/module/facebook/pay/Dispute.java | 55 +++ .../com/rekoe/module/facebook/pay/Entry.java | 37 ++ .../com/rekoe/module/facebook/pay/Error.java | 15 + .../rekoe/module/facebook/pay/ErrorInfo.java | 33 ++ .../facebook/pay/FacebookRequestResult.java | 17 + .../com/rekoe/module/facebook/pay/Items.java | 33 ++ .../com/rekoe/module/facebook/pay/Order.java | 121 +++++ .../rekoe/module/facebook/pay/PayObject.java | 30 ++ .../module/facebook/pay/PlatformUser.java | 24 + .../module/facebook/pay/RefundableAmount.java | 23 + .../com/rekoe/mvc/ProcessTimeProcessor.java | 29 ++ .../java/com/rekoe/mvc/RkCmsNutFilter.java | 42 ++ src/main/java/com/rekoe/mvc/mvc-chains.js | 16 + .../java/com/rekoe/mvc/view/DataDownView.java | 26 ++ .../com/rekoe/mvc/view/DataDownViewMaker.java | 16 + .../java/com/rekoe/service/BaseService.java | 155 +++++++ .../rekoe/service/CdKeyCategoryService.java | 81 ++++ .../com/rekoe/service/CdKeyLogService.java | 19 + .../java/com/rekoe/service/CdKeyService.java | 197 ++++++++ .../java/com/rekoe/service/EmailService.java | 7 + .../com/rekoe/service/EmailServiceImpl.java | 31 ++ .../com/rekoe/service/GameServerService.java | 179 ++++++++ .../com/rekoe/service/IdWorkerService.java | 114 +++++ .../java/com/rekoe/service/NoticeService.java | 56 +++ .../com/rekoe/service/OAuthClientService.java | 27 ++ .../java/com/rekoe/service/OAuthService.java | 28 ++ .../com/rekoe/service/OAuthServiceImpl.java | 59 +++ .../com/rekoe/service/OAuthUserService.java | 61 +++ .../rekoe/service/OAuthUserServiceImpl.java | 120 +++++ .../rekoe/service/OauthClientServiceImpl.java | 62 +++ .../rekoe/service/OfficialServerService.java | 84 ++++ .../com/rekoe/service/PasswordHelper.java | 51 +++ .../com/rekoe/service/PayFefundService.java | 247 ++++++++++ .../service/PermissionCategoryService.java | 71 +++ .../com/rekoe/service/PermissionService.java | 75 ++++ .../rekoe/service/PlatformConfigService.java | 40 ++ .../service/PlatformProviderService.java | 41 ++ .../rekoe/service/PlatformUserService.java | 43 ++ .../java/com/rekoe/service/QuartzService.java | 51 +++ .../com/rekoe/service/ReportAdsService.java | 30 ++ .../java/com/rekoe/service/RoleService.java | 101 +++++ .../rekoe/service/ServerHistoryService.java | 71 +++ .../java/com/rekoe/service/UploadService.java | 49 ++ .../java/com/rekoe/service/UserService.java | 323 +++++++++++++ .../rekoe/service/VerifyServerService.java | 29 ++ .../shiro/ModularRealmAuthenticator2.java | 73 +++ .../com/rekoe/shiro/RKSessionIdGenerator.java | 21 + .../authc/pam/AnySuccessfulStrategy.java | 86 ++++ .../shiro/freemarker/AuthenticatedTag.java | 47 ++ .../com/rekoe/shiro/freemarker/GuestTag.java | 47 ++ .../shiro/freemarker/HasAnyPermissionTag.java | 32 ++ .../shiro/freemarker/HasAnyRolesTag.java | 51 +++ .../shiro/freemarker/HasPermissionTag.java | 13 + .../rekoe/shiro/freemarker/HasRoleTag.java | 11 + .../shiro/freemarker/LacksPermissionTag.java | 11 + .../rekoe/shiro/freemarker/LacksRoleTag.java | 12 + .../shiro/freemarker/NotAuthenticatedTag.java | 35 ++ .../rekoe/shiro/freemarker/PermissionTag.java | 61 +++ .../rekoe/shiro/freemarker/PrincipalTag.java | 123 +++++ .../com/rekoe/shiro/freemarker/RoleTag.java | 29 ++ .../com/rekoe/shiro/freemarker/SecureTag.java | 54 +++ .../com/rekoe/shiro/freemarker/ShiroTags.java | 29 ++ .../com/rekoe/shiro/freemarker/UserTag.java | 40 ++ .../shiro/realm/AbstractNutAuthoRealm.java | 87 ++++ .../java/com/rekoe/shiro/realm/AuthToken.java | 31 ++ .../com/rekoe/shiro/realm/AuthTokenRealm.java | 68 +++ .../rekoe/shiro/realm/NutAuthoDaoRealm.java | 49 ++ .../com/rekoe/shiro/realm/OAuthToken.java | 74 +++ .../shiro/realm/RealmAuthorizationType.java | 6 + .../shiro/realm/UsernamePasswordRealm.java | 55 +++ .../com/rekoe/shiro/web/SimpleCookie.java | 421 +++++++++++++++++ .../java/com/rekoe/utils/CharGenerator.java | 15 + src/main/java/com/rekoe/utils/ClassUtls.java | 50 +++ .../java/com/rekoe/utils/CommonUtils.java | 156 +++++++ src/main/java/com/rekoe/utils/Constants.java | 93 ++++ .../java/com/rekoe/utils/DateTypeEditor.java | 50 +++ .../java/com/rekoe/utils/DirectiveUtils.java | 272 +++++++++++ .../com/rekoe/utils/HmacSHA1Encryption.java | 68 +++ src/main/java/com/rekoe/utils/ParamBean.java | 48 ++ .../java/com/rekoe/utils/ParseHtmlTool.java | 30 ++ src/main/java/com/rekoe/utils/StrUtils.java | 155 +++++++ .../java/com/rekoe/utils/StringGenerator.java | 71 +++ .../java/com/rekoe/utils/SystemContext.java | 115 +++++ .../rekoe/valueadaptor/JsonValueAdaptor.java | 30 ++ .../rekoe/valueadaptor/MapValueAdaptor.java | 31 ++ .../valueadaptor/NutMapValueAdaptor.java | 10 + .../rekoe/valueadaptor/StringJsonAdaptor.java | 10 + .../web/freemarker/CurrentTimeDirective.java | 26 ++ .../web/freemarker/HtmlCutDirective.java | 42 ++ .../web/freemarker/PaginationDirective.java | 62 +++ .../web/freemarker/PermissionDirective.java | 98 ++++ .../freemarker/PermissionShiroFreemarker.java | 96 ++++ .../web/freemarker/PlatformEditDirective.java | 61 +++ .../PlatformPermissionDirective.java | 41 ++ .../web/freemarker/ProcessTimeDirective.java | 53 +++ .../web/freemarker/Sid2NameDirective.java | 38 ++ .../web/freemarker/TimeFormatDirective.java | 38 ++ src/main/resources/conf.properties | 17 + src/main/resources/ehcache.xml | 15 + src/main/resources/init_system_h2.sql | 19 + src/main/resources/ioc/dao.js | 74 +++ src/main/resources/ioc/ehcache.js | 14 + src/main/resources/ioc/freemarker_tags.js | 85 ++++ src/main/resources/ioc/mail.js | 17 + src/main/resources/ioc/upload.js | 33 ++ src/main/resources/log4j.properties | 24 + .../msg/zh_CN/MessageResources.properties | 423 ++++++++++++++++++ src/main/resources/oauth_consumer.properties | 7 + src/main/resources/quartz.properties | 4 + src/main/resources/shiro.ini | 41 ++ 236 files changed, 17518 insertions(+) create mode 100644 README.md create mode 100644 apidoc.json create mode 100644 pom.xml create mode 100644 src/main/java/com/rekoe/annotation/PermissionTag.java create mode 100644 src/main/java/com/rekoe/annotation/PlatformProvider.java create mode 100644 src/main/java/com/rekoe/cms/socialauth/AbstractOAuthProvider.java create mode 100644 src/main/java/com/rekoe/cms/socialauth/qq/QQAuthProvider.java create mode 100644 src/main/java/com/rekoe/cms/socialauth/qqweibo/QQWeiboAuthProvider.java create mode 100644 src/main/java/com/rekoe/common/AppleVO.java create mode 100644 src/main/java/com/rekoe/common/GooglePVO.java create mode 100644 src/main/java/com/rekoe/common/GoogleVO.java create mode 100644 src/main/java/com/rekoe/common/Message.java create mode 100644 src/main/java/com/rekoe/common/PackageVO.java create mode 100644 src/main/java/com/rekoe/common/PlatformVO.java create mode 100644 src/main/java/com/rekoe/common/page/Paginable.java create mode 100644 src/main/java/com/rekoe/common/page/Pagination.java create mode 100644 src/main/java/com/rekoe/common/page/SimplePage.java create mode 100644 src/main/java/com/rekoe/domain/AuthType.java create mode 100644 src/main/java/com/rekoe/domain/CdkeyCategory.java create mode 100644 src/main/java/com/rekoe/domain/CdkeyEntity.java create mode 100644 src/main/java/com/rekoe/domain/CdkeyLog.java create mode 100644 src/main/java/com/rekoe/domain/GameServer.java create mode 100644 src/main/java/com/rekoe/domain/Notice.java create mode 100644 src/main/java/com/rekoe/domain/OAuthClient.java create mode 100644 src/main/java/com/rekoe/domain/OAuthUser.java create mode 100644 src/main/java/com/rekoe/domain/OfficialServer.java create mode 100644 src/main/java/com/rekoe/domain/PayRefund.java create mode 100644 src/main/java/com/rekoe/domain/Permission.java create mode 100644 src/main/java/com/rekoe/domain/PermissionCategory.java create mode 100644 src/main/java/com/rekoe/domain/PlatformConfig.java create mode 100644 src/main/java/com/rekoe/domain/PlatformUser.java create mode 100644 src/main/java/com/rekoe/domain/ReportAds.java create mode 100644 src/main/java/com/rekoe/domain/Role.java create mode 100644 src/main/java/com/rekoe/domain/ServerHistory.java create mode 100644 src/main/java/com/rekoe/domain/User.java create mode 100644 src/main/java/com/rekoe/domain/VerifyServer.java create mode 100644 src/main/java/com/rekoe/exception/CreateUserSaltException.java create mode 100644 src/main/java/com/rekoe/exception/IncorrectCaptchaException.java create mode 100644 src/main/java/com/rekoe/filter/AbstractCrossOriginFilter.java create mode 100644 src/main/java/com/rekoe/filter/AuthenticationFilter.java create mode 100644 src/main/java/com/rekoe/filter/ChectServerExitsActionFilter.java create mode 100644 src/main/java/com/rekoe/filter/IPFilter.java create mode 100644 src/main/java/com/rekoe/filter/OauthCrossOriginFilter.java create mode 100644 src/main/java/com/rekoe/filter/SelectServerActionFilter.java create mode 100644 src/main/java/com/rekoe/filter/ServerPermisionActionFilter.java create mode 100644 src/main/java/com/rekoe/mobile/AbstractParam.java create mode 100644 src/main/java/com/rekoe/mobile/AuthProvider.java create mode 100644 src/main/java/com/rekoe/mobile/Profile.java create mode 100644 src/main/java/com/rekoe/mobile/exception/SignatureException.java create mode 100644 src/main/java/com/rekoe/mobile/exception/SocialAuthConfigurationException.java create mode 100644 src/main/java/com/rekoe/mobile/exception/SocialAuthException.java create mode 100644 src/main/java/com/rekoe/mobile/exception/SocialAuthManagerStateException.java create mode 100644 src/main/java/com/rekoe/mobile/provider/AbstractProvider.java create mode 100644 src/main/java/com/rekoe/mobile/provider/PlatformProvider.java create mode 100644 src/main/java/com/rekoe/mobile/provider/PlatformProviderFactory.java create mode 100644 src/main/java/com/rekoe/mobile/provider/a91/A91Param.java create mode 100644 src/main/java/com/rekoe/mobile/provider/a91/A91Provider.java create mode 100644 src/main/java/com/rekoe/mobile/provider/a91/A91ReturnParam.java create mode 100644 src/main/java/com/rekoe/mobile/provider/a91/A91UserInfo.java create mode 100644 src/main/java/com/rekoe/mobile/provider/google/GoogleParam.java create mode 100644 src/main/java/com/rekoe/mobile/provider/google/GoogleProvider.java create mode 100644 src/main/java/com/rekoe/mobile/provider/googlep/GooglePParam.java create mode 100644 src/main/java/com/rekoe/mobile/provider/googlep/GooglePProvider.java create mode 100644 src/main/java/com/rekoe/mobile/provider/googlep/TokenStatus.java create mode 100644 src/main/java/com/rekoe/mobile/provider/guest/GuestParam.java create mode 100644 src/main/java/com/rekoe/mobile/provider/guest/GuestProvider.java create mode 100644 src/main/java/com/rekoe/mobile/provider/hw/HwParam.java create mode 100644 src/main/java/com/rekoe/mobile/provider/hw/HwProvider.java create mode 100644 src/main/java/com/rekoe/mobile/provider/hw/UserInfo.java create mode 100644 src/main/java/com/rekoe/mobile/provider/msdk/MSDKParam.java create mode 100644 src/main/java/com/rekoe/mobile/provider/msdk/MSDKProvider.java create mode 100644 src/main/java/com/rekoe/mobile/provider/msdk/MSDKUserInfo.java create mode 100644 src/main/java/com/rekoe/mobile/provider/qihu360/QiHu360Param.java create mode 100644 src/main/java/com/rekoe/mobile/provider/qihu360/QiHu360Provider.java create mode 100644 src/main/java/com/rekoe/mobile/provider/qq/QQParam.java create mode 100644 src/main/java/com/rekoe/mobile/provider/qq/QQProvider.java create mode 100644 src/main/java/com/rekoe/mobile/provider/qq/QQUserInfo.java create mode 100644 src/main/java/com/rekoe/mobile/provider/rk/RKParam.java create mode 100644 src/main/java/com/rekoe/mobile/provider/rk/RKProvider.java create mode 100644 src/main/java/com/rekoe/mobile/provider/sg/SGParam.java create mode 100644 src/main/java/com/rekoe/mobile/provider/sg/SGProvider.java create mode 100644 src/main/java/com/rekoe/mobile/provider/uc/UCResponse.java create mode 100644 src/main/java/com/rekoe/mobile/provider/uc/UCResponseData.java create mode 100644 src/main/java/com/rekoe/mobile/provider/uc/UCResponseState.java create mode 100644 src/main/java/com/rekoe/mobile/provider/uc/UcParam.java create mode 100644 src/main/java/com/rekoe/mobile/provider/uc/UcProvider.java create mode 100644 src/main/java/com/rekoe/mobile/provider/xiaomi/XiaoMiParam.java create mode 100644 src/main/java/com/rekoe/mobile/provider/xiaomi/XiaoMiProvider.java create mode 100644 src/main/java/com/rekoe/module/AccessTokenModule.java create mode 100644 src/main/java/com/rekoe/module/AuthorizeAction.java create mode 100644 src/main/java/com/rekoe/module/BaseAction.java create mode 100644 src/main/java/com/rekoe/module/CdkeyBean.java create mode 100644 src/main/java/com/rekoe/module/ExchargeAction.java create mode 100644 src/main/java/com/rekoe/module/IndexAct.java create mode 100644 src/main/java/com/rekoe/module/IpSearchAction.java create mode 100644 src/main/java/com/rekoe/module/NoticeModule.java create mode 100644 src/main/java/com/rekoe/module/OAuthUserAction.java create mode 100644 src/main/java/com/rekoe/module/OauthLoginAct.java create mode 100644 src/main/java/com/rekoe/module/ReportAdsModule.java create mode 100644 src/main/java/com/rekoe/module/Status.java create mode 100644 src/main/java/com/rekoe/module/Test.java create mode 100644 src/main/java/com/rekoe/module/UserInfoAction.java create mode 100644 src/main/java/com/rekoe/module/admin/AdminAccountAct.java create mode 100644 src/main/java/com/rekoe/module/admin/AdminCdKeyCategoryAct.java create mode 100644 src/main/java/com/rekoe/module/admin/AdminCommonAct.java create mode 100644 src/main/java/com/rekoe/module/admin/AdminGameServerAct.java create mode 100644 src/main/java/com/rekoe/module/admin/AdminLoginAct.java create mode 100644 src/main/java/com/rekoe/module/admin/AdminNoticeAct.java create mode 100644 src/main/java/com/rekoe/module/admin/AdminOauthClientAct.java create mode 100644 src/main/java/com/rekoe/module/admin/AdminOauthUserAct.java create mode 100644 src/main/java/com/rekoe/module/admin/AdminOfficialAct.java create mode 100644 src/main/java/com/rekoe/module/admin/AdminPlatformConfigAction.java create mode 100644 src/main/java/com/rekoe/module/admin/AdminReportAdsAct.java create mode 100644 src/main/java/com/rekoe/module/admin/AdminRoleAct.java create mode 100644 src/main/java/com/rekoe/module/admin/AdminUserAct.java create mode 100644 src/main/java/com/rekoe/module/admin/AdminVerifyAct.java create mode 100644 src/main/java/com/rekoe/module/admin/FrameAct.java create mode 100644 src/main/java/com/rekoe/module/admin/PayRefundAct.java create mode 100644 src/main/java/com/rekoe/module/admin/PermissionAct.java create mode 100644 src/main/java/com/rekoe/module/admin/PermissionCategoryAct.java create mode 100644 src/main/java/com/rekoe/module/admin/WelcomeAct.java create mode 100644 src/main/java/com/rekoe/module/facebook/FaceBookLoginAct.java create mode 100644 src/main/java/com/rekoe/module/facebook/FacebookSignedRequest.java create mode 100644 src/main/java/com/rekoe/module/facebook/ReFund.java create mode 100644 src/main/java/com/rekoe/module/facebook/pay/Action.java create mode 100644 src/main/java/com/rekoe/module/facebook/pay/Application.java create mode 100644 src/main/java/com/rekoe/module/facebook/pay/Dispute.java create mode 100644 src/main/java/com/rekoe/module/facebook/pay/Entry.java create mode 100644 src/main/java/com/rekoe/module/facebook/pay/Error.java create mode 100644 src/main/java/com/rekoe/module/facebook/pay/ErrorInfo.java create mode 100644 src/main/java/com/rekoe/module/facebook/pay/FacebookRequestResult.java create mode 100644 src/main/java/com/rekoe/module/facebook/pay/Items.java create mode 100644 src/main/java/com/rekoe/module/facebook/pay/Order.java create mode 100644 src/main/java/com/rekoe/module/facebook/pay/PayObject.java create mode 100644 src/main/java/com/rekoe/module/facebook/pay/PlatformUser.java create mode 100644 src/main/java/com/rekoe/module/facebook/pay/RefundableAmount.java create mode 100644 src/main/java/com/rekoe/mvc/ProcessTimeProcessor.java create mode 100644 src/main/java/com/rekoe/mvc/RkCmsNutFilter.java create mode 100644 src/main/java/com/rekoe/mvc/mvc-chains.js create mode 100644 src/main/java/com/rekoe/mvc/view/DataDownView.java create mode 100644 src/main/java/com/rekoe/mvc/view/DataDownViewMaker.java create mode 100644 src/main/java/com/rekoe/service/BaseService.java create mode 100644 src/main/java/com/rekoe/service/CdKeyCategoryService.java create mode 100644 src/main/java/com/rekoe/service/CdKeyLogService.java create mode 100644 src/main/java/com/rekoe/service/CdKeyService.java create mode 100644 src/main/java/com/rekoe/service/EmailService.java create mode 100644 src/main/java/com/rekoe/service/EmailServiceImpl.java create mode 100644 src/main/java/com/rekoe/service/GameServerService.java create mode 100644 src/main/java/com/rekoe/service/IdWorkerService.java create mode 100644 src/main/java/com/rekoe/service/NoticeService.java create mode 100644 src/main/java/com/rekoe/service/OAuthClientService.java create mode 100644 src/main/java/com/rekoe/service/OAuthService.java create mode 100644 src/main/java/com/rekoe/service/OAuthServiceImpl.java create mode 100644 src/main/java/com/rekoe/service/OAuthUserService.java create mode 100644 src/main/java/com/rekoe/service/OAuthUserServiceImpl.java create mode 100644 src/main/java/com/rekoe/service/OauthClientServiceImpl.java create mode 100644 src/main/java/com/rekoe/service/OfficialServerService.java create mode 100644 src/main/java/com/rekoe/service/PasswordHelper.java create mode 100644 src/main/java/com/rekoe/service/PayFefundService.java create mode 100644 src/main/java/com/rekoe/service/PermissionCategoryService.java create mode 100644 src/main/java/com/rekoe/service/PermissionService.java create mode 100644 src/main/java/com/rekoe/service/PlatformConfigService.java create mode 100644 src/main/java/com/rekoe/service/PlatformProviderService.java create mode 100644 src/main/java/com/rekoe/service/PlatformUserService.java create mode 100644 src/main/java/com/rekoe/service/QuartzService.java create mode 100644 src/main/java/com/rekoe/service/ReportAdsService.java create mode 100644 src/main/java/com/rekoe/service/RoleService.java create mode 100644 src/main/java/com/rekoe/service/ServerHistoryService.java create mode 100644 src/main/java/com/rekoe/service/UploadService.java create mode 100644 src/main/java/com/rekoe/service/UserService.java create mode 100644 src/main/java/com/rekoe/service/VerifyServerService.java create mode 100644 src/main/java/com/rekoe/shiro/ModularRealmAuthenticator2.java create mode 100644 src/main/java/com/rekoe/shiro/RKSessionIdGenerator.java create mode 100644 src/main/java/com/rekoe/shiro/authc/pam/AnySuccessfulStrategy.java create mode 100644 src/main/java/com/rekoe/shiro/freemarker/AuthenticatedTag.java create mode 100644 src/main/java/com/rekoe/shiro/freemarker/GuestTag.java create mode 100644 src/main/java/com/rekoe/shiro/freemarker/HasAnyPermissionTag.java create mode 100644 src/main/java/com/rekoe/shiro/freemarker/HasAnyRolesTag.java create mode 100644 src/main/java/com/rekoe/shiro/freemarker/HasPermissionTag.java create mode 100644 src/main/java/com/rekoe/shiro/freemarker/HasRoleTag.java create mode 100644 src/main/java/com/rekoe/shiro/freemarker/LacksPermissionTag.java create mode 100644 src/main/java/com/rekoe/shiro/freemarker/LacksRoleTag.java create mode 100644 src/main/java/com/rekoe/shiro/freemarker/NotAuthenticatedTag.java create mode 100644 src/main/java/com/rekoe/shiro/freemarker/PermissionTag.java create mode 100644 src/main/java/com/rekoe/shiro/freemarker/PrincipalTag.java create mode 100644 src/main/java/com/rekoe/shiro/freemarker/RoleTag.java create mode 100644 src/main/java/com/rekoe/shiro/freemarker/SecureTag.java create mode 100644 src/main/java/com/rekoe/shiro/freemarker/ShiroTags.java create mode 100644 src/main/java/com/rekoe/shiro/freemarker/UserTag.java create mode 100644 src/main/java/com/rekoe/shiro/realm/AbstractNutAuthoRealm.java create mode 100644 src/main/java/com/rekoe/shiro/realm/AuthToken.java create mode 100644 src/main/java/com/rekoe/shiro/realm/AuthTokenRealm.java create mode 100644 src/main/java/com/rekoe/shiro/realm/NutAuthoDaoRealm.java create mode 100644 src/main/java/com/rekoe/shiro/realm/OAuthToken.java create mode 100644 src/main/java/com/rekoe/shiro/realm/RealmAuthorizationType.java create mode 100644 src/main/java/com/rekoe/shiro/realm/UsernamePasswordRealm.java create mode 100644 src/main/java/com/rekoe/shiro/web/SimpleCookie.java create mode 100644 src/main/java/com/rekoe/utils/CharGenerator.java create mode 100644 src/main/java/com/rekoe/utils/ClassUtls.java create mode 100644 src/main/java/com/rekoe/utils/CommonUtils.java create mode 100644 src/main/java/com/rekoe/utils/Constants.java create mode 100644 src/main/java/com/rekoe/utils/DateTypeEditor.java create mode 100644 src/main/java/com/rekoe/utils/DirectiveUtils.java create mode 100644 src/main/java/com/rekoe/utils/HmacSHA1Encryption.java create mode 100644 src/main/java/com/rekoe/utils/ParamBean.java create mode 100644 src/main/java/com/rekoe/utils/ParseHtmlTool.java create mode 100644 src/main/java/com/rekoe/utils/StrUtils.java create mode 100644 src/main/java/com/rekoe/utils/StringGenerator.java create mode 100644 src/main/java/com/rekoe/utils/SystemContext.java create mode 100644 src/main/java/com/rekoe/valueadaptor/JsonValueAdaptor.java create mode 100644 src/main/java/com/rekoe/valueadaptor/MapValueAdaptor.java create mode 100644 src/main/java/com/rekoe/valueadaptor/NutMapValueAdaptor.java create mode 100644 src/main/java/com/rekoe/valueadaptor/StringJsonAdaptor.java create mode 100644 src/main/java/com/rekoe/web/freemarker/CurrentTimeDirective.java create mode 100644 src/main/java/com/rekoe/web/freemarker/HtmlCutDirective.java create mode 100644 src/main/java/com/rekoe/web/freemarker/PaginationDirective.java create mode 100644 src/main/java/com/rekoe/web/freemarker/PermissionDirective.java create mode 100644 src/main/java/com/rekoe/web/freemarker/PermissionShiroFreemarker.java create mode 100644 src/main/java/com/rekoe/web/freemarker/PlatformEditDirective.java create mode 100644 src/main/java/com/rekoe/web/freemarker/PlatformPermissionDirective.java create mode 100644 src/main/java/com/rekoe/web/freemarker/ProcessTimeDirective.java create mode 100644 src/main/java/com/rekoe/web/freemarker/Sid2NameDirective.java create mode 100644 src/main/java/com/rekoe/web/freemarker/TimeFormatDirective.java create mode 100644 src/main/resources/conf.properties create mode 100644 src/main/resources/ehcache.xml create mode 100644 src/main/resources/init_system_h2.sql create mode 100644 src/main/resources/ioc/dao.js create mode 100644 src/main/resources/ioc/ehcache.js create mode 100644 src/main/resources/ioc/freemarker_tags.js create mode 100644 src/main/resources/ioc/mail.js create mode 100644 src/main/resources/ioc/upload.js create mode 100644 src/main/resources/log4j.properties create mode 100644 src/main/resources/msg/zh_CN/MessageResources.properties create mode 100644 src/main/resources/oauth_consumer.properties create mode 100644 src/main/resources/quartz.properties create mode 100644 src/main/resources/shiro.ini diff --git a/README.md b/README.md new file mode 100644 index 0000000..0def431 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +1)create database platform +2)mvn clean +3)mvn eclipse:eclipse -Dwtpversion=1.0 +4)mvn package -Dmaven.test.skip=true +5)mvn dependency:tree 可以查看依赖树 \ No newline at end of file diff --git a/apidoc.json b/apidoc.json new file mode 100644 index 0000000..36da367 --- /dev/null +++ b/apidoc.json @@ -0,0 +1,7 @@ +{ + "name": "账号管理平台", + "version": "1.0.0", + "description": "账号认证平台", + "title": "账号认证平台", + "url" : "http://warlogin.shanggame.com" +} \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..8de8fa0 --- /dev/null +++ b/pom.xml @@ -0,0 +1,319 @@ + + 4.0.0 + com.rekoe + rk_svnadmin + jar + 3.0 + rk_svnadmin + http://www.rekoe.com + + UTF-8 + + + + + + javax.servlet + servlet-api + 2.5 + provided + + + mysql + mysql-connector-java + 5.1.28 + + + com.alibaba + druid + 1.0.16 + + + jconsole + com.alibaba + + + tools + com.alibaba + + + + + net.sf.ehcache + ehcache + 2.9.1 + + + org.apache.shiro + shiro-ehcache + 1.2.4 + + + ehcache-core + net.sf.ehcache + + + shiro-core + org.apache.shiro + + + + + org.nutz + nutz-plugins-views + 1.r.54.r2 + + + org.nutz + nutz + 1.r.56.r1 + + + org.nutz + nutz-web + 1.b.49 + + + com.restfb + restfb + 1.6.14 + + + org.codehaus.jackson + jackson-all + 1.9.1 + + + org.apache.oltu.oauth2 + org.apache.oltu.oauth2.authzserver + 1.0.0 + + + org.apache.oltu.oauth2 + org.apache.oltu.oauth2.resourceserver + 1.0.0 + + + org.apache.oltu.oauth2 + org.apache.oltu.oauth2.common + 1.0.0 + + + com.google.apis + google-api-services-androidpublisher + v2-rev22-1.21.0 + + + com.google.http-client + google-http-client + 1.21.0 + + + jsr305 + com.google.code.findbugs + + + + + com.google.apis + google-api-services-oauth2 + v2-rev101-1.21.0 + + + com.google.api-client + google-api-client + 1.21.0 + + + jsr305 + com.google.code.findbugs + + + guava-jdk5 + com.google.guava + + + + + com.google.apis + google-api-services-plus + v1-rev327-1.21.0 + + + org.freemarker + freemarker + 2.3.20 + + + org.quartz-scheduler + quartz + 2.2.1 + + + c3p0 + c3p0 + + + + + org.nutz + nutz-plugins-daocache + 1.b.53.r2 + + + org.nutz + nutz-integration-quartz + 1.b.53 + + + c3p0 + c3p0 + + + + + com.cloopen + ccp_rest_sdk + 2.7.r + + + org.json + json + 20090211 + + + commons-email + commons-email + 1.1 + + + activation + javax.activation + + + + + org.nutz + nutz-integration-shiro + 1.b.53 + + + org.apache.shiro + shiro-all + 1.2.3 + + + org.apache.shiro + shiro-guice + + + + + commons-beanutils + commons-beanutils-core + 1.8.3 + + + org.apache.commons + commons-lang3 + 3.1 + + + commons-logging + commons-logging + 1.1.3 + + + log4j + log4j + 1.2.17 + + + org.slf4j + slf4j-api + 1.7.5 + + + org.slf4j + slf4j-log4j12 + 1.7.5 + + + org.apache.commons + commons-vfs2 + 2.0 + + + maven-scm-api + org.apache.maven.scm + + + maven-scm-provider-svnexe + org.apache.maven.scm + + + + + org.brickred + socialauth + 4.5 + + + org.json + json + + + org.openid4java + openid4java-consumer + + + + + org.htmlparser + htmlparser + 2.1 + + + + src/main/java + + + src/main/resources + + com/rekoe/web/freemarker/*.* + + + + src/main/java + + **/*.properties + **/*.js + + false + + + rk_svnadmin + + + org.apache.maven.plugins + maven-compiler-plugin + 2.5.1 + + 1.7 + 1.7 + UTF-8 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.17 + + once + -Dfile.encoding=UTF-8 + + + + + \ No newline at end of file diff --git a/src/main/java/com/rekoe/annotation/PermissionTag.java b/src/main/java/com/rekoe/annotation/PermissionTag.java new file mode 100644 index 0000000..f2febe1 --- /dev/null +++ b/src/main/java/com/rekoe/annotation/PermissionTag.java @@ -0,0 +1,21 @@ +package com.rekoe.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Documented +public @interface PermissionTag { + + boolean enable() default true; + + String name(); + + String tag(); + + String tagId() default ""; +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/annotation/PlatformProvider.java b/src/main/java/com/rekoe/annotation/PlatformProvider.java new file mode 100644 index 0000000..b42dd22 --- /dev/null +++ b/src/main/java/com/rekoe/annotation/PlatformProvider.java @@ -0,0 +1,17 @@ +package com.rekoe.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Documented +public @interface PlatformProvider { + + boolean enable() default true; + + String name(); +} diff --git a/src/main/java/com/rekoe/cms/socialauth/AbstractOAuthProvider.java b/src/main/java/com/rekoe/cms/socialauth/AbstractOAuthProvider.java new file mode 100644 index 0000000..4e2e0f0 --- /dev/null +++ b/src/main/java/com/rekoe/cms/socialauth/AbstractOAuthProvider.java @@ -0,0 +1,165 @@ +package com.rekoe.cms.socialauth; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.brickred.socialauth.AbstractProvider; +import org.brickred.socialauth.AuthProvider; +import org.brickred.socialauth.Contact; +import org.brickred.socialauth.Permission; +import org.brickred.socialauth.Profile; +import org.brickred.socialauth.exception.AccessTokenExpireException; +import org.brickred.socialauth.exception.SocialAuthException; +import org.brickred.socialauth.exception.UserDeniedPermissionException; +import org.brickred.socialauth.oauthstrategy.OAuthStrategyBase; +import org.brickred.socialauth.util.AccessGrant; +import org.brickred.socialauth.util.OAuthConfig; +import org.brickred.socialauth.util.Response; +import org.brickred.socialauth.util.SocialAuthUtil; +import org.nutz.lang.Lang; +import org.nutz.log.Log; +import org.nutz.log.Logs; + +@SuppressWarnings("serial") +public abstract class AbstractOAuthProvider extends AbstractProvider implements AuthProvider { + + private static final Log log = Logs.get(); + + protected Permission scope; + protected OAuthConfig config; + protected Profile userProfile; + protected AccessGrant accessGrant; + protected OAuthStrategyBase authenticationStrategy; + + protected static String[] AllPerms; + protected static String[] AuthPerms; + protected static Map ENDPOINTS = new HashMap(); + + protected abstract String getPlatform(); + public AbstractOAuthProvider(OAuthConfig providerConfig) throws Exception { + this.config = providerConfig; + } + + public String getLoginRedirectURL(final String successUrl) throws Exception { + return authenticationStrategy.getLoginRedirectURL(successUrl); + } + + public Profile verifyResponse(HttpServletRequest httpReq) throws Exception { + Map params = SocialAuthUtil.getRequestParametersMap(httpReq); + return doVerifyResponse(params); + } + + public Profile verifyResponse(Map params) throws Exception { + return doVerifyResponse(params); + } + + protected Profile doVerifyResponse(final Map requestParams) throws Exception { + log.info("Retrieving Access Token in verify response function"); + if (requestParams.get("error_reason") != null && "user_denied".equals(requestParams.get("error_reason"))) { + throw new UserDeniedPermissionException(); + } + accessGrant = authenticationStrategy.verifyResponse(requestParams, verifyResponseMethod()); + if (accessGrant != null) { + log.debug("Obtaining user profile"); + Profile proFile = authLogin(); + return proFile; + } else { + throw new SocialAuthException("Access token not found"); + } + } + + protected abstract Profile authLogin() throws Exception; + + public Response api(final String url, final String methodType, final Map params, final Map headerParams, final String body) throws Exception { + try { + return authenticationStrategy.executeFeed(url, methodType, params, headerParams, body); + } catch (Exception e) { + throw new SocialAuthException("Error while making request to URL : " + url, e); + } + } + + public List getContactList() throws Exception { + throw Lang.makeThrow(SocialAuthException.class, "Get contact list is not implemented for %s", getPlatform()); + } + + public void logout() { + accessGrant = null; + authenticationStrategy.logout(); + } + + @Override + public void setPermission(Permission permission) { + this.scope = permission; + authenticationStrategy.setPermission(this.scope); + authenticationStrategy.setScope(getScope()); + } + + public Profile getUserProfile() throws Exception { + return userProfile; + } + + public AccessGrant getAccessGrant() { + return accessGrant; + } + + public String getProviderId() { + return config.getId(); + } + + protected String getScope() { + StringBuffer result = new StringBuffer(); + String arr[] = null; + if (Permission.AUTHENTICATE_ONLY.equals(scope)) { + arr = AuthPerms; + } else if (Permission.CUSTOM.equals(scope) && config.getCustomPermissions() != null) { + arr = config.getCustomPermissions().split(","); + } else { + arr = AllPerms; + } + if (arr.length > 0) + result.append(arr[0]); + for (int i = 1; i < arr.length; i++) { + result.append(",").append(arr[i]); + } + return result.toString(); + } + + protected String verifyResponseMethod() { + return "GET"; + } + + @Override + public void setAccessGrant(AccessGrant accessGrant) throws AccessTokenExpireException, SocialAuthException { + this.accessGrant = accessGrant; + } + + @Override + public Response updateStatus(String arg0) throws Exception { + throw Lang.makeThrow(SocialAuthException.class, "Update Status is not implemented for %s", getPlatform()); + } + + @Override + public Response uploadImage(String arg0, String arg1, InputStream arg2) throws Exception { + throw Lang.makeThrow(SocialAuthException.class, "Update Image is not implemented for %s", getPlatform()); + } + + @Override + protected OAuthStrategyBase getOauthStrategy() { + return authenticationStrategy; + } + + @Override + protected List getPluginsList() { + List list = new ArrayList(); + if (config.getRegisteredPlugins() != null && config.getRegisteredPlugins().length > 0) { + list.addAll(Arrays.asList(config.getRegisteredPlugins())); + } + return list; + } +} diff --git a/src/main/java/com/rekoe/cms/socialauth/qq/QQAuthProvider.java b/src/main/java/com/rekoe/cms/socialauth/qq/QQAuthProvider.java new file mode 100644 index 0000000..f169638 --- /dev/null +++ b/src/main/java/com/rekoe/cms/socialauth/qq/QQAuthProvider.java @@ -0,0 +1,92 @@ +package com.rekoe.cms.socialauth.qq; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.lang3.math.NumberUtils; +import org.brickred.socialauth.Profile; +import org.brickred.socialauth.exception.SocialAuthException; +import org.brickred.socialauth.oauthstrategy.OAuth2; +import org.brickred.socialauth.util.Constants; +import org.brickred.socialauth.util.OAuthConfig; +import org.brickred.socialauth.util.Response; +import org.nutz.json.Json; +import org.nutz.log.Log; +import org.nutz.log.Logs; + +import com.rekoe.cms.socialauth.AbstractOAuthProvider; + +/** + * 实现QQ帐号登录,OAuth2 + * + * @author wendal + */ +@SuppressWarnings("serial") +public class QQAuthProvider extends AbstractOAuthProvider { + + private final static Log log = Logs.get(); + private String PROFILE_URL= "https://graph.qq.com/oauth2.0/me"; + static { + ENDPOINTS.put(Constants.OAUTH_AUTHORIZATION_URL, "https://graph.qq.com/oauth2.0/authorize"); + ENDPOINTS.put(Constants.OAUTH_ACCESS_TOKEN_URL, "https://graph.qq.com/oauth2.0/token"); + AllPerms = new String[] { "get_user_info", "get_info" }; + AuthPerms = new String[] { "get_user_info", "get_info" }; + } + + public QQAuthProvider(final OAuthConfig providerConfig) throws Exception { + super(providerConfig); + authenticationStrategy = new OAuth2(config, ENDPOINTS); + authenticationStrategy.setPermission(scope); + authenticationStrategy.setScope(getScope()); + } + + protected Profile authLogin() throws Exception { + String presp; + try { + Response response = authenticationStrategy.executeFeed(PROFILE_URL); + presp = response.getResponseBodyAsString(Constants.ENCODING); + if (presp != null) { + presp = presp.trim().intern(); + if (presp.startsWith("callback(") && presp.endsWith(");")) { + presp = presp.substring(presp.indexOf("{"), presp.indexOf("}") + 1); + Map map = Json.fromJsonAsMap(String.class, presp); + if (map.get("openid") != null) { + Profile p = new Profile(); + p.setValidatedId(map.get("openid")); // QQ定义的 + p.setProviderId(getProviderId()); + userProfile = p; + try { + Map params = new HashMap(); + params.put("format", "json"); + params.put("openid", map.get("openid")); + params.put("oauth_consumer_key", config.get_consumerKey()); + response = authenticationStrategy.executeFeed("https://graph.qq.com/user/get_user_info", "GET", params, null, null); + presp = response.getResponseBodyAsString(Constants.ENCODING); + Map user_info = Json.fromJsonAsMap(String.class, presp); + boolean isRight = NumberUtils.toInt(user_info.get("ret"), -1) == 0; + if (isRight) { // 获取成功 + if (user_info.get("nickname") != null) + p.setDisplayName(user_info.get("nickname")); + if (user_info.get("figureurl") != null) + p.setProfileImageURL(user_info.get("figureurl")); + if (user_info.get("gender") != null) + p.setGender(user_info.get("gender")); + } + } catch (Throwable e) { + log.error(e); + } + return p; + } + } + } + throw new SocialAuthException("QQ Error : " + presp); + } catch (Exception e) { + throw new SocialAuthException("Error while getting profile from " + PROFILE_URL, e); + } + } + + @Override + protected String getPlatform() { + return "QQ"; + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/cms/socialauth/qqweibo/QQWeiboAuthProvider.java b/src/main/java/com/rekoe/cms/socialauth/qqweibo/QQWeiboAuthProvider.java new file mode 100644 index 0000000..135ae6a --- /dev/null +++ b/src/main/java/com/rekoe/cms/socialauth/qqweibo/QQWeiboAuthProvider.java @@ -0,0 +1,126 @@ +package com.rekoe.cms.socialauth.qqweibo; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import org.brickred.socialauth.Profile; +import org.brickred.socialauth.exception.ServerDataException; +import org.brickred.socialauth.exception.SocialAuthException; +import org.brickred.socialauth.exception.UserDeniedPermissionException; +import org.brickred.socialauth.oauthstrategy.OAuth1; +import org.brickred.socialauth.oauthstrategy.OAuthStrategyBase; +import org.brickred.socialauth.util.Constants; +import org.brickred.socialauth.util.OAuthConfig; +import org.brickred.socialauth.util.Response; +import org.nutz.json.Json; +import org.nutz.log.Log; +import org.nutz.log.Logs; + +import com.rekoe.cms.socialauth.AbstractOAuthProvider; + +/** + * 实现腾讯微博帐号登录,OAuth1 + * + * @author wendal + */ +@SuppressWarnings("serial") +public class QQWeiboAuthProvider extends AbstractOAuthProvider { + + private static final Log log = Logs.get(); + private final String PROFILE_URL = "http://open.t.qq.com/api/user/info?format=json"; + public QQWeiboAuthProvider(final OAuthConfig providerConfig) throws Exception { + super(providerConfig); + ENDPOINTS.put(Constants.OAUTH_REQUEST_TOKEN_URL, "https://open.t.qq.com/cgi-bin/request_token"); + ENDPOINTS.put(Constants.OAUTH_AUTHORIZATION_URL, "https://open.t.qq.com/cgi-bin/authorize"); + ENDPOINTS.put(Constants.OAUTH_ACCESS_TOKEN_URL, "https://open.t.qq.com/cgi-bin/access_token"); + AllPerms = new String[] {}; + AuthPerms = new String[] {}; + authenticationStrategy = new OAuth1(config, ENDPOINTS); + authenticationStrategy.setPermission(scope); + authenticationStrategy.setScope(getScope()); + } + + protected Profile doVerifyResponse(final Map requestParams) throws Exception { + log.info("Retrieving Access Token in verify response function"); + if (requestParams.get("error_reason") != null && "user_denied".equals(requestParams.get("error_reason"))) { + throw new UserDeniedPermissionException(); + } + accessGrant = authenticationStrategy.verifyResponse(requestParams, verifyResponseMethod()); + + if (accessGrant != null) { + log.debug("Obtaining user profile"); + // try { + // String presp = + // authenticationStrategy.executeFeed(PROFILE_URL).getResponseBodyAsString("utf8"); + // System.out.println(Json.toJson(Json.fromJson(presp))); + // } catch (Throwable e) { + // e.printStackTrace(); + // } + Profile p = new Profile(); + p.setValidatedId(requestParams.get("openid")); + p.setProviderId(getProviderId()); + userProfile = p; + return p; + } else { + throw new SocialAuthException("Access token not found"); + } + } + + @SuppressWarnings("unchecked") + protected Profile authLogin() throws Exception { + String presp; + try { + Response response = authenticationStrategy.executeFeed(PROFILE_URL); + presp = response.getResponseBodyAsString(Constants.ENCODING); + } catch (Exception e) { + throw new SocialAuthException("Error while getting profile from " + PROFILE_URL, e); + } + try { + // System.out.println("User Profile : " + presp); + Map data = Json.fromJson(Map.class, presp); + if (!"ok".equals(data.get("msg"))) + throw new SocialAuthException("Error: " + presp); + if (userProfile == null) + userProfile = new Profile(); + data = (Map) data.get("data"); + userProfile.setValidatedId(data.get("uid").toString()); + return userProfile; + } catch (Exception ex) { + throw new ServerDataException("Failed to parse the user profile json : " + presp, ex); + } + } + + @Override + public Response updateStatus(String arg0) throws Exception { + log.warn("WARNING: Not implemented for QQAuthProvider"); + throw new SocialAuthException("Update Status is not implemented for QQAuthProvider"); + } + + @Override + public Response uploadImage(String arg0, String arg1, InputStream arg2) throws Exception { + log.warn("WARNING: Not implemented for QQAuthProvider"); + throw new SocialAuthException("Upload Image is not implemented for QQAuthProvider"); + } + + @Override + protected OAuthStrategyBase getOauthStrategy() { + return authenticationStrategy; + } + + @Override + protected List getPluginsList() { + List list = new ArrayList(); + if (config.getRegisteredPlugins() != null && config.getRegisteredPlugins().length > 0) { + list.addAll(Arrays.asList(config.getRegisteredPlugins())); + } + return list; + } + + @Override + protected String getPlatform() { + return "qqweibo"; + } +} diff --git a/src/main/java/com/rekoe/common/AppleVO.java b/src/main/java/com/rekoe/common/AppleVO.java new file mode 100644 index 0000000..e122a0f --- /dev/null +++ b/src/main/java/com/rekoe/common/AppleVO.java @@ -0,0 +1,28 @@ +package com.rekoe.common; + +import java.io.Serializable; +import java.util.List; + +public class AppleVO implements Serializable { + + private static final long serialVersionUID = 6286981086440847759L; + + private boolean validate; + private List items; + + public boolean isValidate() { + return validate; + } + + public void setValidate(boolean validate) { + this.validate = validate; + } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } +} diff --git a/src/main/java/com/rekoe/common/GooglePVO.java b/src/main/java/com/rekoe/common/GooglePVO.java new file mode 100644 index 0000000..b3da3b5 --- /dev/null +++ b/src/main/java/com/rekoe/common/GooglePVO.java @@ -0,0 +1,37 @@ +package com.rekoe.common; + +import java.io.Serializable; +import java.util.List; + +public class GooglePVO implements Serializable { + + private static final long serialVersionUID = 6286981086440847759L; + + private boolean validate; + private String googlePublicKey; + private List items; + + public boolean isValidate() { + return validate; + } + + public void setValidate(boolean validate) { + this.validate = validate; + } + + public String getGooglePublicKey() { + return googlePublicKey; + } + + public void setGooglePublicKey(String googlePublicKey) { + this.googlePublicKey = googlePublicKey; + } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } +} diff --git a/src/main/java/com/rekoe/common/GoogleVO.java b/src/main/java/com/rekoe/common/GoogleVO.java new file mode 100644 index 0000000..bd4cc8a --- /dev/null +++ b/src/main/java/com/rekoe/common/GoogleVO.java @@ -0,0 +1,102 @@ +package com.rekoe.common; + +import java.io.Serializable; +import java.util.List; + +public class GoogleVO implements Serializable { + + private static final long serialVersionUID = 6286981086440847759L; + + private boolean validate; + private String refreshToken; + private String productName; + private String packageName; + private String clientId; + private String clientSecret; + private String redirectUri; + private String scope; + private String tokenType; + + private List items; + + public boolean isValidate() { + return validate; + } + + public void setValidate(boolean validate) { + this.validate = validate; + } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } + + public String getRefreshToken() { + return refreshToken; + } + + public void setRefreshToken(String refreshToken) { + this.refreshToken = refreshToken; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getPackageName() { + return packageName; + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } + + public String getClientId() { + return clientId; + } + + public void setClientId(String clientId) { + this.clientId = clientId; + } + + public String getClientSecret() { + return clientSecret; + } + + public void setClientSecret(String clientSecret) { + this.clientSecret = clientSecret; + } + + public String getRedirectUri() { + return redirectUri; + } + + public void setRedirectUri(String redirectUri) { + this.redirectUri = redirectUri; + } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } + + public String getTokenType() { + return tokenType; + } + + public void setTokenType(String tokenType) { + this.tokenType = tokenType; + } + +} diff --git a/src/main/java/com/rekoe/common/Message.java b/src/main/java/com/rekoe/common/Message.java new file mode 100644 index 0000000..697ed34 --- /dev/null +++ b/src/main/java/com/rekoe/common/Message.java @@ -0,0 +1,56 @@ +package com.rekoe.common; + +import javax.servlet.http.HttpServletRequest; + +import org.nutz.mvc.Mvcs; +/** + * @author 科技㊣²º¹³ + * 2014年2月3日 下午4:48:45 + * http://www.rekoe.com + * QQ:5382211 + */ +public class Message { + + private Type type; + private String content; + + public enum Type { + success, warn, error; + } + + public Message() { + } + + public Message(Message.Type type, String content,HttpServletRequest req) { + this.type = type; + this.content = Mvcs.getMessage(req, content); + } + + public static Message success(String content,HttpServletRequest req) { + return new Message(Message.Type.success, content,req); + } + + public static Message warn(String content,HttpServletRequest req) { + return new Message(Message.Type.warn, content, req); + } + + public static Message error(String content,HttpServletRequest req) { + return new Message(Message.Type.error, content, req); + } + + public Message.Type getType() { + return this.type; + } + + public void setType(Message.Type type) { + this.type = type; + } + + public String getContent() { + return this.content; + } + + public void setContent(String content) { + this.content = content; + } +} diff --git a/src/main/java/com/rekoe/common/PackageVO.java b/src/main/java/com/rekoe/common/PackageVO.java new file mode 100644 index 0000000..10e2fbf --- /dev/null +++ b/src/main/java/com/rekoe/common/PackageVO.java @@ -0,0 +1,34 @@ +package com.rekoe.common; + +import java.io.Serializable; + +public class PackageVO implements Serializable { + private static final long serialVersionUID = 4225042323738026254L; + private String productId; + private int itemid; + private float money; + + public String getProductId() { + return productId; + } + + public void setProductId(String productId) { + this.productId = productId; + } + + public int getItemid() { + return itemid; + } + + public void setItemid(int itemid) { + this.itemid = itemid; + } + + public float getMoney() { + return money; + } + + public void setMoney(float money) { + this.money = money; + } +} diff --git a/src/main/java/com/rekoe/common/PlatformVO.java b/src/main/java/com/rekoe/common/PlatformVO.java new file mode 100644 index 0000000..b0d083e --- /dev/null +++ b/src/main/java/com/rekoe/common/PlatformVO.java @@ -0,0 +1,33 @@ +package com.rekoe.common; + +public class PlatformVO { + + private String type; + private String name; + + public PlatformVO(String type, String name) { + super(); + this.type = type; + this.name = name; + } + + public PlatformVO() { + super(); + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/src/main/java/com/rekoe/common/page/Paginable.java b/src/main/java/com/rekoe/common/page/Paginable.java new file mode 100644 index 0000000..7e40fc5 --- /dev/null +++ b/src/main/java/com/rekoe/common/page/Paginable.java @@ -0,0 +1,62 @@ +package com.rekoe.common.page; +/** + * @author 科技㊣²º¹³ + * 2014年2月3日 下午4:48:45 + * http://www.rekoe.com + * QQ:5382211 + */ +public interface Paginable { + + /** + * 总记录数 + * + * @return + */ + public int getTotalCount(); + + /** + * 总页数 + * + * @return + */ + public int getTotalPage(); + + /** + * 每页记录数 + * + * @return + */ + public int getPageSize(); + + /** + * 当前页号 + * + * @return + */ + public int getPageNo(); + + /** + * 是否第一页 + * + * @return + */ + public boolean isFirstPage(); + + /** + * 是否最后一页 + * + * @return + */ + public boolean isLastPage(); + + /** + * 返回下页的页号 + */ + public int getNextPage(); + + /** + * 返回上页的页号 + */ + public int getPrePage(); + +} diff --git a/src/main/java/com/rekoe/common/page/Pagination.java b/src/main/java/com/rekoe/common/page/Pagination.java new file mode 100644 index 0000000..2345c07 --- /dev/null +++ b/src/main/java/com/rekoe/common/page/Pagination.java @@ -0,0 +1,80 @@ +package com.rekoe.common.page; + +import java.util.List; + +/** + * @author 科技㊣²º¹³ + * 2014年2月3日 下午4:48:45 + * http://www.rekoe.com + * QQ:5382211 + */ +public class Pagination extends SimplePage implements java.io.Serializable { + + private static final long serialVersionUID = -1585539529849523194L; + + public Pagination() { + } + + /** + * 构造器 + * + * @param pageNo + * 页码 + * @param pageSize + * 每页几条数据 + * @param totalCount + * 总共几条数据 + */ + public Pagination(int pageNo, int pageSize, int totalCount) { + super(pageNo, pageSize, totalCount); + } + + /** + * 构造器 + * + * @param pageNo + * 页码 + * @param pageSize + * 每页几条数据 + * @param totalCount + * 总共几条数据 + * @param list + * 分页内容 + */ + public Pagination(int pageNo, int pageSize, int totalCount, List list) { + super(pageNo, pageSize, totalCount); + this.list = list; + } + + /** + * 第一条数据位置 + * + * @return + */ + public int getFirstResult() { + return (pageNo - 1) * pageSize; + } + + /** + * 当前页的数据 + */ + private List list; + + /** + * 获得分页内容 + * + * @return + */ + public List getList() { + return list; + } + + /** + * 设置分页内容 + * + * @param list + */ + public void setList(List list) { + this.list = list; + } +} diff --git a/src/main/java/com/rekoe/common/page/SimplePage.java b/src/main/java/com/rekoe/common/page/SimplePage.java new file mode 100644 index 0000000..7c6b957 --- /dev/null +++ b/src/main/java/com/rekoe/common/page/SimplePage.java @@ -0,0 +1,181 @@ +package com.rekoe.common.page; + +import java.util.ArrayList; +import java.util.List; +/** + * @author 科技㊣²º¹³ + * 2014年2月3日 下午4:48:45 + * http://www.rekoe.com + * QQ:5382211 + */ +public class SimplePage implements Paginable { + + public static final int DEF_COUNT = 20; + private List localArrayList = new ArrayList(); + + public List getSegment() { + return localArrayList; + } + /** + * 检查页码 checkPageNo + * + * @param pageNo + * @return if pageNo==null or pageNo<1 then return 1 else return pageNo + */ + public static int cpn(Integer pageNo) { + return (pageNo == null || pageNo < 1) ? 1 : pageNo; + } + + public SimplePage() { + } + + /** + * 构造器 + * + * @param pageNo + * 页码 + * @param pageSize + * 每页几条数据 + * @param totalCount + * 总共几条数据 + */ + public SimplePage(int pageNo, int pageSize, int totalCount) { + setTotalCount(totalCount); + setPageSize(pageSize); + setPageNo(pageNo); + adjustPageNo(); + int totalPages = getTotalPage(); + minPage = minPage < 1 ? 1 : minPage; + maxPage = maxPage > totalPages ? totalPages : maxPage; + for (int i = minPage; i <= maxPage; i++) { + localArrayList.add(i); + } + } + + /** + * 调整页码,使不超过最大页数 + */ + public void adjustPageNo() { + if (pageNo == 1) { + return; + } + int tp = getTotalPage(); + if (pageNo > tp) { + pageNo = tp; + } + } + + /** + * 获得页码 + */ + public int getPageNo() { + return pageNo; + } + + /** + * 每页几条数据 + */ + public int getPageSize() { + return pageSize; + } + + /** + * 总共几条数据 + */ + public int getTotalCount() { + return totalCount; + } + + /** + * 总共几页 + */ + public int getTotalPage() { + int totalPage = totalCount / pageSize; + if (totalPage == 0 || totalCount % pageSize != 0) { + totalPage++; + } + return totalPage; + } + + /** + * 是否第一页 + */ + public boolean isFirstPage() { + return pageNo <= 1; + } + + /** + * 是否最后一页 + */ + public boolean isLastPage() { + return pageNo >= getTotalPage(); + } + + /** + * 下一页页码 + */ + public int getNextPage() { + if (isLastPage()) { + return pageNo; + } else { + return pageNo + 1; + } + } + + /** + * 上一页页码 + */ + public int getPrePage() { + if (isFirstPage()) { + return pageNo; + } else { + return pageNo - 1; + } + } + + protected int totalCount = 0; + protected int pageSize = 20; + protected int pageNo = 1; + + /** + * if totalCount<0 then totalCount=0 + * + * @param totalCount + */ + public void setTotalCount(int totalCount) { + if (totalCount < 0) { + this.totalCount = 0; + } else { + this.totalCount = totalCount; + } + } + + /** + * if pageSize< 1 then pageSize=DEF_COUNT + * + * @param pageSize + */ + public void setPageSize(int pageSize) { + if (pageSize < 1) { + this.pageSize = DEF_COUNT; + } else { + this.pageSize = pageSize; + } + } + + /** + * if pageNo < 1 then pageNo=1 + * + * @param pageNo + */ + public void setPageNo(int pageNo) { + if (pageNo < 1) { + this.pageNo = 1; + } else { + this.pageNo = pageNo; + } + } + + int minPage = pageNo - (int) Math.floor((pageSize - 1) / 2.0D); + int maxPage = pageNo + (int) Math.ceil((pageSize - 1) / 2.0D); +} diff --git a/src/main/java/com/rekoe/domain/AuthType.java b/src/main/java/com/rekoe/domain/AuthType.java new file mode 100644 index 0000000..0c36862 --- /dev/null +++ b/src/main/java/com/rekoe/domain/AuthType.java @@ -0,0 +1,16 @@ +package com.rekoe.domain; + +public enum AuthType { + + DEFAULT("DEFAULT"), TOKEN("TOKEN"), QQ_HTML5("QQ_HTML5"); + + public String display; + + AuthType(String display) { + this.display = display; + } + + public String getDisplay() { + return display; + } +} diff --git a/src/main/java/com/rekoe/domain/CdkeyCategory.java b/src/main/java/com/rekoe/domain/CdkeyCategory.java new file mode 100644 index 0000000..afc6c2f --- /dev/null +++ b/src/main/java/com/rekoe/domain/CdkeyCategory.java @@ -0,0 +1,64 @@ +package com.rekoe.domain; + +import java.io.Serializable; + +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.EL; +import org.nutz.dao.entity.annotation.Name; +import org.nutz.dao.entity.annotation.Prev; +import org.nutz.dao.entity.annotation.Table; + +/** + * @author 科技㊣²º¹³
+ * 2014年4月19日 上午8:54:23
+ * http://www.rekoe.com
+ * QQ:5382211
+ */ +@Table("cdkey_category") +public class CdkeyCategory implements Serializable { + + private static final long serialVersionUID = 7685127380108984960L; + @Name + @Prev(els = { @EL("uuid()") }) + private String id; + + @Column + private String name; + + @Column(hump = true) + private int cdkeyType; + + public CdkeyCategory() { + super(); + } + + public CdkeyCategory(String name, int cdkeyType) { + super(); + this.name = name; + this.cdkeyType = cdkeyType; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getCdkeyType() { + return cdkeyType; + } + + public void setCdkeyType(int cdkeyType) { + this.cdkeyType = cdkeyType; + } +} diff --git a/src/main/java/com/rekoe/domain/CdkeyEntity.java b/src/main/java/com/rekoe/domain/CdkeyEntity.java new file mode 100644 index 0000000..1e9988e --- /dev/null +++ b/src/main/java/com/rekoe/domain/CdkeyEntity.java @@ -0,0 +1,63 @@ +package com.rekoe.domain; + +import java.util.Date; + +import org.nutz.dao.entity.annotation.ColDefine; +import org.nutz.dao.entity.annotation.ColType; +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.Id; +import org.nutz.dao.entity.annotation.Index; +import org.nutz.dao.entity.annotation.Table; +import org.nutz.dao.entity.annotation.TableIndexes; + +@Table("cdkey_${taskid}") +@TableIndexes({ @Index(name = "cdk_${taskid}_index", fields = { "cdkey" }, unique = true), @Index(name = "cdk_${taskid}_used_index", fields = { "used" }, unique = false) }) +public class CdkeyEntity { + + @Id + private long id; + @Column + private String cdkey; + + @Column("is_used") + @ColDefine(type = ColType.BOOLEAN) + private boolean used; + + @Column(hump = true) + @ColDefine(type = ColType.TIMESTAMP) + private Date createTime; + + public boolean isUsed() { + return used; + } + + public void setUsed(boolean used) { + this.used = used; + } + + public CdkeyEntity() { + super(); + } + + public CdkeyEntity(String cdkey, Date createTime) { + super(); + this.cdkey = cdkey; + this.createTime = createTime; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/domain/CdkeyLog.java b/src/main/java/com/rekoe/domain/CdkeyLog.java new file mode 100644 index 0000000..c2ffd20 --- /dev/null +++ b/src/main/java/com/rekoe/domain/CdkeyLog.java @@ -0,0 +1,88 @@ +package com.rekoe.domain; + +import java.io.Serializable; +import java.util.Date; + +import org.nutz.dao.entity.annotation.ColDefine; +import org.nutz.dao.entity.annotation.ColType; +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.EL; +import org.nutz.dao.entity.annotation.Id; +import org.nutz.dao.entity.annotation.Prev; +import org.nutz.dao.entity.annotation.Table; + +@Table("cdkey_log") +public class CdkeyLog implements Serializable { + + private static final long serialVersionUID = -6797252917202955579L; + + @Id + private long id; + @Column + private int pid; + @Column(hump = true) + private String providerId; + @Column + private String mac; + + @Column + @ColDefine(type = ColType.TIMESTAMP) + @Prev(els = @EL("$me.now()")) + private Date createTime; + + public CdkeyLog() { + super(); + } + + public CdkeyLog(int pid, String providerId, String mac) { + super(); + this.pid = pid; + this.providerId = providerId; + this.mac = mac; + } + + public Date now() { + return new Date(); + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public int getPid() { + return pid; + } + + public void setPid(int pid) { + this.pid = pid; + } + + public String getProviderId() { + return providerId; + } + + public void setProviderId(String providerId) { + this.providerId = providerId; + } + + public String getMac() { + return mac; + } + + public void setMac(String mac) { + this.mac = mac; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + +} diff --git a/src/main/java/com/rekoe/domain/GameServer.java b/src/main/java/com/rekoe/domain/GameServer.java new file mode 100644 index 0000000..9fc54a2 --- /dev/null +++ b/src/main/java/com/rekoe/domain/GameServer.java @@ -0,0 +1,222 @@ +package com.rekoe.domain; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import org.nutz.dao.entity.annotation.ColDefine; +import org.nutz.dao.entity.annotation.ColType; +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.Comment; +import org.nutz.dao.entity.annotation.Default; +import org.nutz.dao.entity.annotation.Id; +import org.nutz.dao.entity.annotation.Index; +import org.nutz.dao.entity.annotation.Many; +import org.nutz.dao.entity.annotation.ManyMany; +import org.nutz.dao.entity.annotation.Table; +import org.nutz.dao.entity.annotation.TableIndexes; +import org.nutz.lang.util.NutMap; + +import com.rekoe.valueadaptor.NutMapValueAdaptor; +import com.rekoe.valueadaptor.StringJsonAdaptor; + +@Table("system_server") +@TableIndexes({ @Index(name = "g_pid_index", fields = { "pid" }, unique = true) }) +public class GameServer implements Serializable { + + private static final long serialVersionUID = 4391955362256919755L; + + @Id + private int id; + + @Column(hump = true) + @Comment("平台名称") + private String platformName; + + @Column("platform_id") + @Comment("平台编号") + private int pid; + + @Column("is_open") + @Comment("是否开启") + private boolean open; + + @Column(hump = true) + @Comment("充值地址") + @ColDefine(width = 225) + private String payUrl; + + @Column(hump = true) + @Comment("登陆服地址") + @ColDefine(width = 225) + private String loginUrl; + + @ManyMany(target = User.class, relation = "system_user_server", from = "SERVERID", to = "USERID") + private List users; + + @Many(target = OfficialServer.class, field = "pid") + private List officialServers; + + @Column("ver") + @Comment("当前版本号") + private String version; + + @Column + @Comment("是否提审") + @ColDefine(type = ColType.BOOLEAN) + private boolean verify; + + @Column("is_black_open") + @Comment("是否开启白名单") + @ColDefine(type = ColType.BOOLEAN) + private boolean blackOpen; + + @Column("black_list") + @Comment("白名单列表") + @ColDefine(type = ColType.TEXT, adaptor = StringJsonAdaptor.class) + private List items = new ArrayList(); + + @Column(hump = true) + private String clientSecret; + + @Column(hump = true) + @Comment("认证方式") + @Default("DEFAULT") + protected AuthType authType; + + @Column(hump = true) + @ColDefine(type = ColType.TEXT, adaptor = NutMapValueAdaptor.class) + private NutMap mobileAuth; + + public NutMap getMobileAuth() { + if (mobileAuth == null) { + mobileAuth = NutMap.NEW(); + } + return mobileAuth; + } + + public void setMobileAuth(NutMap config) { + this.mobileAuth = config; + } + + public GameServer addMobileAuth(String id, NutMap config) { + this.mobileAuth.addv(id, config); + return this; + } + + public boolean isBlackOpen() { + return blackOpen; + } + + public String getClientSecret() { + return clientSecret; + } + + public void setClientSecret(String clientSecret) { + this.clientSecret = clientSecret; + } + + public void setBlackOpen(boolean black) { + this.blackOpen = black; + } + + public List getItems() { + return items; + } + + public AuthType getAuthType() { + return authType; + } + + public void setAuthType(AuthType authType) { + this.authType = authType; + } + + public void setItems(List items) { + this.items = items; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public boolean isVerify() { + return verify; + } + + public void setVerify(boolean verify) { + this.verify = verify; + } + + public List getOfficialServers() { + return officialServers; + } + + public void setOfficialServers(List officialServers) { + this.officialServers = officialServers; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getPlatformName() { + return platformName; + } + + public void setPlatformName(String platformName) { + this.platformName = platformName; + } + + public boolean isOpen() { + return open; + } + + public void setOpen(boolean open) { + this.open = open; + } + + public List getUsers() { + return users; + } + + public void setUsers(List users) { + this.users = users; + } + + public int getPid() { + return pid; + } + + public void setPid(int pid) { + this.pid = pid; + } + + public String getPayUrl() { + return payUrl; + } + + public void setPayUrl(String payUrl) { + this.payUrl = payUrl; + } + + public String getLoginUrl() { + return loginUrl; + } + + public void setLoginUrl(String loginUrl) { + this.loginUrl = loginUrl; + } + + public boolean isUseMobileAuth() { + return getMobileAuth().getBoolean("mobileAuth", false); + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/domain/Notice.java b/src/main/java/com/rekoe/domain/Notice.java new file mode 100644 index 0000000..2240259 --- /dev/null +++ b/src/main/java/com/rekoe/domain/Notice.java @@ -0,0 +1,138 @@ +package com.rekoe.domain; + +import java.io.Serializable; +import java.util.Date; + +import org.nutz.dao.entity.annotation.ColDefine; +import org.nutz.dao.entity.annotation.ColType; +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.Default; +import org.nutz.dao.entity.annotation.Id; +import org.nutz.dao.entity.annotation.Table; +import org.nutz.json.JsonField; + +/** + * @author 科技㊣²º¹³
+ * 2014年2月3日 下午4:48:45
+ * http://www.rekoe.com
+ * QQ:5382211 + */ +@Table("sg_notice") +public class Notice implements Serializable { + + private static final long serialVersionUID = 1566985676414681818L; + + @Id(auto=true) + private long id; + + @Column(hump = true) + @ColDefine(type = ColType.TIMESTAMP) + @JsonField(ignore = true) + private Date createDate; + + @Column + @Default("#FF0000") + private String color; + + @Column(hump = true) + @ColDefine(type = ColType.TIMESTAMP) + @JsonField(ignore = true) + private Date modifyDate; + + @Column + @ColDefine(type = ColType.TEXT) + @JsonField(ignore = true) + private String content; + + @Column("is_publication") + @ColDefine(type = ColType.BOOLEAN) + @JsonField(ignore = true) + private boolean publication; + + @Column("is_top") + @ColDefine(type = ColType.BOOLEAN) + @JsonField(ignore = true) + private boolean top; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 255) + private String title; + + @Column + @Default("1001") + @JsonField(ignore = true) + private int pid; + + public int getPid() { + return pid; + } + + public void setPid(int pid) { + this.pid = pid; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public Date getModifyDate() { + return modifyDate; + } + + public void setModifyDate(Date modifyDate) { + this.modifyDate = modifyDate; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public boolean isPublication() { + return publication; + } + + public void setPublication(boolean publication) { + this.publication = publication; + } + + public boolean isTop() { + return top; + } + + public void setTop(boolean top) { + this.top = top; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/domain/OAuthClient.java b/src/main/java/com/rekoe/domain/OAuthClient.java new file mode 100644 index 0000000..a7ef0b5 --- /dev/null +++ b/src/main/java/com/rekoe/domain/OAuthClient.java @@ -0,0 +1,64 @@ +package com.rekoe.domain; + +import java.io.Serializable; + +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.Id; +import org.nutz.dao.entity.annotation.Index; +import org.nutz.dao.entity.annotation.Table; +import org.nutz.dao.entity.annotation.TableIndexes; + +@Table("sg_oauth_client") +@TableIndexes({ @Index(name = "sg_oauth_client_index", fields = { "clientName" }, unique = true), @Index(name = "sg_oc_secret_index", fields = { "clientId", "clientSecret" }, unique = false) }) +public class OAuthClient implements Serializable { + + private static final long serialVersionUID = 2345879369118031587L; + @Id + private long id; + + @Column(hump = true) + private String clientName; + + @Column(hump = true) + private String clientId; + + @Column(hump = true) + private String clientSecret; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getClientName() { + return clientName; + } + + public void setClientName(String clientName) { + this.clientName = clientName; + } + + public String getClientId() { + return clientId; + } + + public void setClientId(String clientId) { + this.clientId = clientId; + } + + public String getClientSecret() { + return clientSecret; + } + + public void setClientSecret(String clientSecret) { + this.clientSecret = clientSecret; + } + + @Override + public String toString() { + return "Client{" + "id=" + id + ", clientName='" + clientName + '\'' + ", clientId='" + clientId + '\'' + ", clientSecret='" + clientSecret + '\'' + '}'; + } +} diff --git a/src/main/java/com/rekoe/domain/OAuthUser.java b/src/main/java/com/rekoe/domain/OAuthUser.java new file mode 100644 index 0000000..0732a31 --- /dev/null +++ b/src/main/java/com/rekoe/domain/OAuthUser.java @@ -0,0 +1,135 @@ +package com.rekoe.domain; + +import java.io.Serializable; + +import org.nutz.dao.entity.annotation.ColDefine; +import org.nutz.dao.entity.annotation.ColType; +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.Comment; +import org.nutz.dao.entity.annotation.Default; +import org.nutz.dao.entity.annotation.EL; +import org.nutz.dao.entity.annotation.Index; +import org.nutz.dao.entity.annotation.Name; +import org.nutz.dao.entity.annotation.Prev; +import org.nutz.dao.entity.annotation.Table; +import org.nutz.dao.entity.annotation.TableIndexes; +import org.nutz.json.JsonField; + +@Table("sg_oauth_user") +@TableIndexes({ @Index(name = "sg_user_data_index", fields = { "userName" }, unique = true), @Index(name = "sg_user_phone_index", fields = { "userName", "phoneCode" }, unique = false) }) +public class OAuthUser implements Serializable { + + private static final long serialVersionUID = -2879607754801933480L; + + @Name + @Prev(els = @EL("uuid()")) + @JsonField(ignore = true) + private String id; + + @Column(hump = true) + @JsonField(value = "name") + private String userName; + + @Column + @JsonField(ignore = true) + private String password; + + @Column + @JsonField(ignore = true) + private String salt; + + @Column(hump = true) + @ColDefine(type = ColType.INT, width = 16) + @JsonField(ignore = true) + private long phoneCode; + + @Column(hump = true) + @ColDefine(type = ColType.INT, width = 16) + @JsonField(value = "uid") + private long userId; + + @Column("is_locked") + @JsonField(value = "locked") + private boolean locked; + + @Column("is_bind") + @JsonField(ignore = true) + @Default("0") + private boolean bind; + + @Column(hump = true) + @Comment("绑定前的渠道") + private String bindProviderId; + + public String getBindProviderId() { + return bindProviderId; + } + + public void setBindProviderId(String bindProviderId) { + this.bindProviderId = bindProviderId; + } + + public boolean isBind() { + return bind; + } + + public void setBind(boolean bind) { + this.bind = bind; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getSalt() { + return salt; + } + + public void setSalt(String salt) { + this.salt = salt; + } + + public long getPhoneCode() { + return phoneCode; + } + + public void setPhoneCode(long phoneCode) { + this.phoneCode = phoneCode; + } + + public long getUserId() { + return userId; + } + + public void setUserId(long userId) { + this.userId = userId; + } + + public boolean isLocked() { + return locked; + } + + public void setLocked(boolean locked) { + this.locked = locked; + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/domain/OfficialServer.java b/src/main/java/com/rekoe/domain/OfficialServer.java new file mode 100644 index 0000000..8e2240e --- /dev/null +++ b/src/main/java/com/rekoe/domain/OfficialServer.java @@ -0,0 +1,120 @@ +package com.rekoe.domain; + +import java.io.Serializable; + +import org.nutz.dao.entity.annotation.ColDefine; +import org.nutz.dao.entity.annotation.ColType; +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.Comment; +import org.nutz.dao.entity.annotation.Default; +import org.nutz.dao.entity.annotation.Id; +import org.nutz.dao.entity.annotation.Index; +import org.nutz.dao.entity.annotation.One; +import org.nutz.dao.entity.annotation.Table; +import org.nutz.dao.entity.annotation.TableIndexes; + +/** + * 正式服 + * + * @author kouxian + * + */ +@Table("official_server") +@TableIndexes({ @Index(name = "g_sid_pid_index", fields = { "pid", "sid" }, unique = true) }) +public class OfficialServer implements Serializable { + + private static final long serialVersionUID = 6978032147399501026L; + + @Id + private long id; + + @Column + private int sid; + + @Column + @ColDefine(width = 225) + private String url; + + @Column + private String name; + + @Column + private short status; + + @Column("pid") + private int pid; + + @One(target = GameServer.class, field = "pid") + private GameServer gameServer; + + @Column(hump = true) + @Default("0") + @ColDefine(type = ColType.BOOLEAN) + @Comment("是否开启白名单") + private boolean openWhiteList; + + public int getPid() { + return pid; + } + + public void setPid(int pid) { + this.pid = pid; + } + + public GameServer getGameServer() { + return gameServer; + } + + public void setGameServer(GameServer gameServer) { + this.gameServer = gameServer; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public int getSid() { + return sid; + } + + public void setSid(int sid) { + this.sid = sid; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public short getStatus() { + return status; + } + + public void setStatus(short status) { + this.status = status; + } + + public boolean isOpenWhiteList() { + return openWhiteList; + } + + public void setOpenWhiteList(boolean openWhiteList) { + this.openWhiteList = openWhiteList; + } + +} diff --git a/src/main/java/com/rekoe/domain/PayRefund.java b/src/main/java/com/rekoe/domain/PayRefund.java new file mode 100644 index 0000000..060547a --- /dev/null +++ b/src/main/java/com/rekoe/domain/PayRefund.java @@ -0,0 +1,111 @@ +package com.rekoe.domain; + +import java.io.Serializable; +import java.util.Date; + +import org.nutz.dao.entity.annotation.ColDefine; +import org.nutz.dao.entity.annotation.ColType; +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.Comment; +import org.nutz.dao.entity.annotation.EL; +import org.nutz.dao.entity.annotation.Index; +import org.nutz.dao.entity.annotation.Name; +import org.nutz.dao.entity.annotation.Prev; +import org.nutz.dao.entity.annotation.Table; +import org.nutz.dao.entity.annotation.TableIndexes; + +@Table("pay_refund") +@TableIndexes({ @Index(name = "pay_refund_index", fields = { "paymentid" }, unique = false), @Index(name = "pay_status_index", fields = { "status" }, unique = false) }) +public class PayRefund implements Serializable { + + private static final long serialVersionUID = -6311504223475095588L; + @Name + @Comment("ID主键") + @Prev(els = { @EL("uuid()") }) + private String id; + @Column + @ColDefine(type = ColType.TIMESTAMP) + @Comment("创建时间") + private Date createTime; + @Column + private String passportid; + @Column("payment_id") + private String paymentid; + @Column + private String name; + @Column(hump = true) + private String requestId; + + @Column(hump = true) + @ColDefine(type = ColType.TEXT) + private String changedFields; + + @Column("do_status") + @Comment("订单处理状态") + private boolean status; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getPassportid() { + return passportid; + } + + public void setPassportid(String passportid) { + this.passportid = passportid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPaymentid() { + return paymentid; + } + + public void setPaymentid(String paymentid) { + this.paymentid = paymentid; + } + + public String getRequestId() { + return requestId; + } + + public void setRequestId(String requestId) { + this.requestId = requestId; + } + + public boolean isStatus() { + return status; + } + + public void setStatus(boolean status) { + this.status = status; + } + + public String getChangedFields() { + return changedFields; + } + + public void setChangedFields(String changedFields) { + this.changedFields = changedFields; + } + +} diff --git a/src/main/java/com/rekoe/domain/Permission.java b/src/main/java/com/rekoe/domain/Permission.java new file mode 100644 index 0000000..dacceb0 --- /dev/null +++ b/src/main/java/com/rekoe/domain/Permission.java @@ -0,0 +1,124 @@ +package com.rekoe.domain; + +import java.io.Serializable; +import java.util.List; + +import org.nutz.dao.entity.annotation.ColDefine; +import org.nutz.dao.entity.annotation.ColType; +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.Id; +import org.nutz.dao.entity.annotation.Index; +import org.nutz.dao.entity.annotation.ManyMany; +import org.nutz.dao.entity.annotation.One; +import org.nutz.dao.entity.annotation.Table; +import org.nutz.dao.entity.annotation.TableIndexes; + +/** + * @author 科技㊣²º¹³
+ * 2014年2月3日 下午4:48:45
+ * http://www.rekoe.com
+ * QQ:5382211 + */ +@Table("system_permission") +@TableIndexes({ @Index(name = "permission_name_index", fields = { "name" }, unique = true) }) +public class Permission implements Serializable { + private static final long serialVersionUID = -8140799124476746216L; + @Id + private Long id; + @Column + @ColDefine(type = ColType.VARCHAR, width = 200) + private String name; + @Column + @ColDefine(type = ColType.VARCHAR, width = 500) + private String description; + @ManyMany(target = Role.class, relation = "system_role_permission", from = "permissionid", to = "roleid") + private List roles; + @Column(hump = true) + private String permissionCategoryId; + @One(target = PermissionCategory.class, field = "permissionCategoryId") + private PermissionCategory permissionCategory; + @Column("is_locked") + @ColDefine(type = ColType.BOOLEAN) + private boolean locked; + + public String getPermissionCategoryId() { + return permissionCategoryId; + } + + public boolean isLocked() { + return locked; + } + + public void setLocked(boolean locked) { + this.locked = locked; + } + + public void setPermissionCategoryId(String permissionCategoryId) { + this.permissionCategoryId = permissionCategoryId; + } + + public PermissionCategory getPermissionCategory() { + return permissionCategory; + } + + public void setPermissionCategory(PermissionCategory permissionCategory) { + this.permissionCategory = permissionCategory; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public List getRoles() { + return roles; + } + + public void setRoles(List roles) { + this.roles = roles; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : id.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Permission other = (Permission) obj; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/domain/PermissionCategory.java b/src/main/java/com/rekoe/domain/PermissionCategory.java new file mode 100644 index 0000000..170bc90 --- /dev/null +++ b/src/main/java/com/rekoe/domain/PermissionCategory.java @@ -0,0 +1,59 @@ +package com.rekoe.domain; + +import java.io.Serializable; +import java.util.List; + +import org.nutz.dao.entity.annotation.ColDefine; +import org.nutz.dao.entity.annotation.ColType; +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.EL; +import org.nutz.dao.entity.annotation.Many; +import org.nutz.dao.entity.annotation.Name; +import org.nutz.dao.entity.annotation.Prev; +import org.nutz.dao.entity.annotation.Table; + +/** + * @author 科技㊣²º¹³ + * 2014年4月19日 上午8:54:23 + * http://www.rekoe.com + * QQ:5382211 + */ +@Table("permission_category") +public class PermissionCategory implements Serializable{ + + private static final long serialVersionUID = 7685127380108984960L; + @Name + @Prev(els = { @EL("uuid()") }) + private String id; + @Column + private String name; + @Many(target = Permission.class, field = "permissionCategoryId") + private List permissions; + @Column("is_locked") + @ColDefine(type = ColType.BOOLEAN) + private boolean locked; + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public List getPermissions() { + return permissions; + } + public void setPermissions(List permissions) { + this.permissions = permissions; + } + public boolean isLocked() { + return locked; + } + public void setLocked(boolean locked) { + this.locked = locked; + } +} diff --git a/src/main/java/com/rekoe/domain/PlatformConfig.java b/src/main/java/com/rekoe/domain/PlatformConfig.java new file mode 100644 index 0000000..bc498a6 --- /dev/null +++ b/src/main/java/com/rekoe/domain/PlatformConfig.java @@ -0,0 +1,90 @@ +package com.rekoe.domain; + +import java.io.Serializable; + +import org.nutz.dao.entity.annotation.ColDefine; +import org.nutz.dao.entity.annotation.ColType; +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.Comment; +import org.nutz.dao.entity.annotation.EL; +import org.nutz.dao.entity.annotation.Index; +import org.nutz.dao.entity.annotation.Name; +import org.nutz.dao.entity.annotation.Prev; +import org.nutz.dao.entity.annotation.Table; +import org.nutz.dao.entity.annotation.TableIndexes; +import org.nutz.lang.util.NutMap; + +import com.rekoe.valueadaptor.NutMapValueAdaptor; + +@Table("platform_config") +@TableIndexes({ @Index(name = "p_pid_index", fields = { "sid", "provider" }, unique = true) }) +public class PlatformConfig implements Serializable { + + private static final long serialVersionUID = -4694161925835479316L; + + @Name + @Prev(els = @EL("uuid()")) + private String id; + + @Column + private int sid; + + @Column + @Comment("平台") + private String provider; + + @Column + @ColDefine(type = ColType.TEXT, adaptor = NutMapValueAdaptor.class) + private NutMap config; + + public PlatformConfig() { + super(); + } + + public PlatformConfig(int sid, NutMap config) { + super(); + this.sid = sid; + this.provider = config.getString("provider"); + this.config = config; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getSid() { + return sid; + } + + public void setSid(int sid) { + this.sid = sid; + } + + public String getProvider() { + return provider; + } + + public void setProvider(String provider) { + this.provider = provider; + } + + public NutMap getConfig() { + if (config == null) { + config = NutMap.NEW(); + } + return config; + } + + public void setConfig(NutMap config) { + this.config = config; + } + + public PlatformConfig addPlatform(String id, NutMap config) { + this.config.addv(id, config); + return this; + } +} diff --git a/src/main/java/com/rekoe/domain/PlatformUser.java b/src/main/java/com/rekoe/domain/PlatformUser.java new file mode 100644 index 0000000..89ae583 --- /dev/null +++ b/src/main/java/com/rekoe/domain/PlatformUser.java @@ -0,0 +1,138 @@ +package com.rekoe.domain; + +import java.io.Serializable; +import java.util.Date; + +import org.nutz.dao.entity.annotation.ColDefine; +import org.nutz.dao.entity.annotation.ColType; +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.Comment; +import org.nutz.dao.entity.annotation.Default; +import org.nutz.dao.entity.annotation.Id; +import org.nutz.dao.entity.annotation.Index; +import org.nutz.dao.entity.annotation.Table; +import org.nutz.dao.entity.annotation.TableIndexes; +import org.nutz.lang.Times; + +@Table("platform_user") +@TableIndexes({ @Index(name = "passportid_pfid_pid_index", fields = { "passportid", "pfid", "pid" }, unique = true) }) +public class PlatformUser implements Serializable { + + private static final long serialVersionUID = -2735176124180310964L; + + @Id + private long id; + + @Column + private String passportid; + + @Column(hump = true) + @ColDefine(type = ColType.TIMESTAMP, insert = true) + private Date createTime; + + @Column("is_locked") + private boolean locked; + + @Column + private long openid; + + @Column("pfid") + @Comment("渠道号") + @ColDefine(type = ColType.VARCHAR, width = 50) + private String pfid; + + @Column("pid") + @Comment("平台号") + private int pid; + + @Column + @Comment("IP") + @Default("127.0.0.1") + private String addr; + + public PlatformUser() { + super(); + } + + public PlatformUser(int pid, String passportid, long openid, String pfid, String addr) { + this.pid = pid; + this.passportid = passportid; + this.createTime = Times.now(); + this.openid = openid; + this.pfid = pfid; + this.addr = addr; + } + + public PlatformUser(int pid, String passportid, long openid, String pfid) { + this.pid = pid; + this.passportid = passportid; + this.createTime = Times.now(); + this.openid = openid; + this.pfid = pfid; + } + + public long getOpenid() { + return openid; + } + + public String getAddr() { + return addr; + } + + public void setAddr(String addr) { + this.addr = addr; + } + + public void setOpenid(long openid) { + this.openid = openid; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getPassportid() { + return passportid; + } + + public void setPassportid(String passportid) { + this.passportid = passportid; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public boolean isLocked() { + return locked; + } + + public void setLocked(boolean locked) { + this.locked = locked; + } + + public String getPfid() { + return pfid; + } + + public void setPfid(String pfid) { + this.pfid = pfid; + } + + public int getPid() { + return pid; + } + + public void setPid(int pid) { + this.pid = pid; + } + +} diff --git a/src/main/java/com/rekoe/domain/ReportAds.java b/src/main/java/com/rekoe/domain/ReportAds.java new file mode 100644 index 0000000..d825e6c --- /dev/null +++ b/src/main/java/com/rekoe/domain/ReportAds.java @@ -0,0 +1,104 @@ +package com.rekoe.domain; + +import java.io.Serializable; + +import org.nutz.dao.entity.annotation.ColDefine; +import org.nutz.dao.entity.annotation.ColType; +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.EL; +import org.nutz.dao.entity.annotation.Index; +import org.nutz.dao.entity.annotation.Name; +import org.nutz.dao.entity.annotation.Prev; +import org.nutz.dao.entity.annotation.Table; +import org.nutz.dao.entity.annotation.TableIndexes; + +@Table("sg_report_ads") +@TableIndexes({ @Index(name = "report_ads_index", fields = { "pid", "pfid" }, unique = false) }) +public class ReportAds implements Serializable { + + private static final long serialVersionUID = -8361228159606140014L; + + @Name + @Prev(els = { @EL("uuid()") }) + private String id; + + @Column + private int pid; + + @Column + private String pfid; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 100) + private String idfa; + + @Column + @ColDefine(type = ColType.VARCHAR, width = 100) + private String idfv; + + @Column(hump = true) + @ColDefine(type = ColType.VARCHAR, width = 100) + private String talkingDataId; + + public ReportAds() { + super(); + } + + public ReportAds(int pid, String pfid, String idfa, String idfv, String talkingDataId) { + super(); + this.pid = pid; + this.pfid = pfid; + this.idfa = idfa; + this.idfv = idfv; + this.talkingDataId = talkingDataId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getPid() { + return pid; + } + + public void setPid(int pid) { + this.pid = pid; + } + + public String getPfid() { + return pfid; + } + + public void setPfid(String pfid) { + this.pfid = pfid; + } + + public String getIdfa() { + return idfa; + } + + public void setIdfa(String idfa) { + this.idfa = idfa; + } + + public String getIdfv() { + return idfv; + } + + public void setIdfv(String idfv) { + this.idfv = idfv; + } + + public String getTalkingDataId() { + return talkingDataId; + } + + public void setTalkingDataId(String talkingDataId) { + this.talkingDataId = talkingDataId; + } + +} diff --git a/src/main/java/com/rekoe/domain/Role.java b/src/main/java/com/rekoe/domain/Role.java new file mode 100644 index 0000000..f82fbe4 --- /dev/null +++ b/src/main/java/com/rekoe/domain/Role.java @@ -0,0 +1,101 @@ +package com.rekoe.domain; + +import java.io.Serializable; +import java.util.List; + +import org.nutz.dao.entity.annotation.ColDefine; +import org.nutz.dao.entity.annotation.ColType; +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.Id; +import org.nutz.dao.entity.annotation.Index; +import org.nutz.dao.entity.annotation.ManyMany; +import org.nutz.dao.entity.annotation.Table; +import org.nutz.dao.entity.annotation.TableIndexes; +/** + * @author 科技㊣²º¹³ + * 2014年2月3日 下午4:48:45 + * http://www.rekoe.com + * QQ:5382211 + */ +@Table("system_role") +@TableIndexes({ @Index(name = "role_name", fields = { "name" }, unique = true) }) +public class Role implements Serializable{ + private static final long serialVersionUID = 7928270441533321123L; + @Id + private Long id; + @Column + @ColDefine(type = ColType.VARCHAR, width = 200) + private String name; + @Column + @ColDefine(type = ColType.VARCHAR, width = 500) + private String description; + @ManyMany(target = User.class, relation = "system_user_role", from = "roleid", to = "userid") + private List users; + @ManyMany(target = Permission.class, relation = "system_role_permission", from = "roleid", to = "permissionid") + private List permissions; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public List getUsers() { + return users; + } + + public void setUsers(List users) { + this.users = users; + } + + public List getPermissions() { + return permissions; + } + + public void setPermissions(List permissions) { + this.permissions = permissions; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : id.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Role other = (Role) obj; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + return true; + } +} diff --git a/src/main/java/com/rekoe/domain/ServerHistory.java b/src/main/java/com/rekoe/domain/ServerHistory.java new file mode 100644 index 0000000..dd459f2 --- /dev/null +++ b/src/main/java/com/rekoe/domain/ServerHistory.java @@ -0,0 +1,102 @@ +package com.rekoe.domain; + +import java.io.Serializable; +import java.util.Date; + +import org.nutz.dao.entity.annotation.ColDefine; +import org.nutz.dao.entity.annotation.ColType; +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.Id; +import org.nutz.dao.entity.annotation.Index; +import org.nutz.dao.entity.annotation.Table; +import org.nutz.dao.entity.annotation.TableIndexes; +import org.nutz.lang.Times; + +@Table("server_history") +@TableIndexes({ @Index(name = "passportid_pid_index", fields = { "openid", "pid", "sid" }, unique = false) }) +public class ServerHistory implements Serializable { + + private static final long serialVersionUID = 4746739180924296807L; + + @Id + private long id; + + @Column + private int pid; + + @Column(hump = true) + @ColDefine(type = ColType.TIMESTAMP) + private Date createTime; + + @Column(hump = true) + @ColDefine(type = ColType.TIMESTAMP) + private Date modifyTime; + + @Column + private long openid; + + @Column + private int sid; + + public ServerHistory(long openid, int pid, int sid) { + super(); + this.pid = pid; + this.openid = openid; + this.createTime = Times.now(); + this.modifyTime = this.createTime; + this.sid = sid; + } + + public ServerHistory() { + super(); + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public int getPid() { + return pid; + } + + public void setPid(int pid) { + this.pid = pid; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public long getOpenid() { + return openid; + } + + public void setOpenid(long openid) { + this.openid = openid; + } + + public Date getModifyTime() { + return modifyTime; + } + + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + public int getSid() { + return sid; + } + + public void setSid(int sid) { + this.sid = sid; + } + +} diff --git a/src/main/java/com/rekoe/domain/User.java b/src/main/java/com/rekoe/domain/User.java new file mode 100644 index 0000000..47cde04 --- /dev/null +++ b/src/main/java/com/rekoe/domain/User.java @@ -0,0 +1,172 @@ +package com.rekoe.domain; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.nutz.dao.entity.annotation.ColDefine; +import org.nutz.dao.entity.annotation.ColType; +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.Id; +import org.nutz.dao.entity.annotation.Index; +import org.nutz.dao.entity.annotation.ManyMany; +import org.nutz.dao.entity.annotation.Table; +import org.nutz.dao.entity.annotation.TableIndexes; + +/** + * @author 科技㊣²º¹³ + * 2014年2月3日 下午4:48:45 + * http://www.rekoe.com + * QQ:5382211 + */ +@Table("system_user") +@TableIndexes({ @Index(name = "user_name", fields = { "name" }, unique = true), @Index(name = "user_openid", fields = { "openid" }, unique = true) }) +public class User implements Serializable { + + private static final long serialVersionUID = -965829144356813385L; + + @Id + private Long id; + @Column + @ColDefine(type = ColType.VARCHAR, width = 20) + private String name; + @Column + @ColDefine(type = ColType.CHAR, width = 44) + private String password; + @Column + @ColDefine(type = ColType.CHAR, width = 24) + private String salt; + @Column + @ColDefine(type = ColType.VARCHAR, width = 64) + private String openid; + @Column + @ColDefine(type = ColType.VARCHAR, width = 10) + private String providerid; + @Column("is_locked") + @ColDefine(type = ColType.BOOLEAN) + private boolean locked; + @Column + @ColDefine(type = ColType.VARCHAR, width = 500) + private String description; + @Column(hump = true) + @ColDefine(type = ColType.TIMESTAMP) + private Date createDate; + @Column(hump = true) + @ColDefine(type = ColType.VARCHAR, width = 15) + private String registerIp; + @ManyMany(target = Role.class, relation = "system_user_role", from = "userid", to = "roleid") + private List roles; + + @Column("is_system") + @ColDefine(type = ColType.BOOLEAN) + private boolean system; + + @ManyMany(target = GameServer.class, relation = "system_user_server", from = "USERID", to = "SERVERID", key = "id") + private Map servers; + + public String getProviderid() { + return providerid; + } + + public void setProviderid(String providerid) { + this.providerid = providerid; + } + + public String getOpenid() { + return openid; + } + + public void setOpenid(String openid) { + this.openid = openid; + } + + public boolean isLocked() { + return locked; + } + + public void setLocked(boolean locked) { + this.locked = locked; + } + + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + public String getRegisterIp() { + return registerIp; + } + + public void setRegisterIp(String registerIp) { + this.registerIp = registerIp; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public List getRoles() { + return roles; + } + + public void setRoles(List roles) { + this.roles = roles; + } + + public String getSalt() { + return salt; + } + + public void setSalt(String salt) { + this.salt = salt; + } + + public boolean isSystem() { + return system; + } + + public void setSystem(boolean system) { + this.system = system; + } + + public Map getServers() { + return servers; + } + + public void setServers(Map servers) { + this.servers = servers; + } + +} diff --git a/src/main/java/com/rekoe/domain/VerifyServer.java b/src/main/java/com/rekoe/domain/VerifyServer.java new file mode 100644 index 0000000..a58946f --- /dev/null +++ b/src/main/java/com/rekoe/domain/VerifyServer.java @@ -0,0 +1,111 @@ +package com.rekoe.domain; + +import java.io.Serializable; + +import org.nutz.dao.entity.annotation.ColDefine; +import org.nutz.dao.entity.annotation.Column; +import org.nutz.dao.entity.annotation.Comment; +import org.nutz.dao.entity.annotation.EL; +import org.nutz.dao.entity.annotation.Index; +import org.nutz.dao.entity.annotation.Name; +import org.nutz.dao.entity.annotation.One; +import org.nutz.dao.entity.annotation.Prev; +import org.nutz.dao.entity.annotation.Table; +import org.nutz.dao.entity.annotation.TableIndexes; + +/** + * 提审服 + * + * @author kouxian + * + */ +@Table("verify_server") +@TableIndexes({ @Index(name = "g_sid_index", fields = { "pid" }, unique = true) }) +public class VerifyServer implements Serializable { + + private static final long serialVersionUID = -2235259090910419768L; + + @Name + @Prev(els = { @EL("uuid()") }) + private String id; + + @Column + @ColDefine(width = 225) + private String url; + + @Column + private String name; + + @Column(hump = true) + @Comment("登陆服地址") + @ColDefine(width = 225) + private String loginUrl; + + @Column(hump = true) + @Comment("充值地址") + @ColDefine(width = 225) + private String payUrl; + + @Column("pid") + private int pid; + + @One(target = GameServer.class, field = "pid") + private GameServer gameServer; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getLoginUrl() { + return loginUrl; + } + + public void setLoginUrl(String loginUrl) { + this.loginUrl = loginUrl; + } + + public String getPayUrl() { + return payUrl; + } + + public void setPayUrl(String payUrl) { + this.payUrl = payUrl; + } + + public int getPid() { + return pid; + } + + public void setPid(int pid) { + this.pid = pid; + } + + public GameServer getGameServer() { + return gameServer; + } + + public void setGameServer(GameServer gameServer) { + this.gameServer = gameServer; + } + +} diff --git a/src/main/java/com/rekoe/exception/CreateUserSaltException.java b/src/main/java/com/rekoe/exception/CreateUserSaltException.java new file mode 100644 index 0000000..d72cbe2 --- /dev/null +++ b/src/main/java/com/rekoe/exception/CreateUserSaltException.java @@ -0,0 +1,29 @@ +package com.rekoe.exception; + +import org.apache.shiro.authc.AuthenticationException; +/** + * @author 科技㊣²º¹³ + * 2014年2月3日 下午4:48:45 + * http://www.rekoe.com + * QQ:5382211 + */ +public class CreateUserSaltException extends AuthenticationException { + + private static final long serialVersionUID = 3315875923669742156L; + + public CreateUserSaltException() { + super(); + } + + public CreateUserSaltException(String message, Throwable cause) { + super(message, cause); + } + + public CreateUserSaltException(String message) { + super(message); + } + + public CreateUserSaltException(Throwable cause) { + super(cause); + } +} diff --git a/src/main/java/com/rekoe/exception/IncorrectCaptchaException.java b/src/main/java/com/rekoe/exception/IncorrectCaptchaException.java new file mode 100644 index 0000000..6214860 --- /dev/null +++ b/src/main/java/com/rekoe/exception/IncorrectCaptchaException.java @@ -0,0 +1,29 @@ +package com.rekoe.exception; + +import org.apache.shiro.authc.AuthenticationException; +/** + * @author 科技㊣²º¹³ + * 2014年2月3日 下午4:48:45 + * http://www.rekoe.com + * QQ:5382211 + */ +public class IncorrectCaptchaException extends AuthenticationException { + + private static final long serialVersionUID = 3315875923669742156L; + + public IncorrectCaptchaException() { + super(); + } + + public IncorrectCaptchaException(String message, Throwable cause) { + super(message, cause); + } + + public IncorrectCaptchaException(String message) { + super(message); + } + + public IncorrectCaptchaException(Throwable cause) { + super(cause); + } +} diff --git a/src/main/java/com/rekoe/filter/AbstractCrossOriginFilter.java b/src/main/java/com/rekoe/filter/AbstractCrossOriginFilter.java new file mode 100644 index 0000000..bfde07d --- /dev/null +++ b/src/main/java/com/rekoe/filter/AbstractCrossOriginFilter.java @@ -0,0 +1,28 @@ +package com.rekoe.filter; + +import javax.servlet.http.HttpServletResponse; + +import org.nutz.ioc.impl.PropertiesProxy; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.mvc.ActionContext; +import org.nutz.mvc.ActionFilter; +import org.nutz.mvc.View; + +public abstract class AbstractCrossOriginFilter implements ActionFilter { + + @Inject + protected PropertiesProxy conf; + + @Override + public View match(ActionContext ac) { + if (on()) { + HttpServletResponse response = ac.getResponse(); + addHeader(response); + } + return null; + } + + protected abstract boolean on(); + + protected abstract void addHeader(HttpServletResponse response); +} diff --git a/src/main/java/com/rekoe/filter/AuthenticationFilter.java b/src/main/java/com/rekoe/filter/AuthenticationFilter.java new file mode 100644 index 0000000..bc01b14 --- /dev/null +++ b/src/main/java/com/rekoe/filter/AuthenticationFilter.java @@ -0,0 +1,34 @@ +package com.rekoe.filter; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.web.filter.authc.FormAuthenticationFilter; +import org.nutz.mvc.ActionContext; +import org.nutz.mvc.ActionFilter; +import org.nutz.mvc.View; +/** + * @author 科技㊣²º¹³ + * 2014年2月3日 下午4:48:45 + * http://www.rekoe.com + * QQ:5382211 + */ +public class AuthenticationFilter extends FormAuthenticationFilter implements ActionFilter { + + protected AuthenticationToken createToken(HttpServletRequest request) { + String username = getUsername(request); + String password = getPassword(request); + boolean rememberMe = isRememberMe(request); + String host = getHost(request); + return new UsernamePasswordToken(username, password, rememberMe, host); + } + + @Override + public View match(ActionContext actionContext) { + HttpServletRequest request = actionContext.getRequest(); + AuthenticationToken authenticationToken = createToken(request); + request.setAttribute("loginToken", authenticationToken); + return null; + } +} diff --git a/src/main/java/com/rekoe/filter/ChectServerExitsActionFilter.java b/src/main/java/com/rekoe/filter/ChectServerExitsActionFilter.java new file mode 100644 index 0000000..89db8ae --- /dev/null +++ b/src/main/java/com/rekoe/filter/ChectServerExitsActionFilter.java @@ -0,0 +1,57 @@ +package com.rekoe.filter; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.lang3.StringUtils; +import org.nutz.dao.Cnd; +import org.nutz.integration.shiro.NutShiro; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.mvc.ActionContext; +import org.nutz.mvc.ActionFilter; +import org.nutz.mvc.View; +import org.nutz.mvc.view.UTF8JsonView; +import org.nutz.mvc.view.ViewWrapper; +import org.nutz.plugins.view.freemarker.FreeMarkerConfigurer; +import org.nutz.plugins.view.freemarker.FreemarkerView; + +import com.rekoe.common.Message; +import com.rekoe.domain.GameServer; +import com.rekoe.service.GameServerService; + +@IocBean +public class ChectServerExitsActionFilter implements ActionFilter { + + @Inject + private FreeMarkerConfigurer freeMarkerConfigurer; + + @Inject + private GameServerService gameServerService; + + public View match(final ActionContext ctx) { + HttpServletRequest req = ctx.getRequest(); + String pid = req.getParameter("pid"); + if (StringUtils.isNotBlank(pid)) { + GameServer gameServer = gameServerService.fetch(Cnd.where("pid", "=", pid)); + if (Lang.isEmpty(gameServer)) { + if (NutShiro.isAjax(ctx.getRequest())) { + ctx.getResponse().setHeader("loginStatus", getResStatus()); + return new ViewWrapper(UTF8JsonView.COMPACT, getResStatus()); + } + return getErrView(ctx.getRequest()); + } else { + req.getSession().setAttribute("sid", gameServer.getId()); + } + } + return null; + } + + public String getResStatus() { + return "server_not_exits"; + } + + public View getErrView(HttpServletRequest req) { + return new ViewWrapper(new FreemarkerView(freeMarkerConfigurer, "template/admin/common/error"), Message.error("server_not_exits", req)); + } +} diff --git a/src/main/java/com/rekoe/filter/IPFilter.java b/src/main/java/com/rekoe/filter/IPFilter.java new file mode 100644 index 0000000..590fc72 --- /dev/null +++ b/src/main/java/com/rekoe/filter/IPFilter.java @@ -0,0 +1,120 @@ +package com.rekoe.filter; + +import java.io.File; +import java.util.HashSet; +import java.util.Set; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.vfs2.FileChangeEvent; +import org.apache.commons.vfs2.FileListener; +import org.apache.commons.vfs2.FileName; +import org.apache.commons.vfs2.FileSystemManager; +import org.apache.commons.vfs2.VFS; +import org.apache.commons.vfs2.impl.DefaultFileMonitor; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Files; +import org.nutz.lang.Lang; +import org.nutz.lang.util.Callback; +import org.nutz.log.Log; +import org.nutz.log.Logs; +import org.nutz.mvc.ActionContext; +import org.nutz.mvc.ActionFilter; +import org.nutz.mvc.Mvcs; +import org.nutz.mvc.View; +import org.nutz.mvc.view.RawView; +import org.nutz.mvc.view.ViewWrapper; + +import com.rekoe.utils.CommonUtils; + +@IocBean(create = "init") +public class IPFilter implements ActionFilter { + + private final static Log log = Logs.get(); + protected static final String IP_WHITE_LIST = "ipwhite"; + protected String configPath = ""; + protected Set ipWhiteSet = new HashSet(); + private final View IP_FORBIT_ERROR = new ViewWrapper(new RawView(""), "非法IP"); + + /* 初始化 */ + public void init() throws ServletException { + configPath = Mvcs.getNutConfig().getAppRoot() + "/../conf/"; + refreshIPList(); + initFileMonitor(); + } + + private void refreshIPList() { + try { + File file = Files.findFile(IP_WHITE_LIST); + if (Lang.isEmpty(file)) { + file = Files.findFile(configPath + IP_WHITE_LIST); + } + if (Lang.isEmpty(file)) { + this.ipWhiteSet = null; + return; + } + final Set ips = new HashSet(); + Files.readLine(file, new Callback() { + @Override + public void invoke(String str) { + ips.add(str); + } + }); + this.ipWhiteSet = ips; + } catch (Exception e) { + log.error(e); + } + } + + @Override + public View match(ActionContext actionContext) { + HttpServletRequest req = actionContext.getRequest(); + String remoteIP = Lang.getIP(req); + if (log.isDebugEnabled()) { + log.debug(" ip file pass " + remoteIP); + } + if (this.ipWhiteSet == null || this.ipWhiteSet.isEmpty()) + return null; + if (this.ipWhiteSet.contains(remoteIP) || CommonUtils.isInnerIP(remoteIP)) { + return null; + } + return IP_FORBIT_ERROR; + } + + private void initFileMonitor() { + FileSystemManager fsManager = null; + org.apache.commons.vfs2.FileObject listendir = null; + try { + fsManager = VFS.getManager(); + listendir = fsManager.resolveFile(new File(configPath).getAbsolutePath()); + } catch (org.apache.commons.vfs2.FileSystemException e) { + log.error(e); + } + + DefaultFileMonitor fm = new DefaultFileMonitor(new FileListener() { + public void fileCreated(FileChangeEvent event) throws Exception { + monitor(event); + } + + public void fileDeleted(FileChangeEvent event) throws Exception { + monitor(event); + } + + public void fileChanged(FileChangeEvent event) throws Exception { + monitor(event); + } + + private void monitor(FileChangeEvent event) { + org.apache.commons.vfs2.FileObject fileObject = event.getFile(); + FileName fileName = fileObject.getName(); + if (fileName.getBaseName().contains(IP_WHITE_LIST)) { + refreshIPList(); + } + } + }); + fm.setRecursive(true); + fm.addFile(listendir); + fm.start(); + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/filter/OauthCrossOriginFilter.java b/src/main/java/com/rekoe/filter/OauthCrossOriginFilter.java new file mode 100644 index 0000000..cacf3c4 --- /dev/null +++ b/src/main/java/com/rekoe/filter/OauthCrossOriginFilter.java @@ -0,0 +1,19 @@ +package com.rekoe.filter; + +import javax.servlet.http.HttpServletResponse; + +public class OauthCrossOriginFilter extends AbstractCrossOriginFilter { + + @Override + protected boolean on() { + return true; + } + + @Override + protected void addHeader(HttpServletResponse response) { + response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Allow-Methods", "get, post, put, delete, options"); + response.addHeader("Access-Control-Allow-Headers", "origin, content-type, accept"); + response.addHeader("Access-Control-Allow-Credentials", "true"); + } +} diff --git a/src/main/java/com/rekoe/filter/SelectServerActionFilter.java b/src/main/java/com/rekoe/filter/SelectServerActionFilter.java new file mode 100644 index 0000000..77c04bd --- /dev/null +++ b/src/main/java/com/rekoe/filter/SelectServerActionFilter.java @@ -0,0 +1,46 @@ +package com.rekoe.filter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import org.nutz.integration.shiro.NutShiro; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.mvc.ActionContext; +import org.nutz.mvc.ActionFilter; +import org.nutz.mvc.View; +import org.nutz.mvc.view.UTF8JsonView; +import org.nutz.mvc.view.ViewWrapper; +import org.nutz.plugins.view.freemarker.FreeMarkerConfigurer; +import org.nutz.plugins.view.freemarker.FreemarkerView; + +import com.rekoe.common.Message; + +@IocBean +public class SelectServerActionFilter implements ActionFilter { + + @Inject + private FreeMarkerConfigurer freeMarkerConfigurer; + + public View match(final ActionContext ctx) { + HttpSession session = ctx.getRequest().getSession(); + Object sid = session.getAttribute("sid"); + if (Lang.isEmpty(sid)) { + if (NutShiro.isAjax(ctx.getRequest())) { + ctx.getResponse().setHeader("loginStatus", getResStatus()); + return new ViewWrapper(UTF8JsonView.COMPACT, getResStatus()); + } + return getErrView(ctx.getRequest()); + } + return null; + } + + public String getResStatus() { + return "select_server"; + } + + public View getErrView(HttpServletRequest req) { + return new ViewWrapper(new FreemarkerView(freeMarkerConfigurer, "template/admin/common/error"), Message.error("admin.common.error.no.server", req)); + } +} diff --git a/src/main/java/com/rekoe/filter/ServerPermisionActionFilter.java b/src/main/java/com/rekoe/filter/ServerPermisionActionFilter.java new file mode 100644 index 0000000..6abb045 --- /dev/null +++ b/src/main/java/com/rekoe/filter/ServerPermisionActionFilter.java @@ -0,0 +1,75 @@ +package com.rekoe.filter; + +import java.util.Collection; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang3.math.NumberUtils; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.subject.Subject; +import org.nutz.integration.shiro.NutShiro; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.mvc.ActionContext; +import org.nutz.mvc.ActionFilter; +import org.nutz.mvc.View; +import org.nutz.mvc.view.UTF8JsonView; +import org.nutz.mvc.view.ViewWrapper; +import org.nutz.plugins.view.freemarker.FreeMarkerConfigurer; +import org.nutz.plugins.view.freemarker.FreemarkerView; + +import com.rekoe.common.Message; +import com.rekoe.domain.GameServer; +import com.rekoe.domain.User; + +@IocBean +public class ServerPermisionActionFilter implements ActionFilter { + + @Inject + private FreeMarkerConfigurer freeMarkerConfigurer; + + public View match(final ActionContext ctx) { + HttpServletRequest req = ctx.getRequest(); + Object sid = req.getParameter("platformid"); + if (Lang.isEmpty(sid)) { + return getErrView(req, ctx.getResponse()); + } + boolean isRight = false; + Subject subject = SecurityUtils.getSubject(); + if (subject.getPrincipal() instanceof User) { + User user = (User) subject.getPrincipal(); + Map servers = user.getServers(); + if (user.isSystem()) { + isRight = true; + } else if (!Lang.isEmpty(servers)) { + int pid = NumberUtils.toInt(sid.toString()); + Collection games = servers.values(); + for (GameServer game : games) { + if (game.getPid() == pid) { + isRight = true; + break; + } + } + } + } + if (isRight) { + return null; + } + return getErrView(req, ctx.getResponse()); + } + + public String getResStatus() { + return "unauthorized"; + } + + public View getErrView(HttpServletRequest req, HttpServletResponse resp) { + if (NutShiro.isAjax(req)) { + resp.setHeader("loginStatus", getResStatus()); + return new ViewWrapper(UTF8JsonView.COMPACT, getResStatus()); + } + return new ViewWrapper(new FreemarkerView(freeMarkerConfigurer, "template/admin/common/error"), Message.error(getResStatus(), req)); + } +} diff --git a/src/main/java/com/rekoe/mobile/AbstractParam.java b/src/main/java/com/rekoe/mobile/AbstractParam.java new file mode 100644 index 0000000..fc492ad --- /dev/null +++ b/src/main/java/com/rekoe/mobile/AbstractParam.java @@ -0,0 +1,8 @@ +package com.rekoe.mobile; + +public abstract class AbstractParam { + + public abstract String getProviderId(); + + public abstract int getPid(); +} diff --git a/src/main/java/com/rekoe/mobile/AuthProvider.java b/src/main/java/com/rekoe/mobile/AuthProvider.java new file mode 100644 index 0000000..a285753 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/AuthProvider.java @@ -0,0 +1,11 @@ +package com.rekoe.mobile; + +public abstract class AuthProvider { + + public abstract String getProviderId(); + + public abstract Profile verifyResponse(T param) throws Exception; + + public abstract Class getEntityClass(); + +} diff --git a/src/main/java/com/rekoe/mobile/Profile.java b/src/main/java/com/rekoe/mobile/Profile.java new file mode 100644 index 0000000..fb1ae3a --- /dev/null +++ b/src/main/java/com/rekoe/mobile/Profile.java @@ -0,0 +1,64 @@ +package com.rekoe.mobile; + +import java.io.Serializable; + +import org.nutz.lang.util.NutMap; + +public class Profile implements Serializable { + + public static final String TOKEN = "token"; + private static final long serialVersionUID = -3916223452935420808L; + + private String providerId; + private String passportid; + private int pid; + private NutMap pros = NutMap.NEW(); + + public Profile(String providerId, String passportid, int pid) { + super(); + this.providerId = providerId; + this.passportid = passportid; + this.pid = pid; + } + + public Profile(String providerId, long passportid, int pid) { + super(); + this.providerId = providerId; + this.passportid = String.valueOf(passportid); + this.pid = pid; + } + + public String getToken() { + return pros.getString(TOKEN); + } + + public int getPid() { + return pid; + } + + public String getProviderId() { + return providerId; + } + + public void setProviderId(String providerId) { + this.providerId = providerId; + } + + public String getPassportid() { + return passportid; + } + + public void setPassportid(String passportid) { + this.passportid = passportid; + } + + public Profile addv(String key, Object obj) { + pros.addv(key, obj); + return this; + } + + public NutMap getPros() { + return pros; + } + +} diff --git a/src/main/java/com/rekoe/mobile/exception/SignatureException.java b/src/main/java/com/rekoe/mobile/exception/SignatureException.java new file mode 100644 index 0000000..d8f215c --- /dev/null +++ b/src/main/java/com/rekoe/mobile/exception/SignatureException.java @@ -0,0 +1,56 @@ +/* + =========================================================================== + Copyright (c) 2010 BrickRed Technologies Limited + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sub-license, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE 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 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + =========================================================================== + + */ +package com.rekoe.mobile.exception; + +public class SignatureException extends Exception { + + private static final long serialVersionUID = -3832456866408848000L; + + public SignatureException() { + super(); + } + + /** + * @param message + */ + public SignatureException(final String message) { + super(message); + } + + /** + * @param cause + */ + public SignatureException(final Throwable cause) { + super(cause); + } + + /** + * @param message + * @param cause + */ + public SignatureException(final String message, final Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/com/rekoe/mobile/exception/SocialAuthConfigurationException.java b/src/main/java/com/rekoe/mobile/exception/SocialAuthConfigurationException.java new file mode 100644 index 0000000..f591ab5 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/exception/SocialAuthConfigurationException.java @@ -0,0 +1,57 @@ +/* + =========================================================================== + Copyright (c) 2010 BrickRed Technologies Limited + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sub-license, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE 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 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + =========================================================================== + + */ +package com.rekoe.mobile.exception; + +public class SocialAuthConfigurationException extends Exception { + + private static final long serialVersionUID = 477153534655510364L; + + public SocialAuthConfigurationException() { + super(); + } + + /** + * @param message + */ + public SocialAuthConfigurationException(final String message) { + super(message); + } + + /** + * @param cause + */ + public SocialAuthConfigurationException(final Throwable cause) { + super(cause); + } + + /** + * @param message + * @param cause + */ + public SocialAuthConfigurationException(final String message, + final Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/com/rekoe/mobile/exception/SocialAuthException.java b/src/main/java/com/rekoe/mobile/exception/SocialAuthException.java new file mode 100644 index 0000000..43bde86 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/exception/SocialAuthException.java @@ -0,0 +1,56 @@ +/* + =========================================================================== + Copyright (c) 2010 BrickRed Technologies Limited + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sub-license, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE 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 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + =========================================================================== + + */ +package com.rekoe.mobile.exception; + +public class SocialAuthException extends Exception { + + private static final long serialVersionUID = -1873507695230807487L; + + public SocialAuthException() { + super(); + } + + /** + * @param message + */ + public SocialAuthException(final String message) { + super(message); + } + + /** + * @param cause + */ + public SocialAuthException(final Throwable cause) { + super(cause); + } + + /** + * @param message + * @param cause + */ + public SocialAuthException(final String message, final Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/com/rekoe/mobile/exception/SocialAuthManagerStateException.java b/src/main/java/com/rekoe/mobile/exception/SocialAuthManagerStateException.java new file mode 100644 index 0000000..e245fda --- /dev/null +++ b/src/main/java/com/rekoe/mobile/exception/SocialAuthManagerStateException.java @@ -0,0 +1,41 @@ +/* + =========================================================================== + Copyright (c) 2010 BrickRed Technologies Limited + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sub-license, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE 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 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + =========================================================================== + + */ +package com.rekoe.mobile.exception; + +public class SocialAuthManagerStateException extends Exception { + + private static final long serialVersionUID = -4089035676676970803L; + private static final String errorMessage = "This is not the same SocailAuthManager object that was used for login."; + private static final String resolution = "Please check if you have called getAuthenticationUrl() method before calling connect()"; + + public SocialAuthManagerStateException() { + super(); + } + + @Override + public String toString() { + return errorMessage + resolution; + } +} diff --git a/src/main/java/com/rekoe/mobile/provider/AbstractProvider.java b/src/main/java/com/rekoe/mobile/provider/AbstractProvider.java new file mode 100644 index 0000000..04d90fb --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/AbstractProvider.java @@ -0,0 +1,199 @@ +package com.rekoe.mobile.provider; + +import java.io.Serializable; +import java.util.Map; + +import org.nutz.http.Http; +import org.nutz.http.Request; +import org.nutz.http.Request.METHOD; +import org.nutz.http.Response; +import org.nutz.http.Sender; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.json.Json; +import org.nutz.lang.Lang; +import org.nutz.lang.Mirror; +import org.nutz.lang.Strings; +import org.nutz.log.Log; +import org.nutz.log.Logs; + +import com.rekoe.domain.PlatformConfig; +import com.rekoe.mobile.AbstractParam; +import com.rekoe.mobile.AuthProvider; +import com.rekoe.service.PlatformConfigService; + +public abstract class AbstractProvider extends AuthProvider implements Serializable { + + private static final long serialVersionUID = 3293830764207197084L; + + private Mirror mirror; + + private static final Log log = Logs.get(); + + @Inject + private PlatformConfigService platformConfigService; + + /** + * 本抽象类能提供一些帮助方法,减少重复写实体类型的麻烦 + */ + public AbstractProvider() { + try { + Class entryClass = Mirror.getTypeParam(getClass(), 0); + mirror = Mirror.me(entryClass); + if (log.isDebugEnabled()) + log.debugf("Get TypeParams for self : %s", entryClass.getName()); + } catch (Throwable e) { + if (log.isWarnEnabled()) + log.warn("!!!Fail to get TypeParams for self!", e); + } + } + + public PlatformConfig getPlatformConfig(int pid) { + PlatformConfig pc = platformConfigService.getPlatformConfig(pid, getProviderId()); + if (Lang.isEmpty(pc)) { + throw Lang.makeThrow(NullPointerException.class, "Can`t find %s PlatformConfig", getProviderId()); + } + return pc; + } + + /** + * 获取实体类型 + * + * @return 实体类型 + */ + public Class getEntityClass() { + return mirror.getType(); + } + + public String HttpGet(String url) { + return HttpGet(url, def_num); + } + + private String HttpGet(String url, int num) { + try { + return Http.get(url).getContent(); + } catch (Exception e) { + log.errorf("net Connect Err,url=%s", url); + if (num > 0 && num < max) { + num--; + HttpGet(url, num); + } + } + return "{}"; + } + + public String httpPost(String url, Map params) { + return httpPost(url, params, def_num); + } + + private String httpPost(String url, Map params, int num) { + try { + Response res = Http.post2(url, params, 6000); + if (res.isOK()) { + return res.getContent(); + } + } catch (Exception e) { + log.errorf("net Connect Err,url=%s", url); + if (num > 0 && num < max) { + num--; + httpPost(url, params, num); + } + } + return "{}"; + } + + public String HttpsGet(String url) { + return HttpsGet(url, def_num); + } + + private String HttpsGet(String url, int num) { + try { + Http.disableJvmHttpsCheck(); + return Http.get(url).getContent(); + } catch (Exception e) { + log.errorf("net Connect Err,url=%s", url); + if (num > 0 && num < max) { + num--; + HttpsGet(url, num); + } + } + return "{}"; + } + + public String httpsPost(String url, Map params) { + return httpsPost(url, params, def_num); + } + + private String httpsPost(String url, Map params, int num) { + try { + Http.disableJvmHttpsCheck(); + Response res = Http.post2(url, params, 6000); + if (res.isOK()) { + return res.getContent(); + } + } catch (Exception e) { + log.errorf("net Connect Err,url=%s", url); + if (num > 0 && num < max) { + num--; + httpsPost(url, params, num); + } + } + return "{}"; + } + + public String httpsPostBody(String url, String data) { + return httpsPostBody(url, data, def_num); + } + + public String httpPostBody(String url, String data) { + return httpPostBody(url, data, def_num); + } + + private String httpPostBody(String url, String data, int num) { + Request req = Request.create(url, METHOD.POST); + req.getHeader().set("Content-Type", "application/json:charset=utf-8 "); + req.setData(data); + try { + Response resp = Sender.create(req).send(); + return resp.getContent(); + } catch (Exception e) { + log.errorf("net Connect Err,url=%s", url); + if (num > 0 && num < max) { + num--; + httpPostBody(url, data, num); + } + } + return "{}"; + } + + private String httpsPostBody(String url, String data, int num) { + Http.disableJvmHttpsCheck(); + Request req = Request.create(url, METHOD.POST); + req.getHeader().set("Content-Type", "application/json:charset=utf-8 "); + req.setData(data); + try { + Response resp = Sender.create(req).send(); + return resp.getContent(); + } catch (Exception e) { + log.errorf("net Connect Err,url=%s", url); + if (num > 0 && num < max) { + num--; + httpsPostBody(url, data, num); + } + } + return "{}"; + } + + public Map result2Json(String jsonStr, Class eleType) throws Exception { + if (Strings.isBlank(jsonStr)) { + throw Lang.makeThrow("%s callBack is Blank", getProviderId()); + } + return Json.fromJsonAsMap(eleType, jsonStr); + } + + public Map result2Json(String jsonStr, Class eleType, String def) throws Exception { + return Json.fromJsonAsMap(eleType, Strings.isBlank(jsonStr) ? def : jsonStr); + } + + private final int max = 5; + private final int def_num = 1; +} diff --git a/src/main/java/com/rekoe/mobile/provider/PlatformProvider.java b/src/main/java/com/rekoe/mobile/provider/PlatformProvider.java new file mode 100644 index 0000000..f5a2952 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/PlatformProvider.java @@ -0,0 +1,27 @@ +package com.rekoe.mobile.provider; + +public class PlatformProvider { + + private final String providerId; + private final String name; + private final String pfid; + + public PlatformProvider(final String providerId, final String name, final String pfid) { + this.providerId = providerId; + this.name = name; + this.pfid = pfid; + } + + public String getProviderId() { + return providerId; + } + + public String getName() { + return name; + } + + public String getPfid() { + return pfid; + } + +} diff --git a/src/main/java/com/rekoe/mobile/provider/PlatformProviderFactory.java b/src/main/java/com/rekoe/mobile/provider/PlatformProviderFactory.java new file mode 100644 index 0000000..a8e73b3 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/PlatformProviderFactory.java @@ -0,0 +1,32 @@ +package com.rekoe.mobile.provider; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.nutz.lang.Lang; + +public class PlatformProviderFactory { + + private Map platforms = new HashMap(); + + public void setPlatformProviders(List> platformProviders) { + int len = platformProviders.size(); + for (int i = 0; i < len; i++) { + List args = platformProviders.get(i); + int j = args.size(); + if (j != 3) { + continue; + } + platforms.put(args.get(1), new PlatformProvider(args.get(0), args.get(2), args.get(1))); + } + } + + public PlatformProvider getPlatformProvider(String pfid) { + PlatformProvider pf = platforms.get(pfid); + if (Lang.isEmpty(pf)) { + Lang.makeThrow("Can`t define type[%s]", pfid); + } + return pf; + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/mobile/provider/a91/A91Param.java b/src/main/java/com/rekoe/mobile/provider/a91/A91Param.java new file mode 100644 index 0000000..b3be2c2 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/a91/A91Param.java @@ -0,0 +1,40 @@ +package com.rekoe.mobile.provider.a91; + +import java.io.Serializable; + +import com.rekoe.mobile.AbstractParam; +import com.rekoe.utils.Constants; + +public class A91Param extends AbstractParam implements Serializable{ + + private static final long serialVersionUID = -4493840542767841651L; + private String sessionid; + private int pid; + + public void setSessionid(int pid, String sessionid) { + this.sessionid = sessionid; + this.pid = pid; + } + + public String getSessionid() { + return sessionid; + } + + public void setSessionid(String sessionid) { + this.sessionid = sessionid; + } + + public int getPid() { + return pid; + } + + public void setPid(int pid) { + this.pid = pid; + } + + @Override + public String getProviderId(){ + return Constants.A91; + } + +} diff --git a/src/main/java/com/rekoe/mobile/provider/a91/A91Provider.java b/src/main/java/com/rekoe/mobile/provider/a91/A91Provider.java new file mode 100644 index 0000000..c252f71 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/a91/A91Provider.java @@ -0,0 +1,58 @@ +package com.rekoe.mobile.provider.a91; + +import java.net.URLDecoder; +import java.util.HashMap; +import java.util.Map; + +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.lang.Lang; +import org.nutz.log.Log; +import org.nutz.log.Logs; +import org.nutz.repo.Base64; + +import com.rekoe.annotation.PlatformProvider; +import com.rekoe.domain.PlatformConfig; +import com.rekoe.mobile.Profile; +import com.rekoe.mobile.provider.AbstractProvider; +import com.rekoe.utils.Constants; + +@IocBean +@PlatformProvider(name = Constants.A91) +public class A91Provider extends AbstractProvider { + + private static final long serialVersionUID = 1L; + private final static Log log = Logs.get(); + private final String VALID_TOKEN_ADDR = "http://querysdkapi.91.com/CpLoginStateQuery.ashx";// 接口地址 + + @Override + public String getProviderId() { + return Constants.A91; + } + + @Override + public Profile verifyResponse(A91Param param) throws Exception { + PlatformConfig platformConfig = getPlatformConfig(param.getPid()); + String str = platformConfig.getConfig().getString("appid") + param.getSessionid() + platformConfig.getConfig().getString("secret");// 签名 + String sign = Lang.md5(str); + Map params = new HashMap<>(); + params.put("AppID", platformConfig.getConfig().getString("appid")); + params.put("AccessToken", param.getSessionid()); + params.put("Sign", sign.toLowerCase()); + String result = httpPost(VALID_TOKEN_ADDR, params); + A91ReturnParam ret = Json.fromJson(A91ReturnParam.class, result); + if (ret.getResultCode() == 1) { + String con = URLDecoder.decode(ret.getContent(), "utf-8"); + String temp = platformConfig.getConfig().getString("appid") + ret.getResultCode() + con + platformConfig.getConfig().getString("secret"); + String sign1 = Lang.md5(temp); + if (sign1.equalsIgnoreCase(ret.getSign())) { + A91UserInfo info = Json.fromJson(A91UserInfo.class, new String(Base64.decode(con))); + return new Profile(getProviderId(), info.getUID(), param.getPid()); + } + } else { + log.error(result); + } + return null; + } + +} diff --git a/src/main/java/com/rekoe/mobile/provider/a91/A91ReturnParam.java b/src/main/java/com/rekoe/mobile/provider/a91/A91ReturnParam.java new file mode 100644 index 0000000..badf9c5 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/a91/A91ReturnParam.java @@ -0,0 +1,53 @@ +package com.rekoe.mobile.provider.a91; + +import org.nutz.json.JsonField; + +public class A91ReturnParam { + + @JsonField("AppID") + private int appID; + @JsonField("ResultCode") + private int resultCode; + @JsonField("ResultMsg") + private String resultMsg; + @JsonField("Sign") + private String sign; + @JsonField("Content") + private String content; + + + + public int getAppID() { + return appID; + } + public void setAppID(int appID) { + this.appID = appID; + } + public int getResultCode() { + return resultCode; + } + public void setResultCode(int resultCode) { + this.resultCode = resultCode; + } + public String getResultMsg() { + return resultMsg; + } + public void setResultMsg(String resultMsg) { + this.resultMsg = resultMsg; + } + public String getSign() { + return sign; + } + public void setSign(String sign) { + this.sign = sign; + } + public String getContent() { + return content; + } + public void setContent(String content) { + this.content = content; + } + + + +} diff --git a/src/main/java/com/rekoe/mobile/provider/a91/A91UserInfo.java b/src/main/java/com/rekoe/mobile/provider/a91/A91UserInfo.java new file mode 100644 index 0000000..23198dd --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/a91/A91UserInfo.java @@ -0,0 +1,14 @@ +package com.rekoe.mobile.provider.a91; + +public class A91UserInfo { + private String UID; + + public String getUID() { + return UID; + } + + public void setUID(String uID) { + UID = uID; + } + +} diff --git a/src/main/java/com/rekoe/mobile/provider/google/GoogleParam.java b/src/main/java/com/rekoe/mobile/provider/google/GoogleParam.java new file mode 100644 index 0000000..a370267 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/google/GoogleParam.java @@ -0,0 +1,16 @@ +package com.rekoe.mobile.provider.google; + +import java.io.Serializable; + +import com.rekoe.mobile.provider.googlep.GooglePParam; +import com.rekoe.utils.Constants; + +public class GoogleParam extends GooglePParam implements Serializable { + + private static final long serialVersionUID = -1122775243733543089L; + + @Override + public String getProviderId() { + return Constants.GOOGLE; + } +} diff --git a/src/main/java/com/rekoe/mobile/provider/google/GoogleProvider.java b/src/main/java/com/rekoe/mobile/provider/google/GoogleProvider.java new file mode 100644 index 0000000..08139a6 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/google/GoogleProvider.java @@ -0,0 +1,20 @@ +package com.rekoe.mobile.provider.google; + +import org.nutz.ioc.loader.annotation.IocBean; + +import com.rekoe.annotation.PlatformProvider; +import com.rekoe.mobile.provider.googlep.GooglePProvider; +import com.rekoe.utils.Constants; + +@IocBean +@PlatformProvider(name = Constants.GOOGLE) +public class GoogleProvider extends GooglePProvider { + + private static final long serialVersionUID = 7944880275608182543L; + + @Override + public String getProviderId() { + return Constants.GOOGLE; + } + +} diff --git a/src/main/java/com/rekoe/mobile/provider/googlep/GooglePParam.java b/src/main/java/com/rekoe/mobile/provider/googlep/GooglePParam.java new file mode 100644 index 0000000..92880ed --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/googlep/GooglePParam.java @@ -0,0 +1,41 @@ +package com.rekoe.mobile.provider.googlep; + +import java.io.Serializable; + +import com.rekoe.mobile.AbstractParam; +import com.rekoe.utils.Constants; + +public class GooglePParam extends AbstractParam implements Serializable { + + private static final long serialVersionUID = -1122775243733543089L; + + private String token; + + private int pid; + + public GooglePParam() { + } + + @Override + public String getProviderId() { + return Constants.GOOGLE_PLAY; + } + + @Override + public int getPid() { + return pid; + } + + public void setPid(int pid) { + this.pid = pid; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + +} diff --git a/src/main/java/com/rekoe/mobile/provider/googlep/GooglePProvider.java b/src/main/java/com/rekoe/mobile/provider/googlep/GooglePProvider.java new file mode 100644 index 0000000..37b92c6 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/googlep/GooglePProvider.java @@ -0,0 +1,141 @@ +package com.rekoe.mobile.provider.googlep; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.nutz.http.Request; +import org.nutz.http.Request.METHOD; +import org.nutz.http.Sender; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.json.JsonFormat; +import org.nutz.lang.Lang; +import org.nutz.log.Log; +import org.nutz.log.Logs; + +import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; +import com.google.api.client.http.HttpTransport; +import com.google.api.client.http.javanet.NetHttpTransport; +import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.services.oauth2.Oauth2; +import com.google.api.services.oauth2.model.Tokeninfo; +import com.rekoe.annotation.PlatformProvider; +import com.rekoe.domain.PlatformConfig; +import com.rekoe.mobile.Profile; +import com.rekoe.mobile.provider.AbstractProvider; +import com.rekoe.utils.Constants; + +@IocBean +@PlatformProvider(name = Constants.GOOGLE_PLAY) +public class GooglePProvider extends AbstractProvider { + + private static final long serialVersionUID = 7944880275608182543L; + private final static Log log = Logs.get(); + + private final HttpTransport TRANSPORT = new NetHttpTransport(); + private final JacksonFactory JSON_FACTORY = new JacksonFactory(); + + @Override + public String getProviderId() { + return Constants.GOOGLE_PLAY; + } + + /** + * https://developers.google.com/identity/sign-in/android/offline-access + */ + @Override + public Profile verifyResponse(GooglePParam param) throws Exception { + TokenStatus info = validToken(param); + if (info.isValid()) { + Profile profile = new Profile(getProviderId(), info.getGplus_id(), param.getPid()); + profile.addv(Profile.TOKEN, param.getToken()); + return profile; + } + log.errorf("Err message %s", info.getMessage()); + return null; + } + + private TokenStatus validToken(GooglePParam param) throws IOException { + PlatformConfig platformConfig = getPlatformConfig(param.getPid()); + String client_id = platformConfig.getConfig().getString("client_id"); + String applicationName = platformConfig.getConfig().getString("application_name", "zsdpay-1203"); + String accessToken = param.getToken(); + TokenStatus accessStatus = new TokenStatus(); + if (StringUtils.isNotBlank(accessToken)) { + try { + GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken); + Oauth2 oauth2 = new Oauth2.Builder(TRANSPORT, JSON_FACTORY, credential).setApplicationName(applicationName).build(); + Tokeninfo tokenInfo = oauth2.tokeninfo().setAccessToken(accessToken).execute(); + if (tokenInfo.containsKey("error")) { + accessStatus.setValid(false); + accessStatus.setId(""); + accessStatus.setMessage("Invalid Access Token."); + } else if (!Lang.equals(client_id, tokenInfo.getIssuedTo())) { + accessStatus.setValid(false); + accessStatus.setId(""); + accessStatus.setMessage("Access Token not meant for this app."); + } else { + accessStatus.setValid(true); + accessStatus.setId(tokenInfo.getUserId()); + accessStatus.setMessage("Access Token is valid."); + } + } catch (IOException e) { + accessStatus.setValid(false); + accessStatus.setId(""); + accessStatus.setMessage("Invalid Access Token."); + } + } else { + accessStatus.setMessage("Access Token not provided"); + } + return accessStatus; + } + + public static void main(String[] args) { + HttpTransport TRANSPORT = new NetHttpTransport(); + JacksonFactory JSON_FACTORY = new JacksonFactory(); + String applicationName = "zsdpay-1203"; + String token = "ya29.fgLVUDBWXuM91LAtvMdBXXWhCmKctjb44SK7Th8BO1yQ3DLfe3n_85Xi7PeLtQFsGEGOpQ"; + String client_id = "232182541248-8guj6heku6vpgdb7a3shmco33ns69lpm.apps.googleusercontent.com"; + String accessToken = token; + TokenStatus accessStatus = new TokenStatus(); + if (StringUtils.isNotBlank(accessToken)) { + try { + GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken); + Oauth2 oauth2 = new Oauth2.Builder(TRANSPORT, JSON_FACTORY, credential).setApplicationName(applicationName).build(); + Tokeninfo tokenInfo = oauth2.tokeninfo().setAccessToken(accessToken).execute(); + if (tokenInfo.containsKey("error")) { + accessStatus.setValid(false); + accessStatus.setId(""); + accessStatus.setMessage("Invalid Access Token."); + } else if (!Lang.equals(client_id, tokenInfo.getIssuedTo())) { + accessStatus.setValid(false); + accessStatus.setId(""); + accessStatus.setMessage("Access Token not meant for this app."); + } else { + accessStatus.setValid(true); + accessStatus.setId(tokenInfo.getUserId()); + accessStatus.setMessage("Access Token is valid."); + } + } catch (IOException e) { + accessStatus.setValid(false); + accessStatus.setId(""); + accessStatus.setMessage("Invalid Access Token."); + } + } else { + accessStatus.setMessage("Access Token not provided"); + } + System.out.println(Json.toJson(accessStatus)); + } + + public static void main1(String[] args) { + Request req = Request.create("http://127.0.0.1:8080/api/list?pfid=1006200110011004", METHOD.POST); + req.getHeader().set("Content-Type", "application/octet-stream;charset=UTF-8"); + Map params = new HashMap(); + params.put("pid", 1001); + params.put("token", "ya29.dgJTpUrOQ9g1RHfXKXimjWHNSTKW5OPpb9--W51L_J5_u8anU_je2gAFFa4br_0NsRJY5g"); + req.setData(Json.toJson(params, JsonFormat.compact())); + Sender.create(req).setTimeout(6000).send(); + } +} diff --git a/src/main/java/com/rekoe/mobile/provider/googlep/TokenStatus.java b/src/main/java/com/rekoe/mobile/provider/googlep/TokenStatus.java new file mode 100644 index 0000000..c10dcab --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/googlep/TokenStatus.java @@ -0,0 +1,43 @@ +package com.rekoe.mobile.provider.googlep; + +public class TokenStatus { + + private boolean valid; + private String gplus_id; + private String message; + + public TokenStatus() { + valid = false; + gplus_id = ""; + message = ""; + } + + public void setValid(boolean v) { + this.valid = v; + } + + public void setId(String gplus_id) { + this.gplus_id = gplus_id; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getGplus_id() { + return gplus_id; + } + + public void setGplus_id(String gplus_id) { + this.gplus_id = gplus_id; + } + + public boolean isValid() { + return valid; + } + + public String getMessage() { + return message; + } + +} diff --git a/src/main/java/com/rekoe/mobile/provider/guest/GuestParam.java b/src/main/java/com/rekoe/mobile/provider/guest/GuestParam.java new file mode 100644 index 0000000..9820ea6 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/guest/GuestParam.java @@ -0,0 +1,45 @@ +package com.rekoe.mobile.provider.guest; + +import java.io.Serializable; + +import com.rekoe.mobile.AbstractParam; +import com.rekoe.utils.Constants; + +public class GuestParam extends AbstractParam implements Serializable { + + private static final long serialVersionUID = 1240692439054026809L; + private String openid; + private int pid; + + public GuestParam() { + super(); + } + + public GuestParam(int pid, String passportid) { + super(); + this.openid = passportid; + this.pid = pid; + } + + public String getOpenid() { + return openid; + } + + public void setOpenid(String openid) { + this.openid = openid; + } + + public void setPid(int pid) { + this.pid = pid; + } + + @Override + public String getProviderId() { + return Constants.GUEST; + } + + @Override + public int getPid() { + return this.pid; + } +} diff --git a/src/main/java/com/rekoe/mobile/provider/guest/GuestProvider.java b/src/main/java/com/rekoe/mobile/provider/guest/GuestProvider.java new file mode 100644 index 0000000..67fb3b5 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/guest/GuestProvider.java @@ -0,0 +1,26 @@ +package com.rekoe.mobile.provider.guest; + +import org.nutz.ioc.loader.annotation.IocBean; + +import com.rekoe.annotation.PlatformProvider; +import com.rekoe.mobile.Profile; +import com.rekoe.mobile.provider.AbstractProvider; +import com.rekoe.utils.Constants; + +@IocBean +@PlatformProvider(name = Constants.GUEST) +public class GuestProvider extends AbstractProvider { + + private static final long serialVersionUID = 2882126009485835543L; + + @Override + public Profile verifyResponse(GuestParam param) throws Exception { + return new Profile(getProviderId(), param.getOpenid(), param.getPid()); + } + + @Override + public String getProviderId() { + return Constants.GUEST; + } + +} diff --git a/src/main/java/com/rekoe/mobile/provider/hw/HwParam.java b/src/main/java/com/rekoe/mobile/provider/hw/HwParam.java new file mode 100644 index 0000000..c9ebe8d --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/hw/HwParam.java @@ -0,0 +1,39 @@ +package com.rekoe.mobile.provider.hw; + +import java.io.Serializable; + +import com.rekoe.mobile.AbstractParam; +import com.rekoe.utils.Constants; + +public class HwParam extends AbstractParam implements Serializable { + + private static final long serialVersionUID = -1122775243733543089L; + private String accessToken; + private int pid; + + public HwParam() { + } + + @Override + public String getProviderId() { + return Constants.HW; + } + + @Override + public int getPid() { + return pid; + } + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public void setPid(int pid) { + this.pid = pid; + } + +} diff --git a/src/main/java/com/rekoe/mobile/provider/hw/HwProvider.java b/src/main/java/com/rekoe/mobile/provider/hw/HwProvider.java new file mode 100644 index 0000000..24f5412 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/hw/HwProvider.java @@ -0,0 +1,61 @@ +package com.rekoe.mobile.provider.hw; + +import java.io.IOException; + +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.lang.Lang; +import org.nutz.lang.Strings; +import org.nutz.log.Log; +import org.nutz.log.Logs; + +import com.rekoe.annotation.PlatformProvider; +import com.rekoe.mobile.Profile; +import com.rekoe.mobile.provider.AbstractProvider; +import com.rekoe.utils.Constants; + +@IocBean +@PlatformProvider(name = Constants.HW) +public class HwProvider extends AbstractProvider { + + private static final long serialVersionUID = 7944880275608182543L; + private final static Log log = Logs.get(); + // 验证accessToken地址 + private static final String VALID_TOKEN_ADDR = "https://api.vmall.com/rest.php"; + + @Override + public String getProviderId() { + return Constants.HW; + } + + @Override + public Profile verifyResponse(HwParam param) throws Exception { + UserInfo info = validToken(param); + if (!Lang.isEmpty(info) && !Strings.isBlank(info.getUserID())) { + return new Profile(getProviderId(), info.getUserID(), param.getPid()); + } else { + log.errorf("Can`t find user info on platform %s", getProviderId()); + } + + return null; + } + + private UserInfo validToken(HwParam param) throws IOException { + if (Lang.isEmpty(param)) { + log.errorf("Can`t get %s Param", getProviderId()); + return null; + } + String accessToken = param.getAccessToken(); + if (!Strings.isBlank(accessToken)) { + String postBody = "nsp_svc=OpenUP.User.getInfo&nsp_ts="; + postBody += String.valueOf(System.currentTimeMillis() / 1000); + postBody += "&access_token=" + java.net.URLEncoder.encode(accessToken, "utf-8"); + + String result = httpsPostBody(VALID_TOKEN_ADDR, postBody); + return Json.fromJson(UserInfo.class, result); + } else { + log.errorf("%s access token is missing %s", getProviderId(), accessToken); + } + return null; + } +} diff --git a/src/main/java/com/rekoe/mobile/provider/hw/UserInfo.java b/src/main/java/com/rekoe/mobile/provider/hw/UserInfo.java new file mode 100644 index 0000000..6c33b3d --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/hw/UserInfo.java @@ -0,0 +1,84 @@ +package com.rekoe.mobile.provider.hw; + +public class UserInfo { + private String userID; + + private String userName; + + private String languageCode; + + private int userState; + + private int userValidStatus; + + /** + * @return the userID + */ + public String getUserID(){ + return userID; + } + + /** + * @param userID the userID to set + */ + public void setUserID(String userID){ + this.userID = userID; + } + + /** + * @return the userName + */ + public String getUserName(){ + return userName; + } + + /** + * @param userName the userName to set + */ + public void setUserName(String userName){ + this.userName = userName; + } + + /** + * @return the languageCode + */ + public String getLanguageCode(){ + return languageCode; + } + + /** + * @param languageCode the languageCode to set + */ + public void setLanguageCode(String languageCode){ + this.languageCode = languageCode; + } + + /** + * @return the userState + */ + public int getUserState(){ + return userState; + } + + /** + * @param userState the userState to set + */ + public void setUserState(int userState){ + this.userState = userState; + } + + /** + * @return the userValidStatus + */ + public int getUserValidStatus(){ + return userValidStatus; + } + + /** + * @param userValidStatus the userValidStatus to set + */ + public void setUserValidStatus(int userValidStatus){ + this.userValidStatus = userValidStatus; + } + +} diff --git a/src/main/java/com/rekoe/mobile/provider/msdk/MSDKParam.java b/src/main/java/com/rekoe/mobile/provider/msdk/MSDKParam.java new file mode 100644 index 0000000..4d2f4c1 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/msdk/MSDKParam.java @@ -0,0 +1,45 @@ +package com.rekoe.mobile.provider.msdk; + +import java.io.Serializable; + +import com.rekoe.mobile.AbstractParam; +import com.rekoe.utils.Constants; + +public class MSDKParam extends AbstractParam implements Serializable { + private static final long serialVersionUID = -8345954529141180606L; + private String openid; + private String ip; + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + private int pid; + + public String getOpenid() { + return openid; + } + + public void setOpenid(String openid) { + this.openid = openid; + } + + public void setPid(int pid) { + this.pid = pid; + } + + @Override + public String getProviderId() { + return Constants.MSDK; + } + + @Override + public int getPid() { + return pid; + } + +} diff --git a/src/main/java/com/rekoe/mobile/provider/msdk/MSDKProvider.java b/src/main/java/com/rekoe/mobile/provider/msdk/MSDKProvider.java new file mode 100644 index 0000000..edd5fcc --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/msdk/MSDKProvider.java @@ -0,0 +1,84 @@ +package com.rekoe.mobile.provider.msdk; + +import java.util.HashMap; +import java.util.Map; + +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.json.JsonFormat; +import org.nutz.lang.Lang; +import org.nutz.lang.util.NutMap; +import org.nutz.log.Log; +import org.nutz.log.Logs; + +import com.rekoe.annotation.PlatformProvider; +import com.rekoe.domain.PlatformConfig; +import com.rekoe.mobile.Profile; +import com.rekoe.mobile.provider.AbstractProvider; +import com.rekoe.utils.Constants; + +/** + * + * @author kouxian + * + */ +@IocBean +@PlatformProvider(name = Constants.MSDK) +public class MSDKProvider extends AbstractProvider { + + private static final long serialVersionUID = 2882126009485835543L; + + private final static Log log = Logs.get(); + + public final static String MSDK_PROFILE = "MSDK_PROFILE"; + public final static String MSDK_PARAM = "MSDK_PARAM"; + + @Override + public String getProviderId() { + return Constants.MSDK; + } + + @Override + public Profile verifyResponse(MSDKParam p) throws Exception { + PlatformConfig platformConfig = getPlatformConfig(p.getPid()); + NutMap config = platformConfig.getConfig(); + String appkey = config.getString("appkey"); + long appid = config.getAs("appid", Long.class); + Map params = new HashMap(); + params.put("appid", appid); + params.put("openid", p.getOpenid()); + params.put("openkey", appkey); + params.put("userip", p.getIp()); + String uri = makeUri(p.getOpenid(), appid, appkey); + String url = config.getString("valid_token_url") + uri; + String data = Json.toJson(params, JsonFormat.compact()); + if (log.isDebugEnabled()) { + log.debugf("url >> %s", url); + } + String res = httpPostBody(url, data); + if (log.isDebugEnabled()) { + log.debugf("back >> %s", res); + } + try { + MSDKUserInfo userInfo = Json.fromJson(MSDKUserInfo.class, res); + if (userInfo.getRet() == 0) { + Profile profile = new Profile(getProviderId(), p.getOpenid(), p.getPid()); + profile.addv(MSDK_PROFILE, p); + profile.addv(MSDK_PARAM, userInfo); + profile.addv(Profile.TOKEN, p.getOpenid()); + return profile; + } else { + log.error(res); + } + } catch (Exception e) { + log.error(e); + } + return null; + } + + private String makeUri(String openid, long appid, String appkey) { + long timestamp = System.currentTimeMillis(); + String sig = Lang.md5(appkey + timestamp); + return new StringBuilder().append("/?timestamp=").append(timestamp).append("&appid=").append(appid).append("&sig=").append(sig).append("&openid=").append(openid).append("&encode=1").toString(); + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/mobile/provider/msdk/MSDKUserInfo.java b/src/main/java/com/rekoe/mobile/provider/msdk/MSDKUserInfo.java new file mode 100644 index 0000000..f9d7009 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/msdk/MSDKUserInfo.java @@ -0,0 +1,204 @@ +package com.rekoe.mobile.provider.msdk; + +import java.io.Serializable; + +import org.nutz.json.JsonField; + +public class MSDKUserInfo implements Serializable { + + private static final long serialVersionUID = 580303315270742465L; + + private int ret = -1; + @JsonField(value = "is_lost") + private int isLost = 1; + private String nickname; + private String gender; + private String country; + private String province; + private String city; + private String figureurl; + @JsonField(value = "is_yellow_vip") + private int isYellowVip; + @JsonField(value = "is_yellow_year_vip") + private int isYellowYearVip; + @JsonField(value = "yellow_vip_level") + private int yellowVipLevel; + @JsonField(value = "is_yellow_high_vip") + private int isYellowHighVip; + @JsonField(value = "is_blue_vip") + private boolean isBlueVip; + @JsonField(value = "is_blue_year_vip") + private boolean isBlueYearVip; + @JsonField(value = "is_super_blue_vip") + private boolean isSuperBlueVip; + @JsonField(value = "blue_vip_level") + private int blueVipLevel; + @JsonField(value = "a3366_level") + private int a3366Level; + @JsonField(value = "a3366_level_name") + private String a3366LevelName; + @JsonField(value = "a3366_grow_level") + private int a3366GrowLevel; + @JsonField(value = "a3366_grow_value") + private int a3366GrowValue; + + public int getRet() { + return ret; + } + + public void setRet(int ret) { + this.ret = ret; + } + + public int getIsLost() { + return isLost; + } + + public void setIsLost(int isLost) { + this.isLost = isLost; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getFigureurl() { + return figureurl; + } + + public void setFigureurl(String figureurl) { + this.figureurl = figureurl; + } + + public int getIsYellowVip() { + return isYellowVip; + } + + public void setIsYellowVip(int isYellowVip) { + this.isYellowVip = isYellowVip; + } + + public int getIsYellowYearVip() { + return isYellowYearVip; + } + + public void setIsYellowYearVip(int isYellowYearVip) { + this.isYellowYearVip = isYellowYearVip; + } + + public int getYellowVipLevel() { + return yellowVipLevel; + } + + public void setYellowVipLevel(int yellowVipLevel) { + this.yellowVipLevel = yellowVipLevel; + } + + public int getIsYellowHighVip() { + return isYellowHighVip; + } + + public void setIsYellowHighVip(int isYellowHighVip) { + this.isYellowHighVip = isYellowHighVip; + } + + public boolean isBlueVip() { + return isBlueVip; + } + + public void setBlueVip(boolean isBlueVip) { + this.isBlueVip = isBlueVip; + } + + public boolean isBlueYearVip() { + return isBlueYearVip; + } + + public void setBlueYearVip(boolean isBlueYearVip) { + this.isBlueYearVip = isBlueYearVip; + } + + public boolean isSuperBlueVip() { + return isSuperBlueVip; + } + + public void setSuperBlueVip(boolean isSuperBlueVip) { + this.isSuperBlueVip = isSuperBlueVip; + } + + public int getBlueVipLevel() { + return blueVipLevel; + } + + public void setBlueVipLevel(int blueVipLevel) { + this.blueVipLevel = blueVipLevel; + } + + public int getA3366Level() { + return a3366Level; + } + + public void setA3366Level(int a3366Level) { + this.a3366Level = a3366Level; + } + + public String getA3366LevelName() { + return a3366LevelName; + } + + public void setA3366LevelName(String a3366LevelName) { + this.a3366LevelName = a3366LevelName; + } + + public int getA3366GrowLevel() { + return a3366GrowLevel; + } + + public void setA3366GrowLevel(int a3366GrowLevel) { + this.a3366GrowLevel = a3366GrowLevel; + } + + public int getA3366GrowValue() { + return a3366GrowValue; + } + + public void setA3366GrowValue(int a3366GrowValue) { + this.a3366GrowValue = a3366GrowValue; + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/mobile/provider/qihu360/QiHu360Param.java b/src/main/java/com/rekoe/mobile/provider/qihu360/QiHu360Param.java new file mode 100644 index 0000000..71924bc --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/qihu360/QiHu360Param.java @@ -0,0 +1,40 @@ +package com.rekoe.mobile.provider.qihu360; + +import java.io.Serializable; + +import com.rekoe.mobile.AbstractParam; +import com.rekoe.utils.Constants; + +public class QiHu360Param extends AbstractParam implements Serializable { + + private static final long serialVersionUID = -4558333251854028360L; + private String sessionid; + private int pid; + + public String getSessionid() { + return sessionid; + } + + public void setSessionid(int pid, String sessionid) { + this.sessionid = sessionid; + this.pid = pid; + } + + public int getPid() { + return pid; + } + + public void setPid(int pid) { + this.pid = pid; + } + + public void setSessionid(String sessionid) { + this.sessionid = sessionid; + } + + @Override + public String getProviderId() { + return Constants.QIHU360; + } + +} diff --git a/src/main/java/com/rekoe/mobile/provider/qihu360/QiHu360Provider.java b/src/main/java/com/rekoe/mobile/provider/qihu360/QiHu360Provider.java new file mode 100644 index 0000000..ffae446 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/qihu360/QiHu360Provider.java @@ -0,0 +1,44 @@ +package com.rekoe.mobile.provider.qihu360; + +import java.util.HashMap; +import java.util.Map; + +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Strings; + +import com.rekoe.annotation.PlatformProvider; +import com.rekoe.mobile.Profile; +import com.rekoe.mobile.provider.AbstractProvider; +import com.rekoe.utils.Constants; + +@IocBean +@PlatformProvider(name = Constants.QIHU360) +public class QiHu360Provider extends AbstractProvider { + + private static final long serialVersionUID = 2882126009485835543L; + + private static final Map ENDPOINTS; + + static { + ENDPOINTS = new HashMap(); + ENDPOINTS.put(Constants.OAUTH_AUTHORIZATION_URL, "https://openapi.360.cn/user/me.json?access_token="); + } + + @Override + public String getProviderId() { + return Constants.QIHU360; + } + + @Override + public Profile verifyResponse(QiHu360Param param) throws Exception { + String params = HttpsGet((ENDPOINTS.get(Constants.OAUTH_AUTHORIZATION_URL) + param.getSessionid())); + if (!Strings.isBlank(params)) { + Map result = result2Json(params, String.class); + String userId = result.get("id"); + if (!Strings.isBlank(params)) { + return new Profile(getProviderId(), userId, param.getPid()); + } + } + return null; + } +} diff --git a/src/main/java/com/rekoe/mobile/provider/qq/QQParam.java b/src/main/java/com/rekoe/mobile/provider/qq/QQParam.java new file mode 100644 index 0000000..4366e2d --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/qq/QQParam.java @@ -0,0 +1,64 @@ +package com.rekoe.mobile.provider.qq; + +import java.io.Serializable; + +import com.rekoe.mobile.AbstractParam; +import com.rekoe.utils.Constants; + +public class QQParam extends AbstractParam implements Serializable { + + private static final long serialVersionUID = -4898427425935858898L; + private String openid; + private String openkey; + private String pf; + private String platform; + + public String getPlatform() { + return platform; + } + + public void setPlatform(String platform) { + this.platform = platform; + } + + public String getPf() { + return pf; + } + + public void setPf(String pf) { + this.pf = pf; + } + + private int pid; + + public String getOpenid() { + return openid; + } + + public void setOpenid(String openid) { + this.openid = openid; + } + + public String getOpenkey() { + return openkey; + } + + public void setOpenkey(String openkey) { + this.openkey = openkey; + } + + public void setPid(int pid) { + this.pid = pid; + } + + @Override + public String getProviderId() { + return Constants.QQ; + } + + @Override + public int getPid() { + return pid; + } + +} diff --git a/src/main/java/com/rekoe/mobile/provider/qq/QQProvider.java b/src/main/java/com/rekoe/mobile/provider/qq/QQProvider.java new file mode 100644 index 0000000..36155b7 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/qq/QQProvider.java @@ -0,0 +1,85 @@ +package com.rekoe.mobile.provider.qq; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.json.JsonFormat; +import org.nutz.lang.Strings; +import org.nutz.log.Log; +import org.nutz.log.Logs; +import org.nutz.repo.Base64; + +import com.rekoe.annotation.PlatformProvider; +import com.rekoe.domain.PlatformConfig; +import com.rekoe.mobile.Profile; +import com.rekoe.mobile.provider.AbstractProvider; +import com.rekoe.utils.Constants; + +@IocBean +@PlatformProvider(name = Constants.QQ) +public class QQProvider extends AbstractProvider { + + private static final long serialVersionUID = 2882126009485835543L; + + private final static Log log = Logs.get(); + + public final static String QQPARAM_KEY = "param"; + public final static String USERINFO_KEY = "userinfo"; + + @Override + public String getProviderId() { + return Constants.QQ; + } + + @Override + public Profile verifyResponse(QQParam p) throws Exception { + PlatformConfig platformConfig = getPlatformConfig(p.getPid()); + String appkey = platformConfig.getConfig().getString("appkey"); + String appid = platformConfig.getConfig().getString("appid"); + String validateUrl = platformConfig.getConfig().getString("validate_url"); + String uri = paramEncode("/v3/user/get_info"); + String param = "appid=" + appid + "&format=json&openid=" + p.getOpenid() + "&openkey=" + p.getOpenkey() + "&pf=" + p.getPf(); + String get = "GET&" + uri + "&" + paramEncode(param); + String sig = getSignature(get, appkey); + String url = validateUrl + "/v3/user/get_info?openid=" + paramEncode(p.getOpenid()) + "&openkey=" + paramEncode(p.getOpenkey()) + "&appid=" + appid + "&sig=" + paramEncode(sig) + "&pf=" + paramEncode(p.getPf()) + "&format=" + paramEncode("json"); + String qqRes = HttpGet(url); + QQUserInfo userInf = Json.fromJson(QQUserInfo.class, qqRes); + if (userInf.getRet() == 0) {// , + Profile profile = new Profile(getProviderId(), p.getOpenid(), p.getPid()); + profile.addv(USERINFO_KEY, userInf); + profile.addv(QQPARAM_KEY, p); + return profile; + } else { + log.errorf("ProviderId >> %s,Param >> %s", getProviderId(), Json.toJson(p, JsonFormat.compact())); + log.error(qqRes); + } + return null; + } + + private String paramEncode(String param) throws UnsupportedEncodingException { + return URLEncoder.encode(Strings.isBlank(param) ? "" : param, "UTF-8"); + } + + private final String HMAC_SHA1 = "HmacSHA1"; + + public String getSignature(String data, String key) throws Exception { + key += "&"; + data = encodeCompnentURL(data); + byte[] keyBytes = key.getBytes(); + SecretKeySpec signingKey = new SecretKeySpec(keyBytes, HMAC_SHA1); + Mac mac = Mac.getInstance(HMAC_SHA1); + mac.init(signingKey); + byte[] rawHmac = mac.doFinal(data.getBytes()); + return Base64.encodeToString(rawHmac, false); + } + + private String encodeCompnentURL(String url) throws UnsupportedEncodingException { + String temp = url.replace("*", "%2A"); + return temp; + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/mobile/provider/qq/QQUserInfo.java b/src/main/java/com/rekoe/mobile/provider/qq/QQUserInfo.java new file mode 100644 index 0000000..7b62f5e --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/qq/QQUserInfo.java @@ -0,0 +1,208 @@ +package com.rekoe.mobile.provider.qq; + +import java.io.Serializable; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class QQUserInfo implements Serializable { + + private static final long serialVersionUID = -6009549946309845409L; + private int ret = -1; + private int is_lost = 1; + private String nickname; + private String gender; + private String country; + private String province; + private String city; + private String figureurl; + private int is_yellow_vip; + private int is_yellow_year_vip; + private int yellow_vip_level; + private int is_yellow_high_vip; + // 是否蓝钻,是返回蓝钻等级,不是返回-1 + private boolean is_blue_vip; + // 是否年费蓝钻 + private boolean is_blue_year_vip; + // 也许是豪华蓝钻 + private boolean is_super_blue_vip; + // 蓝钻等级 + private int blue_vip_level; + private int a3366_level; + private String a3366_level_name; + private int a3366_grow_level; + private int a3366_grow_value; + + public int getA3366_level() { + return a3366_level; + } + + public void setA3366_level(int a3366_level) { + this.a3366_level = a3366_level; + } + + public String getA3366_level_name() { + return a3366_level_name; + } + + public void setA3366_level_name(String a3366_level_name) { + this.a3366_level_name = a3366_level_name; + } + + public int getA3366_grow_level() { + return a3366_grow_level; + } + + public void setA3366_grow_level(int a3366_grow_level) { + this.a3366_grow_level = a3366_grow_level; + } + + public int getA3366_grow_value() { + return a3366_grow_value; + } + + public void setA3366_grow_value(int a3366_grow_value) { + this.a3366_grow_value = a3366_grow_value; + } + + public int getRet() { + return ret; + } + + public void setRet(int ret) { + this.ret = ret; + } + + public int getIs_lost() { + return is_lost; + } + + public void setIs_lost(int is_lost) { + this.is_lost = is_lost; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + if (!checkName(nickname)) + this.nickname = nickname; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getFigureurl() { + return figureurl; + } + + public void setFigureurl(String figureurl) { + this.figureurl = figureurl; + } + + public int getIs_yellow_vip() { + return is_yellow_vip; + } + + public void setIs_yellow_vip(int is_yellow_vip) { + this.is_yellow_vip = is_yellow_vip; + } + + public int getIs_yellow_year_vip() { + return is_yellow_year_vip; + } + + public void setIs_yellow_year_vip(int is_yellow_year_vip) { + this.is_yellow_year_vip = is_yellow_year_vip; + } + + public int getYellow_vip_level() { + return yellow_vip_level; + } + + public void setYellow_vip_level(int yellow_vip_level) { + this.yellow_vip_level = yellow_vip_level; + } + + public int getIs_yellow_high_vip() { + return is_yellow_high_vip; + } + + public void setIs_yellow_high_vip(int is_yellow_high_vip) { + this.is_yellow_high_vip = is_yellow_high_vip; + } + + public boolean isIs_blue_vip() { + return is_blue_vip; + } + + public void setIs_blue_vip(boolean is_blue_vip) { + this.is_blue_vip = is_blue_vip; + } + + public boolean isIs_blue_year_vip() { + return is_blue_year_vip; + } + + public void setIs_blue_year_vip(boolean is_blue_year_vip) { + this.is_blue_year_vip = is_blue_year_vip; + } + + public boolean isIs_super_blue_vip() { + return is_super_blue_vip; + } + + public void setIs_super_blue_vip(boolean is_super_blue_vip) { + this.is_super_blue_vip = is_super_blue_vip; + } + + public int getBlue_vip_level() { + return blue_vip_level; + } + + public void setBlue_vip_level(int blue_vip_level) { + this.blue_vip_level = blue_vip_level; + } + + public static boolean checkName(String name) { + if (isMatches("[\\w]*", name)) + return false; + return isMatches("[\u1F601-\u1F64F]+", name); + } + + public static boolean isMatches(String regex, String str) { + Pattern p = Pattern.compile(regex); + Matcher m = p.matcher(str); + boolean b = m.matches(); + return b; + } +} diff --git a/src/main/java/com/rekoe/mobile/provider/rk/RKParam.java b/src/main/java/com/rekoe/mobile/provider/rk/RKParam.java new file mode 100644 index 0000000..2a35b0b --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/rk/RKParam.java @@ -0,0 +1,40 @@ +package com.rekoe.mobile.provider.rk; + +import java.io.Serializable; + +import com.rekoe.mobile.AbstractParam; +import com.rekoe.utils.Constants; + +public class RKParam extends AbstractParam implements Serializable { + + private static final long serialVersionUID = 1240692439054026809L; + private String code; + + private int pid; + + public RKParam() { + super(); + } + + public void setPid(int pid) { + this.pid = pid; + } + + @Override + public String getProviderId() { + return Constants.RK; + } + + @Override + public int getPid() { + return this.pid; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } +} diff --git a/src/main/java/com/rekoe/mobile/provider/rk/RKProvider.java b/src/main/java/com/rekoe/mobile/provider/rk/RKProvider.java new file mode 100644 index 0000000..e29ddb8 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/rk/RKProvider.java @@ -0,0 +1,73 @@ +package com.rekoe.mobile.provider.rk; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.nutz.http.Http; +import org.nutz.http.Response; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.lang.util.NutMap; +import org.nutz.log.Log; +import org.nutz.log.Logs; + +import com.rekoe.annotation.PlatformProvider; +import com.rekoe.domain.PlatformConfig; +import com.rekoe.mobile.Profile; +import com.rekoe.mobile.provider.AbstractProvider; +import com.rekoe.utils.Constants; + +@IocBean +@PlatformProvider(name = Constants.RK) +public class RKProvider extends AbstractProvider { + + private static final long serialVersionUID = 2882126009485835543L; + + private final static Log log = Logs.get(); + + private final static String TOKEN_VALIDATE = "/oauth/accessToken"; + private final static String TOKEN_FOR_USER = "/v1/openapi/userinfo?access_token="; + + @Override + public Profile verifyResponse(RKParam param) throws Exception { + String code = param.getCode(); + PlatformConfig platformConfig = getPlatformConfig(param.getPid()); + String clientId = platformConfig.getConfig().getString("client_id"); + String grantType = platformConfig.getConfig().getString("grant_type"); + String clientSecret = platformConfig.getConfig().getString("client_secret"); + String redirectUri = platformConfig.getConfig().getString("redirect_uri"); + String validateUrl = platformConfig.getConfig().getString("validate_url"); + Map params = new HashMap(); + params.put("client_id", clientId); + params.put("grant_type", grantType); + params.put("client_secret", clientSecret); + params.put("code", code); + params.put("redirect_uri", redirectUri); + try { + Response res = Http.post2(validateUrl + TOKEN_VALIDATE, params, 60); + if (res.isOK()) { + String resultToken = res.getContent(); + NutMap map = Json.fromJson(NutMap.class, resultToken); + String accessToken = map.getString("access_token"); + params.clear(); + if (StringUtils.isNotBlank(accessToken)) { + params.put("access_token", accessToken); + String resultvValidateToken = Http.get(validateUrl + TOKEN_FOR_USER + accessToken).getContent(); + NutMap userInfo = Json.fromJson(NutMap.class, resultvValidateToken); + return new Profile(getProviderId(), userInfo.getString("uid"), param.getPid()); + } + log.error(resultToken); + } + } catch (Exception e) { + log.errorf("url:[%s]", validateUrl); + } + return null; + } + + @Override + public String getProviderId() { + return Constants.RK; + } + +} diff --git a/src/main/java/com/rekoe/mobile/provider/sg/SGParam.java b/src/main/java/com/rekoe/mobile/provider/sg/SGParam.java new file mode 100644 index 0000000..b84a564 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/sg/SGParam.java @@ -0,0 +1,45 @@ +package com.rekoe.mobile.provider.sg; + +import java.io.Serializable; + +import com.rekoe.mobile.AbstractParam; +import com.rekoe.utils.Constants; + +public class SGParam extends AbstractParam implements Serializable { + + private static final long serialVersionUID = 1240692439054026809L; + private String openid; + private int pid; + + public SGParam() { + super(); + } + + public SGParam(int pid, String passportid) { + super(); + this.openid = passportid; + this.pid = pid; + } + + public String getOpenid() { + return openid; + } + + public void setOpenid(String openid) { + this.openid = openid; + } + + public void setPid(int pid) { + this.pid = pid; + } + + @Override + public String getProviderId() { + return Constants.SG; + } + + @Override + public int getPid() { + return this.pid; + } +} diff --git a/src/main/java/com/rekoe/mobile/provider/sg/SGProvider.java b/src/main/java/com/rekoe/mobile/provider/sg/SGProvider.java new file mode 100644 index 0000000..80033df --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/sg/SGProvider.java @@ -0,0 +1,26 @@ +package com.rekoe.mobile.provider.sg; + +import org.nutz.ioc.loader.annotation.IocBean; + +import com.rekoe.annotation.PlatformProvider; +import com.rekoe.mobile.Profile; +import com.rekoe.mobile.provider.AbstractProvider; +import com.rekoe.utils.Constants; + +@IocBean +@PlatformProvider(name = Constants.SG) +public class SGProvider extends AbstractProvider { + + private static final long serialVersionUID = 2882126009485835543L; + + @Override + public Profile verifyResponse(SGParam param) throws Exception { + return new Profile(getProviderId(), param.getOpenid(), param.getPid()); + } + + @Override + public String getProviderId() { + return Constants.SG; + } + +} diff --git a/src/main/java/com/rekoe/mobile/provider/uc/UCResponse.java b/src/main/java/com/rekoe/mobile/provider/uc/UCResponse.java new file mode 100644 index 0000000..a332dc0 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/uc/UCResponse.java @@ -0,0 +1,28 @@ +package com.rekoe.mobile.provider.uc; + +public class UCResponse { + + private UCResponseState state; + private UCResponseData data; + + public UCResponse(UCResponseState state, UCResponseData data) { + this.state = state; + this.data = data; + } + + public UCResponse(UCResponseState state) { + this.state = state; + } + + public UCResponseState getState() { + return state; + } + + public UCResponseData getData() { + return data; + } + + public void setData(UCResponseData data) { + this.data = data; + } +} diff --git a/src/main/java/com/rekoe/mobile/provider/uc/UCResponseData.java b/src/main/java/com/rekoe/mobile/provider/uc/UCResponseData.java new file mode 100644 index 0000000..21e68c8 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/uc/UCResponseData.java @@ -0,0 +1,22 @@ +package com.rekoe.mobile.provider.uc; + +public class UCResponseData { + private String accountId; + private String nickName; + + public String getAccountId(){ + return accountId; + } + + public void setAccountId(String accountId){ + this.accountId = accountId; + } + + public String getNickName(){ + return nickName; + } + + public void setNickName(String nickName){ + this.nickName = nickName; + } +} diff --git a/src/main/java/com/rekoe/mobile/provider/uc/UCResponseState.java b/src/main/java/com/rekoe/mobile/provider/uc/UCResponseState.java new file mode 100644 index 0000000..2faef94 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/uc/UCResponseState.java @@ -0,0 +1,24 @@ +package com.rekoe.mobile.provider.uc; + +public class UCResponseState { + + private int code; + private String msg; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + +} diff --git a/src/main/java/com/rekoe/mobile/provider/uc/UcParam.java b/src/main/java/com/rekoe/mobile/provider/uc/UcParam.java new file mode 100644 index 0000000..a084fe2 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/uc/UcParam.java @@ -0,0 +1,43 @@ +package com.rekoe.mobile.provider.uc; + +import java.io.Serializable; + +import com.rekoe.mobile.AbstractParam; +import com.rekoe.utils.Constants; + +public class UcParam extends AbstractParam implements Serializable{ + + private static final long serialVersionUID = -2473883638175694140L; + private String sid; + private int pid; + + public String getSid() { + return sid; + } + + public UcParam() { + } + + public UcParam(int pid, String sid) { + this.sid = sid; + this.pid = pid; + } + + public int getPid() { + return pid; + } + + public void setPid(int pid) { + this.pid = pid; + } + + public void setSid(String sid) { + this.sid = sid; + } + + @Override + public String getProviderId() { + return Constants.UC; + } + +} diff --git a/src/main/java/com/rekoe/mobile/provider/uc/UcProvider.java b/src/main/java/com/rekoe/mobile/provider/uc/UcProvider.java new file mode 100644 index 0000000..00dc75f --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/uc/UcProvider.java @@ -0,0 +1,108 @@ +package com.rekoe.mobile.provider.uc; + +import java.util.HashMap; +import java.util.Map; + +import org.nutz.http.Request; +import org.nutz.http.Request.METHOD; +import org.nutz.http.Response; +import org.nutz.http.Sender; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.json.JsonFormat; +import org.nutz.lang.Lang; +import org.nutz.log.Log; +import org.nutz.log.Logs; + +import com.rekoe.annotation.PlatformProvider; +import com.rekoe.domain.PlatformConfig; +import com.rekoe.mobile.Profile; +import com.rekoe.mobile.provider.AbstractProvider; +import com.rekoe.utils.Constants; + +@IocBean +@PlatformProvider(name = Constants.UC) +public class UcProvider extends AbstractProvider { + + private static final long serialVersionUID = 2882126009485835543L; + private final static Log log = Logs.get(); + + @Override + public String getProviderId() { + return Constants.UC; + } + + @Override + public Profile verifyResponse(UcParam param) throws Exception { + PlatformConfig platformConfig = getPlatformConfig(param.getPid()); + String appkey = platformConfig.getConfig().getString("appkey"); + int appid = platformConfig.getConfig().getInt("appid"); + int secret = platformConfig.getConfig().getInt("secret"); + String validateUrl = platformConfig.getConfig().getString("validate_url"); + UCResponse response = response2(param.getSid(), appid, appkey, secret, validateUrl); + if (response.getState().getCode() == 1) { + Profile profile = new Profile(getProviderId(), response.getData().getAccountId(), param.getPid()); + profile.addv("token", param.getSid()); + return profile; + } + return null; + } + + @Deprecated + public UCResponse response(String sid, int appid, String appKey, String validateUrl) { + Map params = new HashMap<>(); + params.put("id", System.currentTimeMillis()); + params.put("service", "ucid.bind.create"); + params.put("sign", Lang.md5("gameUser=" + sid + appKey)); + Map gameParams = new HashMap<>(); + gameParams.put("gameId", appid); + params.put("game", gameParams); + Map dataParams = new HashMap<>(); + params.put("data", dataParams); + dataParams.put("gameUser", sid); + String json = httpPostBody(validateUrl, Json.toJson(params, JsonFormat.compact())); + Map m = Json.fromJsonAsMap(Object.class, json); + Object obj = m.get("state"); + UCResponseState state = Lang.map2Object((Map) obj, UCResponseState.class); + UCResponse res = new UCResponse(state); + if (state.getCode() == 1) { + res.setData(Lang.map2Object((Map) m.get("data"), UCResponseData.class)); + } else { + log.error(json); + } + return res; + } + + private UCResponse response2(String sid, int appid, String appKey, int secret, String validateUrl) { + Map params = new HashMap<>(); + params.put("id", System.currentTimeMillis()); + params.put("service", "ucid.user.sidInfo"); + params.put("encrypt", "md5"); + params.put("sign", Lang.md5(secret + "sid=" + sid + appKey)); + Map gameParams = new HashMap<>(); + gameParams.put("cpId", secret); + gameParams.put("gameId", appid); + gameParams.put("channelId", 2); + gameParams.put("serverId", 0); + params.put("game", gameParams); + Map dataParams = new HashMap<>(); + dataParams.put("sid", sid); + params.put("data", dataParams); + Request req = Request.create(validateUrl, METHOD.POST); + req.getHeader().set("Content-Type", "application/json:charset=utf-8 "); + req.setData(Json.toJson(params, JsonFormat.compact())); + Response resp = Sender.create(req).send(); + String json = resp.getContent(); + Map m = Json.fromJsonAsMap(Object.class, json); + Object obj = m.get("state"); + UCResponseState state = Lang.map2Object((Map) obj, UCResponseState.class); + UCResponse res = new UCResponse(state); + if (state.getCode() == 1) { + res.setData(Lang.map2Object((Map) m.get("data"), UCResponseData.class)); + } else { + log.error(json); + } + return res; + } + +} diff --git a/src/main/java/com/rekoe/mobile/provider/xiaomi/XiaoMiParam.java b/src/main/java/com/rekoe/mobile/provider/xiaomi/XiaoMiParam.java new file mode 100644 index 0000000..7c35e65 --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/xiaomi/XiaoMiParam.java @@ -0,0 +1,55 @@ +package com.rekoe.mobile.provider.xiaomi; + +import java.io.Serializable; + +import com.rekoe.mobile.AbstractParam; +import com.rekoe.utils.Constants; + +public class XiaoMiParam extends AbstractParam implements Serializable { + + private static final long serialVersionUID = -5138092630114580043L; + private String uid; + private String token; + private int pid; + + public XiaoMiParam() { + super(); + } + + public XiaoMiParam(int pid, String uid, String token) { + super(); + this.uid = uid; + this.uid = token; + this.pid = pid; + } + + public String getUid() { + return uid; + } + + public void setUid(String uid) { + this.uid = uid; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public int getPid() { + return pid; + } + + public void setPid(int pid) { + this.pid = pid; + } + + @Override + public String getProviderId() { + return Constants.XIAOMI; + } + +} diff --git a/src/main/java/com/rekoe/mobile/provider/xiaomi/XiaoMiProvider.java b/src/main/java/com/rekoe/mobile/provider/xiaomi/XiaoMiProvider.java new file mode 100644 index 0000000..332d63a --- /dev/null +++ b/src/main/java/com/rekoe/mobile/provider/xiaomi/XiaoMiProvider.java @@ -0,0 +1,59 @@ +package com.rekoe.mobile.provider.xiaomi; + +import java.text.MessageFormat; +import java.util.HashMap; +import java.util.Map; + +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.log.Log; +import org.nutz.log.Logs; + +import com.rekoe.annotation.PlatformProvider; +import com.rekoe.domain.PlatformConfig; +import com.rekoe.mobile.Profile; +import com.rekoe.mobile.provider.AbstractProvider; +import com.rekoe.utils.Constants; +import com.rekoe.utils.HmacSHA1Encryption; + +@IocBean +@PlatformProvider(name = Constants.XIAOMI) +public class XiaoMiProvider extends AbstractProvider { + + private static final long serialVersionUID = 2882126009485835543L; + + private final static Log log = Logs.get(); + + private final static String PARAM_URL_STR = "appId={0}&session={1}&uid={2}&signature={3}"; + private final static String ENCRYPT_TEXT = "appId={0}&session={1}&uid={2}"; + private static final Map ENDPOINTS; + + private final String ERROR_CODE = "{\"errcode\":-1}"; + static { + ENDPOINTS = new HashMap(); + ENDPOINTS.put(Constants.OAUTH_AUTHORIZATION_URL, "http://mis.migc.xiaomi.com/api/biz/service/verifySession.do?"); + } + + public Map checkUserAndroidMiLogin(String sdkUin, String sdkToken, String appid, String secret) throws Exception { + String encryptText = MessageFormat.format(ENCRYPT_TEXT, appid, sdkToken, sdkUin); + String signature = HmacSHA1Encryption.HmacSHA1Encrypt(encryptText, secret); + String getUrl = ENDPOINTS.get(Constants.OAUTH_AUTHORIZATION_URL) + MessageFormat.format(PARAM_URL_STR, appid, sdkToken, sdkUin, signature); + return result2Json(HttpGet(getUrl), Integer.class, ERROR_CODE); + } + + @Override + public String getProviderId() { + return Constants.XIAOMI; + } + + @Override + public Profile verifyResponse(XiaoMiParam param) throws Exception { + PlatformConfig platformConfig = getPlatformConfig(param.getPid()); + Map params = checkUserAndroidMiLogin(param.getUid(), param.getToken(), platformConfig.getConfig().getString("appid"), platformConfig.getConfig().getString("secret")); + if (params.get("errcode") == 200) { + return new Profile(getProviderId(), param.getUid(), param.getPid()); + } else { + log.errorf("ProviderId:%s,errCode:%s", getProviderId(), params); + } + return null; + } +} diff --git a/src/main/java/com/rekoe/module/AccessTokenModule.java b/src/main/java/com/rekoe/module/AccessTokenModule.java new file mode 100644 index 0000000..6ac6941 --- /dev/null +++ b/src/main/java/com/rekoe/module/AccessTokenModule.java @@ -0,0 +1,117 @@ +package com.rekoe.module; + +import java.net.URISyntaxException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.oltu.oauth2.as.issuer.MD5Generator; +import org.apache.oltu.oauth2.as.issuer.OAuthIssuer; +import org.apache.oltu.oauth2.as.issuer.OAuthIssuerImpl; +import org.apache.oltu.oauth2.as.request.OAuthTokenRequest; +import org.apache.oltu.oauth2.as.response.OAuthASResponse; +import org.apache.oltu.oauth2.common.OAuth; +import org.apache.oltu.oauth2.common.error.OAuthError; +import org.apache.oltu.oauth2.common.exception.OAuthProblemException; +import org.apache.oltu.oauth2.common.exception.OAuthSystemException; +import org.apache.oltu.oauth2.common.message.OAuthResponse; +import org.apache.oltu.oauth2.common.message.types.GrantType; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.By; +import org.nutz.mvc.annotation.Filters; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.POST; +import org.nutz.mvc.annotation.Param; + +import com.rekoe.filter.OauthCrossOriginFilter; +import com.rekoe.service.OAuthService; +import com.rekoe.utils.Constants; + +@IocBean +@At("/oauth") +public class AccessTokenModule { + + @Inject + private OAuthService oAuthService; + + /** + * @api {post} /oauth/accessToken 换取accessToken + * + * @apiGroup User + * @apiVersion 1.0.0 + * @apiSampleRequest http://warlogin.shanggame.com/oauth/accessToken + * + * @apiParam {String} client_id 应用id + * @apiParam {String} client_secret 应用secret + * + * @apiParam {String} grant_type=authorization_code 用于传递授权码的参数名 + * @apiParam {String} code 用户登录授权后的授权码 + * @apiParam {String} [redirect_uri=http://www.rekoe.com] 回调地址 + * + * @apiSuccess {int} expires_in=3600 accessToken过期时间 单位(秒) + * @apiSuccess {String} access_token accessToken值 + * + * @apiSuccessExample {json} Success-Response: + * {"expires_in":3600,"access_token":"223ae05dfbb0794396fb60a0960c197e"} + */ + + @At + @Ok("raw:json") + @Filters(@By(type = OauthCrossOriginFilter.class)) + public String accessToken(HttpServletRequest request) throws URISyntaxException, OAuthSystemException { + try { + // 构建OAuth请求 + OAuthTokenRequest oauthRequest = new OAuthTokenRequest(request); + // 检查提交的客户端id是否正确 + if (!oAuthService.checkClientId(oauthRequest.getClientId())) { + OAuthResponse response = OAuthASResponse.errorResponse(HttpServletResponse.SC_BAD_REQUEST).setError(OAuthError.TokenResponse.INVALID_CLIENT).setErrorDescription(Constants.INVALID_CLIENT_ID).buildJSONMessage(); + return response.getBody(); + } + // 检查客户端安全KEY是否正确 + if (!oAuthService.checkClientSecret(oauthRequest.getClientSecret())) { + OAuthResponse response = OAuthASResponse.errorResponse(HttpServletResponse.SC_UNAUTHORIZED).setError(OAuthError.TokenResponse.UNAUTHORIZED_CLIENT).setErrorDescription(Constants.INVALID_CLIENT_ID).buildJSONMessage(); + return response.getBody(); + } + String authCode = oauthRequest.getParam(OAuth.OAUTH_CODE); + // 检查验证类型,此处只检查AUTHORIZATION_CODE类型,其他的还有PASSWORD或REFRESH_TOKEN + if (oauthRequest.getParam(OAuth.OAUTH_GRANT_TYPE).equals(GrantType.AUTHORIZATION_CODE.toString())) { + if (!oAuthService.checkAuthCode(authCode)) { + OAuthResponse response = OAuthASResponse.errorResponse(HttpServletResponse.SC_BAD_REQUEST).setError(OAuthError.TokenResponse.INVALID_GRANT).setErrorDescription(Constants.INVALID_AUTH_CODE).buildJSONMessage(); + return response.getBody(); + } + } + // 生成Access Token + OAuthIssuer oauthIssuerImpl = new OAuthIssuerImpl(new MD5Generator()); + final String accessToken = oauthIssuerImpl.accessToken(); + oAuthService.addAccessToken(accessToken, oAuthService.getUsernameByAuthCode(authCode)); + // 生成OAuth响应 + OAuthResponse response = OAuthASResponse.tokenResponse(HttpServletResponse.SC_OK).setAccessToken(accessToken).setExpiresIn(String.valueOf(oAuthService.getExpireIn())).buildJSONMessage(); + // 根据OAuthResponse生成ResponseEntity + return response.getBody(); + } catch (OAuthProblemException e) { + // 构建错误响应 + OAuthResponse res = OAuthASResponse.errorResponse(HttpServletResponse.SC_BAD_REQUEST).error(e).buildJSONMessage(); + return res.getBody(); + } + } + + /** + * 验证accessToken + * + * @param accessToken + * @return + */ + @At + @POST + public void checkAccessToken(@Param("accessToken") String accessToken, HttpServletResponse res) { + boolean b = oAuthService.checkAccessToken(accessToken); + if (b) { + res.setStatus(HttpServletResponse.SC_OK); + } else { + res.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + } + } + +} diff --git a/src/main/java/com/rekoe/module/AuthorizeAction.java b/src/main/java/com/rekoe/module/AuthorizeAction.java new file mode 100644 index 0000000..23ee6d3 --- /dev/null +++ b/src/main/java/com/rekoe/module/AuthorizeAction.java @@ -0,0 +1,149 @@ +package com.rekoe.module; + +import java.net.URISyntaxException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.oltu.oauth2.as.issuer.MD5Generator; +import org.apache.oltu.oauth2.as.issuer.OAuthIssuerImpl; +import org.apache.oltu.oauth2.as.request.OAuthAuthzRequest; +import org.apache.oltu.oauth2.common.OAuth; +import org.apache.oltu.oauth2.common.exception.OAuthProblemException; +import org.apache.oltu.oauth2.common.exception.OAuthSystemException; +import org.apache.oltu.oauth2.common.message.types.ResponseType; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Strings; +import org.nutz.lang.util.NutMap; +import org.nutz.log.Log; +import org.nutz.log.Logs; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.By; +import org.nutz.mvc.annotation.Filters; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.POST; + +import com.rekoe.domain.OAuthUser; +import com.rekoe.filter.OauthCrossOriginFilter; +import com.rekoe.utils.CommonUtils; + +/** + * @apiDefine TOKEN_ERROR + * @apiError 403 The accesstoken is invaild + */ +/** + * @apiDefine TOKEN + * @apiParam {String} accesstoken 访问凭证 + * + */ +@At("/api/v1/") +@IocBean +@Filters(@By(type = OauthCrossOriginFilter.class)) +public class AuthorizeAction { + + private final static Log log = Logs.get(); + + @Inject + private com.rekoe.service.OAuthService oAuthService; + @Inject + private com.rekoe.service.OAuthClientService oAuthClientService; + @Inject + private com.rekoe.service.OAuthUserService oAuthUserService; + + /** + * @apiDefine CODE_200 + * @apiSuccess (Reponse 200) {number} code 200 + * @apiSuccess (Reponse 200) {json} [data='""'] 如果有数据返回 + * @apiSuccessExample {json} Response 200 + * { + * "code":200, + * "feedback":0, + * "msg","Ok" + * } + */ + + /** + * @api {post} /api/v1/authorize 请求授权码 + * @apiSampleRequest http://warlogin.shanggame.com/api/v1/authorize + * @apiDescription 用户输入正确的用户名和密码以POST方式提交后会重定向到用户所填的回调地址并在地址后携带授权码. + * @apiGroup User + * @apiVersion 1.0.0 + * + * @apiParam {String} username 用户名 + * @apiParam {String} password 密码 + * @apiParam {String} client_id 应用id + * @apiParam {String} response_type=code 返回授权码的标识 + * + * @apiSuccess (成功返回值) {int} feedback 响应状态 0 为成功 + * @apiSuccess (成功返回值) {String} msg 错误描述 + * @apiSuccess (成功返回值) {String} code 授权码 + * @apiSuccessExample {json} Success-Response: + * { + * "code":"c1b0a32d71101d00f4c96a134ec6bd42", + * "feedback": 0, + * "msg": "Ok" + * } + */ + + @At + @Ok("json") + @POST + public NutMap authorize(HttpServletRequest request, HttpServletResponse res) throws URISyntaxException, OAuthSystemException { + try { + // 构建OAuth 授权请求 + OAuthAuthzRequest oauthRequest = new OAuthAuthzRequest(request); + // 检查传入的客户端id是否正确 + if (!oAuthService.checkClientId(oauthRequest.getClientId())) { + return NutMap.NEW().addv("feedback", 2); + } + + // 如果用户没有登录,跳转到登陆页面 + if (!login(request)) {// 登录失败时跳转到登陆页面 + return NutMap.NEW().addv("feedback", 3).addv("msg", "登陆失败"); + } + + String username = request.getParameter("username"); // 获取用户名 + // responseType目前仅支持CODE,另外还有TOKEN + NutMap map = NutMap.NEW(); + String responseType = oauthRequest.getParam(OAuth.OAUTH_RESPONSE_TYPE); + if (responseType.equals(ResponseType.CODE.toString())) { + OAuthIssuerImpl oauthIssuerImpl = new OAuthIssuerImpl(new MD5Generator()); + String authorizationCode = oauthIssuerImpl.authorizationCode(); + oAuthService.addAuthCode(authorizationCode, username); + map.addv("code", authorizationCode); + } else { + return map.addv("feedback", 4).addv("msg", "参数错误"); + } + map.addv("feedback", 0).addv("msg", "Ok"); + return map; + } catch (OAuthProblemException e) { + log.error(e); + } + return null; + } + + private boolean login(HttpServletRequest request) { + NutMap parames = CommonUtils.getRequestParametersMap(request); + String username = parames.getString("username"); + String password = parames.getString("password"); + if (Strings.isEmpty(username) || Strings.isEmpty(password)) { + return false; + } + try { + OAuthUser user = oAuthUserService.findByUsername(username); + if (user != null) { + if (!oAuthUserService.checkUser(username, password, user.getSalt(), user.getPassword())) { + return false; + } else { + return true; + } + } else { + return false; + } + } catch (Exception e) { + log.error(e); + return false; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/module/BaseAction.java b/src/main/java/com/rekoe/module/BaseAction.java new file mode 100644 index 0000000..fe60df2 --- /dev/null +++ b/src/main/java/com/rekoe/module/BaseAction.java @@ -0,0 +1,127 @@ +package com.rekoe.module; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.lang3.StringUtils; +import org.nutz.dao.Dao; +import org.nutz.dao.entity.Record; +import org.nutz.dao.util.Daos; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.log.Log; +import org.nutz.log.Logs; +import org.nutz.web.ajax.AjaxReturn; + +import com.rekoe.common.Message; +import com.rekoe.domain.GameServer; +import com.rekoe.service.GameServerService; + +public class BaseAction { + private final static Log log = Logs.get(); + + @Inject + public GameServerService gameServerService; + + protected Message responseMessage(AjaxReturn result, HttpServletRequest req) { + return result.isOk() ? Message.success("admin.common.ok", req) : Message.error(StringUtils.defaultString(result.getMsg(), "admin.common.resopnse.error"), req); + } + + public GameServer getServer(int id) { + GameServer server = gameServerService.getServer(id); + return server; + } + + public List getAllServerIDs() { + return gameServerService.getAllIds(); + } + + public int getPage(Integer page) { + return page == null ? 1 : page.intValue(); + } + + public boolean checkTableExist(final Dao dao, final Class classOfT, String time) { + return Daos.ext(dao, time).exists(classOfT); + } + + public class down { + private ByteArrayOutputStream bout = new ByteArrayOutputStream(); + + public ByteArrayOutputStream invoke(String[] heads, List records, DownCallBack callBack) throws IOException { + StringBuffer sb = new StringBuffer(); + for (String head : heads) { + sb.append(head).append(","); + } + sb.delete(sb.length() - 1, sb.length()); + bout.write(sb.toString().getBytes()); + bout.write(new byte[] { 13, 10 }); + for (final Record record : records) { + bout.write(download(callBack, record)); + } + bout.close(); + return bout; + } + + public ByteArrayOutputStream invoke(List records, DownCallBack callBack) throws IOException { + for (final Record record : records) { + bout.write(download(callBack, record)); + } + bout.close(); + return bout; + } + + private byte[] download(DownCallBack callBack, Record record) { + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + DataOutputStream dout = new DataOutputStream(bout); + try { + callBack.invoke(dout, record); + dout.write(new byte[] { 13, 10 }); + bout.close(); + dout.close(); + } catch (IOException e) { + log.error(e.getMessage()); + } + return bout.toByteArray(); + } + } + + public interface DownCallBack { + public void invoke(DataOutputStream dout, Record record) throws IOException; + } + + public class DefaultDownCallBack implements DownCallBack { + + private String[] heads; + + public DefaultDownCallBack(String[] heads) { + this.heads = heads; + } + + @Override + public void invoke(DataOutputStream dout, org.nutz.dao.entity.Record record) throws IOException { + StringBuffer sb = new StringBuffer(); + for (String str : heads) { + sb.append(record.getString(str)).append(","); + } + dout.write(sb.toString().getBytes()); + } + } + + public ByteArrayOutputStream loadDown(List records) throws IOException { + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + if (!records.isEmpty()) { + Record r = records.get(0); + Set set = r.keySet(); + List keys = new ArrayList<>(set); + String[] heads = keys.toArray(new String[keys.size()]); + DownCallBack callBack = new DefaultDownCallBack(heads); + bout = new down().invoke(heads, records, callBack); + } + return bout; + } +} diff --git a/src/main/java/com/rekoe/module/CdkeyBean.java b/src/main/java/com/rekoe/module/CdkeyBean.java new file mode 100644 index 0000000..84453e6 --- /dev/null +++ b/src/main/java/com/rekoe/module/CdkeyBean.java @@ -0,0 +1,63 @@ +package com.rekoe.module; + +public class CdkeyBean { + + private String sign; + private String cdkey; + private String mac; + private int pid; + private String providerId; + + public CdkeyBean() { + super(); + } + + public CdkeyBean(String sign, String cdkey, String mac, int pid, String providerId) { + super(); + this.sign = sign; + this.cdkey = cdkey; + this.mac = mac; + this.pid = pid; + this.providerId = providerId; + } + + public String getSign() { + return sign; + } + + public void setSign(String sign) { + this.sign = sign; + } + + public String getMac() { + return mac; + } + + public void setMac(String mac) { + this.mac = mac; + } + + public int getPid() { + return pid; + } + + public void setPid(int pid) { + this.pid = pid; + } + + public String getProviderId() { + return providerId; + } + + public void setProviderId(String providerId) { + this.providerId = providerId; + } + + public String getCdkey() { + return cdkey; + } + + public void setCdkey(String cdkey) { + this.cdkey = cdkey; + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/module/ExchargeAction.java b/src/main/java/com/rekoe/module/ExchargeAction.java new file mode 100644 index 0000000..f74927f --- /dev/null +++ b/src/main/java/com/rekoe/module/ExchargeAction.java @@ -0,0 +1,70 @@ +package com.rekoe.module; + +import org.nutz.ioc.impl.PropertiesProxy; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.lang.util.NutMap; +import org.nutz.log.Log; +import org.nutz.log.Logs; +import org.nutz.mvc.adaptor.JsonAdaptor; +import org.nutz.mvc.annotation.AdaptBy; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.POST; + +import com.rekoe.domain.CdkeyLog; +import com.rekoe.service.CdKeyCategoryService; +import com.rekoe.service.CdKeyLogService; +import com.rekoe.service.CdKeyService; + +@IocBean +@At("/excharge") +public class ExchargeAction { + + private final static Log log = Logs.get(); + @Inject + private CdKeyService cdKeyService; + + @Inject + private CdKeyCategoryService cdKeyCategoryService; + + @Inject + private CdKeyLogService cdKeyLogService; + + @Inject + private PropertiesProxy conf; + + @At + @Ok("json") + @POST + @AdaptBy(type = JsonAdaptor.class) + public NutMap cdk(CdkeyBean bean) { + StringBuffer sb = new StringBuffer("cdk."); + sb.append(bean.getPid()).append(".secret"); + String secret = conf.get(sb.toString()); + String sign = Lang.md5(bean.getCdkey() + "|" + bean.getMac() + "|" + bean.getPid() + "|" + secret); + if (log.isDebugEnabled()) { + log.debugf("secretKey : %s", sb); + log.debugf("secret : %s", secret); + log.debugf("Cdkey : %s", bean.getCdkey()); + log.debugf("Mac : %s", bean.getMac()); + log.debugf("Pid : %s", bean.getPid()); + log.debugf("Sign : %s", bean.getSign()); + log.debugf("P_Sign : %s", sign); + } + + if (Lang.equals(sign, bean.getSign())) { + int type = cdKeyCategoryService.getType(bean.getCdkey()); + if (cdKeyCategoryService.isExists(type)) { + if (cdKeyService.use(bean.getCdkey(), type)) { + cdKeyLogService.insert(new CdkeyLog(bean.getPid(), bean.getProviderId(), bean.getMac())); + return NutMap.NEW().addv("feedback", 0).addv("mesage", "ok"); + } + return NutMap.NEW().addv("feedback", 92).addv("mesage", "已失效"); + } + return NutMap.NEW().addv("feedback", 93).addv("mesage", "不存在"); + } + return NutMap.NEW().addv("feedback", 61).addv("mesage", "签名失败"); + } +} diff --git a/src/main/java/com/rekoe/module/IndexAct.java b/src/main/java/com/rekoe/module/IndexAct.java new file mode 100644 index 0000000..c6ba3e4 --- /dev/null +++ b/src/main/java/com/rekoe/module/IndexAct.java @@ -0,0 +1,28 @@ +package com.rekoe.module; + +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.By; +import org.nutz.mvc.annotation.Filters; +import org.nutz.mvc.annotation.Ok; + +import com.rekoe.filter.IPFilter; + +@IocBean +@At("/user") +@Filters(@By(type = IPFilter.class, args = { "ioc:iPFilter" })) +public class IndexAct { + + @At + @Ok("fm:template.login.login") + public void login() { + /* + * try { SecurityUtils.getSubject().logout(); } catch (SessionException + * ise) { logger.debug( + * "Encountered session exception during logout. This can generally safely be ignored." + * , ise); } catch (Exception e) { logger.debug("登出发生错误", e); } + */ + } + + // /user/login +} diff --git a/src/main/java/com/rekoe/module/IpSearchAction.java b/src/main/java/com/rekoe/module/IpSearchAction.java new file mode 100644 index 0000000..80365d9 --- /dev/null +++ b/src/main/java/com/rekoe/module/IpSearchAction.java @@ -0,0 +1,22 @@ +package com.rekoe.module; + +import org.nutz.http.Http; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.POST; +import org.nutz.mvc.annotation.Param; + +@IocBean +@At("/api") +public class IpSearchAction { + + private final static String API_URL = "http://ip.taobao.com/service/getIpInfo.php?ip="; + + @At("/ip/search") + @Ok("raw:json") + @POST + public String search(@Param("ip") String ip) { + return Http.get(API_URL + ip).getContent(); + } +} diff --git a/src/main/java/com/rekoe/module/NoticeModule.java b/src/main/java/com/rekoe/module/NoticeModule.java new file mode 100644 index 0000000..d541520 --- /dev/null +++ b/src/main/java/com/rekoe/module/NoticeModule.java @@ -0,0 +1,78 @@ +package com.rekoe.module; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.nutz.dao.Cnd; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.By; +import org.nutz.mvc.annotation.Filters; +import org.nutz.mvc.annotation.Ok; + +import com.rekoe.domain.Notice; +import com.rekoe.filter.OauthCrossOriginFilter; +import com.rekoe.service.NoticeService; + +@IocBean +@At("/notice") +@Filters(@By(type = OauthCrossOriginFilter.class)) +public class NoticeModule { + + @Inject + private NoticeService noticeService; + + /** + * @api {post} /notice/:pid/list 获得公告列表 + * @apiParam {Number} pid 申请的游戏编码ID + * @apiGroup notice + * @apiVersion 1.0.0 + * @apiSampleRequest http://warlogin.shanggame.com/notice/:pid/list + * @apiSuccess {Object[]} notices List of notice. + * @apiSuccess {String} notices.color 公告标题颜色. + * @apiSuccess {String} notices.title 公告标题. + * @apiSuccess {number} notices.id 公告ID. + * @apiSuccessExample {json} Success-Response: + * [ + * { + * "color": "#FFFFF", "title": "xxxx" ,"id":1 + * } + * ] + */ + + @At("/?/list") + @Ok("json") + public Object list(int pid) { + List list = noticeService.query(Cnd.where("pid", "=", pid).and("publication", "=", true).desc("top"), null); + if (Lang.isEmpty(list)) { + return new ArrayList(); + } + return list; + } + + /** + * @api {post} /notice/view/:id 公告内容详细 + * + * @apiParam {Number} id ID. + * + * @apiGroup notice + * @apiVersion 1.0.0 + * @apiSampleRequest http://warlogin.shanggame.com/notice/view/:id + */ + + @At("/view/?") + @Ok("raw") + public String view(long id,HttpServletRequest req) throws IOException { + Notice article =noticeService.fetch(id); + if (Lang.isEmpty(article)) { + return "empty"; + } + return article.getContent(); + } + +} diff --git a/src/main/java/com/rekoe/module/OAuthUserAction.java b/src/main/java/com/rekoe/module/OAuthUserAction.java new file mode 100644 index 0000000..57df39b --- /dev/null +++ b/src/main/java/com/rekoe/module/OAuthUserAction.java @@ -0,0 +1,324 @@ +package com.rekoe.module; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.math.NumberUtils; +import org.apache.oltu.oauth2.as.issuer.MD5Generator; +import org.apache.oltu.oauth2.as.issuer.OAuthIssuerImpl; +import org.apache.oltu.oauth2.common.exception.OAuthSystemException; +import org.nutz.castor.Castors; +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.By; +import org.nutz.mvc.annotation.Filters; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.POST; +import org.nutz.mvc.annotation.Param; + +import com.rekoe.domain.GameServer; +import com.rekoe.domain.OAuthUser; +import com.rekoe.domain.PlatformUser; +import com.rekoe.filter.OauthCrossOriginFilter; +import com.rekoe.mobile.provider.PlatformProviderFactory; +import com.rekoe.service.GameServerService; +import com.rekoe.service.IdWorkerService; +import com.rekoe.service.OAuthService; +import com.rekoe.service.OAuthUserService; +import com.rekoe.service.PlatformUserService; +import com.rekoe.utils.CommonUtils; +import com.rekoe.utils.Constants; + +@IocBean +@At("/auth") +@Filters(@By(type = OauthCrossOriginFilter.class)) +public class OAuthUserAction { + + private final static String PHONE_KEY = "rk_phone_key"; + private final static String PHONE_NUMBER = "rk_phone_number"; + private final static String OAUTH_USER_KEY = "rk_oauth_user_key"; + + @Inject + private OAuthUserService oAuthUserService; + + @Inject + private OAuthService oAuthService; + + @Inject + private GameServerService gameServerService; + + /** + * @api {post} /auth/user/create 创建账号并获取授权码 + * + * @apiGroup User + * @apiVersion 1.0.0 + * @apiSampleRequest http://warlogin.shanggame.com/auth/user/create + * @apiParam {String} name 用户名 + * @apiParam {String} password 密码 + * @apiParam {String} captcha 手机收到的验证码 + * @apiParamExample {String} Request-Example: + * user.name=xxx&user.password=xxx&captcha=xxx + * @apiSuccess {int} feedback 响应状态 0 为成功 1 账号被占用 + * @apiSuccess {String} code 授权码 + */ + + /** + * 普通注册 + * + * @param user + * @return + * @throws OAuthSystemException + */ + @At("/user/create") + @Ok("json") + @POST + public NutMap create(HttpServletRequest req) throws OAuthSystemException { + HttpSession session = req.getSession(); + Object phoneCodeObj = session.getAttribute(PHONE_KEY); + Object phoneObj = session.getAttribute(PHONE_NUMBER); + if (Lang.isEmpty(phoneCodeObj) || Lang.isEmpty(phoneObj)) { + return NutMap.NEW().addv("feedback", 404); + } + NutMap parames = CommonUtils.getRequestParametersMap(req); + int captcha = parames.getInt("captcha",0); + String name = parames.getString("name"); + String pwd = parames.getString("password"); + + int phoneCode = Castors.me().castTo(phoneCodeObj,int.class); + if (StringUtils.isBlank(pwd) || StringUtils.isBlank(name) || captcha != phoneCode) { + return NutMap.NEW().addv("feedback", 1); + } + long phone = Castors.me().castTo(phoneObj, long.class); + NutMap map = NutMap.NEW(); + if (checkOauthUser(name)) { + OAuthIssuerImpl oauthIssuerImpl = new OAuthIssuerImpl(new MD5Generator()); + String authorizationCode = oauthIssuerImpl.authorizationCode(); + oAuthService.addAuthCode(authorizationCode, name); + map.addv("code", authorizationCode); + OAuthUser user = new OAuthUser(); + user.setPhoneCode(phone); + user.setPassword(pwd); + user.setUserName(name); + oAuthUserService.createUser(user); + session.setAttribute(PHONE_KEY, null); + session.setAttribute(PHONE_NUMBER, null); + } else { + return map.addv("feedback", 1); + } + return map.addv("feedback", 0); + } + + /** + * @api {post} /auth/rest/pwd 密码重置 + * + * @apiGroup User + * @apiVersion 1.0.0 + * @apiSampleRequest http://warlogin.shanggame.com/auth/rest/pwd + * + * @apiParam {String} captcha 手机收到的验证码 + * @apiParam {String} password 需要重置的新密码 + * + * @apiSuccess {int} feedback 响应状态 0 为成功 + * @apiSuccessExample {json} Success-Response: + * { "feedback": 0 } + */ + + @At("/rest/pwd") + @Ok("json") + @POST + public NutMap restpwd(HttpServletRequest req) throws OAuthSystemException { + HttpSession session = req.getSession(); + Object phoneCodeObj = session.getAttribute(PHONE_KEY); + Object nameObj = session.getAttribute(OAUTH_USER_KEY); + if (Lang.isEmpty(phoneCodeObj) || Lang.isEmpty(nameObj)) { + return NutMap.NEW().addv("feedback", 404); + } + NutMap parames = CommonUtils.getRequestParametersMap(req); + int captcha = parames.getInt("captcha",0); + String pwd = parames.getString("password"); + String name = Castors.me().castToString(nameObj); + int phoneCode = Castors.me().castTo(phoneCodeObj,int.class); + if (StringUtils.isBlank(pwd) || captcha!=phoneCode) { + return NutMap.NEW().addv("feedback", 1); + } + + OAuthIssuerImpl oauthIssuerImpl = new OAuthIssuerImpl(new MD5Generator()); + String authorizationCode = oauthIssuerImpl.authorizationCode(); + oAuthService.addAuthCode(authorizationCode, name); + oAuthUserService.updateByChain(name, pwd); + session.setAttribute(PHONE_KEY, null); + session.setAttribute(OAUTH_USER_KEY, null); + return NutMap.NEW().addv("feedback", 0).addv("code", authorizationCode); + } + + private boolean checkOauthUser(String name) { + if (CommonUtils.isUsername(name) && StringUtils.isNotBlank(name) && Lang.isEmpty(oAuthUserService.findByUsername(name))) { + return true; + } + return false; + } + + /** + * @api {post} /auth/phone/captcha 获取手机验证码 + * + * @apiGroup User + * @apiVersion 1.0.0 + * @apiSampleRequest http://warlogin.shanggame.com/auth/phone/captcha + * + * @apiParam {Number} phone 手机号 + * @apiParam {Number} pid 引用所属游戏平台编号 + * + * @apiSuccess {int} feedback 响应状态 0 为成功, 100手机号非法, 101未注册的游戏平台 + * @apiSuccessExample {json} Success-Response: + * { "feedback": 0 } + */ + + @At("/phone/captcha") + @Ok("raw:json") + @POST + public String regCaptcha(@Param("phone") String phone, @Param("pid") int pid, HttpSession session) { + if (!NumberUtils.isNumber(phone) || phone.length() != 11) { + return "{\"feedback\":100}"; + } + GameServer gameServer = gameServerService.getByPid(pid); + if (Lang.isEmpty(gameServer)) { + return "{\"feedback\":101}"; + } + int code = CommonUtils.nextInt(1000, 9999); + boolean isRight = gameServerService.sendPhoneMail(gameServer, phone, "29337", code + "", "30"); + if (isRight) { + session.setAttribute(PHONE_KEY, code); + session.setAttribute(PHONE_NUMBER, phone); + return "{\"feedback\":0,\"session\":\"" + session.getId() + "\"}"; + } + return "{\"feedback\":102}"; + } + + /** + * @api {post} /auth/rest/captcha 获取手机验证码-密码重置 + * + * @apiGroup User + * @apiVersion 1.0.0 + * @apiSampleRequest http://warlogin.shanggame.com/auth/rest/captcha + * + * @apiParam {String} name 用户名 + * @apiParam {Number} phone 手机号 + * @apiParam {Number} pid 引用所属游戏平台编号 + * + * @apiSuccess {int} feedback 响应状态 0 为成功, 100手机号非法, 101未注册的游戏平台 + * @apiSuccessExample {json} Success-Response: + * { "feedback": 0 } + */ + + @At("/rest/captcha") + @Ok("raw:json") + @POST + public String restCaptcha(@Param("phone") String phone, @Param("name") String name, @Param("pid") int pid, HttpSession session) { + if (!NumberUtils.isNumber(phone) || phone.length() != 11) { + return "{\"feedback\":100}"; + } + GameServer gameServer = gameServerService.getByPid(pid); + if (Lang.isEmpty(gameServer)) { + return "{\"feedback\":101}"; + } + boolean isOk = oAuthUserService.checkRestPwd(name, NumberUtils.toLong(phone)); + if (isOk) { + int code = CommonUtils.nextInt(100000, 999999); + boolean isRight = gameServerService.sendPhoneMail(gameServer, phone, "29337", code + "", "30"); + if (isRight) { + session.setAttribute(PHONE_KEY, code); + session.setAttribute(OAUTH_USER_KEY, name); + return "{\"feedback\":0,\"session\":\"" + session.getId() + "\"}"; + } + } + return "{\"feedback\":102}"; + } + + @Inject + private PlatformUserService platformUserService; + + @Inject + private PlatformProviderFactory platformProviderFactory; + + @Inject + private IdWorkerService idFactory; + + private final Object obj = new Object(); + + /** + * @api {post} /auth/account/bind 账号绑定 + * + * @apiGroup User + * @apiVersion 1.0.0 + * @apiSampleRequest http://warlogin.shanggame.com/auth/account/bind + * + * @apiParam {String} name 用户名 + * @apiParam {String} password 密码 + * @apiParam {Number} pid 引用所属游戏平台编号 + * @apiParam {String} captcha 手机收到的验证码 + * @apiParam {String} guestid 需要绑定的游客ID + * + * @apiSuccess {int} feedback 响应状态 0 为成功, 100手机号非法, 101未注册的游戏平台 + * @apiSuccessExample {json} Success-Response: + * { "feedback": 0 } + */ + + @At("/account/bind") + @Ok("json") + @POST + public NutMap bindAccount(HttpServletRequest req) { + HttpSession session = req.getSession(); + Object phoneCodeObj = session.getAttribute(PHONE_KEY); + Object phoneObj = session.getAttribute(PHONE_NUMBER); + if (Lang.isEmpty(phoneCodeObj) || Lang.isEmpty(phoneObj)) { + return NutMap.NEW().addv("feedback", 404); + } + NutMap parames = CommonUtils.getRequestParametersMap(req); + int pid = parames.getInt("pid", -1); + String pwd = parames.getString("password"); + if (StringUtils.isBlank(pwd)) { + return NutMap.NEW().addv("feedback", 501).addv("msg", "密码不可以为空"); + } + int captcha = parames.getInt("captcha", 0); + int phoneCode = Castors.me().castTo(phoneCodeObj, int.class); + if (captcha != phoneCode) { + return NutMap.NEW().addv("feedback", 502).addv("msg", "验证码错误"); + } + String guestid = parames.getString("guestid"); + if (StringUtils.isBlank(guestid)) { + return NutMap.NEW().addv("feedback", 503).addv("msg", "游客ID不可以为空"); + } + PlatformUser platformUser = platformUserService.getPlatformUser(pid, guestid, Constants.GUEST); + if (Lang.isEmpty(platformUser)) { + return NutMap.NEW().addv("feedback", 405).addv("msg", "未找到此游客记录"); + } + long phone = Castors.me().castTo(phoneObj, long.class); + String name = parames.getString("name"); + if (checkOauthUser(name)) { + // 创建账号 + long newOpenid = idFactory.nextId(); + synchronized (obj) { + OAuthUser user = new OAuthUser(); + user.setPhoneCode(phone); + user.setPassword(pwd); + user.setUserName(name); + user.setBind(true); + user.setBindProviderId(platformUser.getPfid()); + user = oAuthUserService.createUser(user, platformUser.getOpenid()); + platformUser.setOpenid(newOpenid); + platformUserService.update(Chain.make("openid", newOpenid), Cnd.where("id", "=", platformUser.getId())); + session.setAttribute(PHONE_KEY, null); + session.setAttribute(PHONE_NUMBER, null); + } + } else { + return NutMap.NEW().addv("feedback", 504).addv("msg", "账号已被占用"); + } + return NutMap.NEW().addv("feedback", 0); + } +} diff --git a/src/main/java/com/rekoe/module/OauthLoginAct.java b/src/main/java/com/rekoe/module/OauthLoginAct.java new file mode 100644 index 0000000..a091111 --- /dev/null +++ b/src/main/java/com/rekoe/module/OauthLoginAct.java @@ -0,0 +1,146 @@ +package com.rekoe.module; + +import java.io.File; +import java.io.FileInputStream; +import java.net.URLEncoder; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.ExcessiveAttemptsException; +import org.apache.shiro.authc.IncorrectCredentialsException; +import org.apache.shiro.authc.LockedAccountException; +import org.apache.shiro.authc.UnknownAccountException; +import org.apache.shiro.authz.annotation.RequiresAuthentication; +import org.apache.shiro.subject.Subject; +import org.apache.shiro.util.ThreadContext; +import org.brickred.socialauth.AuthProvider; +import org.brickred.socialauth.Profile; +import org.brickred.socialauth.SocialAuthConfig; +import org.brickred.socialauth.SocialAuthManager; +import org.brickred.socialauth.exception.SocialAuthException; +import org.brickred.socialauth.util.SocialAuthUtil; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Encoding; +import org.nutz.lang.Files; +import org.nutz.lang.Lang; +import org.nutz.lang.stream.NullInputStream; +import org.nutz.mvc.View; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.By; +import org.nutz.mvc.annotation.Filters; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.view.ForwardView; +import org.nutz.mvc.view.ServerRedirectView; +import org.nutz.mvc.view.ViewWrapper; +import org.nutz.plugins.view.freemarker.FreeMarkerConfigurer; +import org.nutz.plugins.view.freemarker.FreemarkerView; + +import com.rekoe.common.Message; +import com.rekoe.filter.IPFilter; +import com.rekoe.shiro.realm.OAuthToken; + +/** + * @author 科技㊣²º¹³
+ * 2014年2月3日 下午4:48:45
+ * http://www.rekoe.com QQ:5382211 + */ +@IocBean(create = "init") +@At("/user") +@Filters(@By(type = IPFilter.class, args = { "ioc:iPFilter" })) +public class OauthLoginAct { + + @Inject + private FreeMarkerConfigurer freeMarkerConfigurer; + + // 需要登录之后才能访问,否则跳转到首页 + @RequiresAuthentication + @At + public Object authOnly() { + return "You are authed!"; + } + + /* 提供社会化登录 */ + @At("/login/?") + @Ok("void") + public void login(String provider, HttpSession session, HttpServletRequest req, HttpServletResponse res) throws Exception { + String returnTo = req.getRequestURL().toString() + "/callback"; + if (req.getParameterMap().size() > 0) { + StringBuilder sb = new StringBuilder().append(returnTo).append("?"); + for (Object name : req.getParameterMap().keySet()) { + sb.append(name).append('=').append(URLEncoder.encode(req.getParameter(name.toString()), Encoding.UTF8)).append("&"); + } + returnTo = sb.toString(); + } + SocialAuthManager manager = new SocialAuthManager(); // 每次都要新建哦 + manager.setSocialAuthConfig(config); + session.setAttribute("openid.manager", manager); + String url = manager.getAuthenticationUrl(provider, returnTo); + res.setHeader("Location", url); + res.setStatus(302); + } + + // 没登录就不要登出了 + @RequiresAuthentication + @At("/logout") + @Ok(">>:/admin/index.rk") + public void logout(HttpSession session) { + // session.invalidate(); //销毁会话,啥都米有了 + SecurityUtils.getSubject().logout(); + } + + /* 无需做链接,这是OpenID的回调地址 */ + @At("/login/?/callback") + public View returnPoint(String providerId, HttpServletRequest request, HttpSession session) throws Exception { + SocialAuthManager manager = (SocialAuthManager) session.getAttribute("openid.manager"); + if (manager == null) + throw new SocialAuthException("Not manager found!"); + session.removeAttribute("openid.manager"); // 防止重复登录的可能性 + Map paramsMap = SocialAuthUtil.getRequestParametersMap(request); + Subject currentUser = SecurityUtils.getSubject(); + boolean rname = false; + try { + AuthProvider provider = manager.connect(paramsMap); + Profile p = provider.getUserProfile(); + ThreadContext.bind(currentUser); + OAuthToken token = new OAuthToken(p, Lang.getIP(request), session); + currentUser.login(token); + rname = token.isRname(); + } catch (UnknownAccountException uae) { + return new ViewWrapper(new FreemarkerView(freeMarkerConfigurer, "template/admin/common/error"), Message.error("帐号不存在", request)); + } catch (IncorrectCredentialsException ice) { + return new ViewWrapper(new FreemarkerView(freeMarkerConfigurer, "template/admin/common/error"), Message.error("证书验证失败", request)); + } catch (LockedAccountException lae) { + // "帐号已被锁定" + return new ViewWrapper(new FreemarkerView(freeMarkerConfigurer, "template/admin/common/error"), Message.error("帐号未被授权,请联系管理员", request)); + } catch (ExcessiveAttemptsException eae) { + return new ViewWrapper(new FreemarkerView(freeMarkerConfigurer, "template/admin/common/error"), Message.error("尝试的次数太多", request)); + } catch (AuthenticationException ae) { + return new ViewWrapper(new ForwardView("/admin/index"), ae.getMessage()); + } + if (rname) { + return new ViewWrapper(new ServerRedirectView("/admin/register.rk"), null); + } + return new ViewWrapper(new ServerRedirectView("/admin/main.rk"), null); + } + + private SocialAuthConfig config; + + public void init() throws Exception { + SocialAuthConfig config = new SocialAuthConfig(); + File devConfig = Files.findFile("oauth_consumer.properties_dev"); // 开发期所使用的配置文件 + if (devConfig == null) + devConfig = Files.findFile("oauth_consumer.properties"); // 真实环境所使用的配置文件 + if (devConfig == null) + config.load(new NullInputStream()); + else + config.load(new FileInputStream(devConfig)); + this.config = config; + } + +} diff --git a/src/main/java/com/rekoe/module/ReportAdsModule.java b/src/main/java/com/rekoe/module/ReportAdsModule.java new file mode 100644 index 0000000..39f14c8 --- /dev/null +++ b/src/main/java/com/rekoe/module/ReportAdsModule.java @@ -0,0 +1,49 @@ +package com.rekoe.module; + +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.By; +import org.nutz.mvc.annotation.Filters; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.POST; +import org.nutz.mvc.annotation.Param; + +import com.rekoe.domain.ReportAds; +import com.rekoe.filter.OauthCrossOriginFilter; +import com.rekoe.service.ReportAdsService; + +@At("/report") +@IocBean +@Filters(@By(type = OauthCrossOriginFilter.class)) +public class ReportAdsModule { + + @Inject + private ReportAdsService reportAdsService; + + /** + * @api {POST} /report/ads 数据汇报 + * @apiSampleRequest http://warlogin.shanggame.com/report/ads + * @apiGroup report + * @apiVersion 1.0.0 + * + * + * @apiParam {Number} pid 申请的游戏编号 + * @apiParam {String} pfid 接入的平台编号 + * @apiParam {String} idfa idfa + * @apiParam {String} idfv idfv + * @apiParam {String} talkingDataId talkingDataId + * + * @apiSuccess {json} msg OK + * + */ + + @At + @Ok("raw:json") + @POST + public String ads(@Param("pid") int pid, @Param("pfid") String pfid, @Param("idfa") String idfa, + @Param("idfv") String idfv, @Param("talkingDataId") String talkingDataId) { + reportAdsService.add(new ReportAds(pid, pfid, idfa, idfv, talkingDataId)); + return "{\"msg\":\"ok\"}"; + } +} diff --git a/src/main/java/com/rekoe/module/Status.java b/src/main/java/com/rekoe/module/Status.java new file mode 100644 index 0000000..546a730 --- /dev/null +++ b/src/main/java/com/rekoe/module/Status.java @@ -0,0 +1,28 @@ +package com.rekoe.module; + +import java.io.Serializable; + +public class Status implements Serializable { + + private static final long serialVersionUID = -7767253096192148313L; + private int code; + + private String msg; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + +} diff --git a/src/main/java/com/rekoe/module/Test.java b/src/main/java/com/rekoe/module/Test.java new file mode 100644 index 0000000..feaf302 --- /dev/null +++ b/src/main/java/com/rekoe/module/Test.java @@ -0,0 +1,67 @@ +package com.rekoe.module; + +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; + +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Streams; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.By; +import org.nutz.mvc.annotation.Filters; +import org.nutz.mvc.annotation.Ok; + +import com.rekoe.filter.OauthCrossOriginFilter; + +@IocBean +@At("/api/v2") +@Filters(@By(type = OauthCrossOriginFilter.class)) +public class Test { + + /** + * @api {POST} /api/v2/hello/:id + * @apiGroup Account + * @apiVersion 1.0.3 + * @apiDescription just a test + * @apiPermission anyone + * @apiSampleRequest http://106.2.185.120:8080/api/v2/hello/:id + * + * @apiParam {String} name object + * @apiParam {Number} age object + * @apiSuccess {json} result User object + * + * @apiSuccessExample {json} Success-Response: + * { "firstname": "test", lastname": "sails", "country":"cn" } + * + * @apiParamExample {json} Request + * { "firstname": "test", "lastname": "sails", "country":"cn" } + * + */ + + /** + * @api {POST} /api/v2/hello/:id + * @apiGroup Account + * @apiVersion 1.0.4 + * @apiDescription just a test + * @apiPermission anyone + * @apiSampleRequest http://106.2.185.120:8080/api/v2/hello/:id + * + * @apiParam {String} name object + * @apiParam {Number} age object + * @apiSuccess {json} result User object + * + * @apiSuccessExample {json} Success-Response: + * { "firstname": "test", lastname": "sails", "country":"cn" } + * + * @apiParamExample {json} Request + * { "firstname": "test", "lastname": "sails", "country":"cn" } + * + */ + @At("/hello/?") + @Ok("raw:json") + public String hello(long id,InputStream is) throws IOException { + System.out.println(id); + Reader reader = Streams.utf8r(is); + return Streams.readAndClose(reader); + } +} diff --git a/src/main/java/com/rekoe/module/UserInfoAction.java b/src/main/java/com/rekoe/module/UserInfoAction.java new file mode 100644 index 0000000..921a268 --- /dev/null +++ b/src/main/java/com/rekoe/module/UserInfoAction.java @@ -0,0 +1,124 @@ +package com.rekoe.module; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.oltu.oauth2.common.OAuth; +import org.apache.oltu.oauth2.common.error.OAuthError; +import org.apache.oltu.oauth2.common.exception.OAuthProblemException; +import org.apache.oltu.oauth2.common.exception.OAuthSystemException; +import org.apache.oltu.oauth2.common.message.OAuthResponse; +import org.apache.oltu.oauth2.common.message.types.ParameterStyle; +import org.apache.oltu.oauth2.common.utils.OAuthUtils; +import org.apache.oltu.oauth2.rs.request.OAuthAccessResourceRequest; +import org.apache.oltu.oauth2.rs.response.OAuthRSResponse; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.By; +import org.nutz.mvc.annotation.Filters; +import org.nutz.mvc.annotation.GET; +import org.nutz.mvc.annotation.Ok; + +import com.rekoe.domain.OAuthUser; +import com.rekoe.filter.OauthCrossOriginFilter; +import com.rekoe.service.OAuthService; +import com.rekoe.service.OAuthUserService; +import com.rekoe.utils.Constants; + +@IocBean +@At("/v1/openapi") +public class UserInfoAction { + + @Inject + private OAuthService oAuthService; + + @Inject + private OAuthUserService oAuthUserService; + + /** + * @api {get} /v1/openapi/userinfo 获取账号详细 + *@apiSampleRequest http://warlogin.shanggame.com/v1/openapi/userinfo + * @apiGroup User + * @apiVersion 1.0.0 + * + * + * @apiParam {String} access_token 为上一步获取的access_token + * + * @apiSuccess {long} uid 用户id + * @apiSuccess {String} name 用户名 + * @apiSuccess {boolean} [locked] 是否锁定 + * + */ + + @At + @Ok("json") + @GET + @Filters(@By(type = OauthCrossOriginFilter.class)) + public Object userinfo(HttpServletRequest request, HttpServletResponse res) throws OAuthSystemException, OAuthProblemException { + return checkAccessToken(request, res); + } + + /** + * 不校验accessToken + * + * @param request + * @return + * @throws OAuthSystemException + * @throws OAuthProblemException + */ + public OAuthUser nocheckAccessToken(HttpServletRequest request) throws OAuthSystemException, OAuthProblemException { + // 构建OAuth资源请求 + OAuthAccessResourceRequest oauthRequest = new OAuthAccessResourceRequest(request, ParameterStyle.QUERY); + // 获取Access Token + String accessToken = oauthRequest.getAccessToken(); + // 获取用户名 + String username = oAuthService.getUsernameByAccessToken(accessToken); + OAuthUser user = oAuthUserService.findByUsername(username); + return user; + } + + /** + * 校验accessToken + * + * @param request + * @return + * @throws OAuthSystemException + */ + private Object checkAccessToken(HttpServletRequest request, HttpServletResponse res) throws OAuthSystemException { + try { + // 构建OAuth资源请求 + OAuthAccessResourceRequest oauthRequest = new OAuthAccessResourceRequest(request, ParameterStyle.QUERY); + // 获取Access Token + String accessToken = oauthRequest.getAccessToken(); + // 验证Access Token + if (!oAuthService.checkAccessToken(accessToken)) { + // 如果不存在/过期了,返回未验证错误,需重新验证 + OAuthResponse oauthResponse = OAuthRSResponse.errorResponse(HttpServletResponse.SC_UNAUTHORIZED).setRealm(Constants.RESOURCE_SERVER_NAME).setError(OAuthError.ResourceResponse.INVALID_TOKEN).buildHeaderMessage(); + res.addHeader("Content-Type", "application/json; charset=utf-8"); + Status status = new Status(); + status.setCode(Constants.HTTPSTATUS_UNAUTHORIZED); + status.setMsg(Constants.INVALID_ACCESS_TOKEN); + res.setStatus(oauthResponse.getResponseStatus()); + return status; + } + // 获取用户名 + String username = oAuthService.getUsernameByAccessToken(accessToken); + OAuthUser user = oAuthUserService.findByUsername(username); + return user; + } catch (OAuthProblemException e) { + // 检查是否设置了错误码 + String errorCode = e.getError(); + if (OAuthUtils.isEmpty(errorCode)) { + OAuthResponse oauthResponse = OAuthRSResponse.errorResponse(HttpServletResponse.SC_UNAUTHORIZED).setRealm(Constants.RESOURCE_SERVER_NAME).buildHeaderMessage(); + res.addHeader(OAuth.HeaderType.WWW_AUTHENTICATE, oauthResponse.getHeader(OAuth.HeaderType.WWW_AUTHENTICATE)); + res.setStatus(Constants.HTTPSTATUS_UNAUTHORIZED); + return null; + } + OAuthResponse oauthResponse = OAuthRSResponse.errorResponse(HttpServletResponse.SC_UNAUTHORIZED).setRealm(Constants.RESOURCE_SERVER_NAME).setError(e.getError()).setErrorDescription(e.getDescription()).setErrorUri(e.getUri()).buildHeaderMessage(); + res.addHeader(OAuth.HeaderType.WWW_AUTHENTICATE, oauthResponse.getHeader(OAuth.HeaderType.WWW_AUTHENTICATE)); + res.setStatus(Constants.HTTPSTATUS_BAD_REQUEST); + return null; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/module/admin/AdminAccountAct.java b/src/main/java/com/rekoe/module/admin/AdminAccountAct.java new file mode 100644 index 0000000..814da62 --- /dev/null +++ b/src/main/java/com/rekoe/module/admin/AdminAccountAct.java @@ -0,0 +1,48 @@ +package com.rekoe.module.admin; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.lang3.math.NumberUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +import com.rekoe.annotation.PermissionTag; +import com.rekoe.common.Message; +import com.rekoe.common.page.Pagination; +import com.rekoe.service.PlatformUserService; + +@IocBean +@At("/admin/app/account") +public class AdminAccountAct { + + @Inject + private PlatformUserService platformUserService; + + @At + @Ok("fm:template.admin.app.account.list") + @RequiresPermissions({ "app.account:view" }) + @PermissionTag(name = "账号浏览", tag = "平台用户", enable = true) + public Pagination list(@Param(value = "pageNumber", df = "1") Integer pageNumber, @Param("keyword") String keyword, @Param("type") int type, HttpServletRequest req) { + req.setAttribute("keyword", keyword); + req.setAttribute("type", type); + switch (type) { + case 1: + return platformUserService.getPlatformUserListPagerByPid(pageNumber, 20, keyword); + default: + return platformUserService.getPlatformUserListPagerByOpenid(pageNumber, 20, NumberUtils.toLong(keyword)); + } + } + + @At + @Ok("json") + @RequiresPermissions({ "app.account:lock" }) + @PermissionTag(name = "账号锁定", tag = "平台用户", enable = true) + public Message lock(@Param("id") String id, @Param("lock") boolean lock, HttpServletRequest req) { + platformUserService.lock(id, lock); + return Message.success("admin.message.success", req); + } +} diff --git a/src/main/java/com/rekoe/module/admin/AdminCdKeyCategoryAct.java b/src/main/java/com/rekoe/module/admin/AdminCdKeyCategoryAct.java new file mode 100644 index 0000000..89b6971 --- /dev/null +++ b/src/main/java/com/rekoe/module/admin/AdminCdKeyCategoryAct.java @@ -0,0 +1,107 @@ +package com.rekoe.module.admin; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.nutz.dao.entity.Record; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +import com.rekoe.annotation.PermissionTag; +import com.rekoe.common.Message; +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.CdkeyCategory; +import com.rekoe.module.BaseAction; +import com.rekoe.service.CdKeyCategoryService; +import com.rekoe.service.CdKeyService; + +@IocBean +@At("/admin/cdkey/") +public class AdminCdKeyCategoryAct extends BaseAction { + + @Inject + private CdKeyCategoryService cdKeyCategoryService; + @Inject + private CdKeyService cdKeyService; + + @At("/category/list") + @Ok("fm:template.admin.cdkey.category_list") + @RequiresPermissions("system.cdkey:category.view") + @PermissionTag(name = "分类浏览", tag = "CDK分类", enable = true) + public Pagination category_list(@Param(value = "pageNumber", df = "1") int pageNumber) { + return cdKeyCategoryService.getCategoryListByPager(pageNumber); + } + + @At("/category/add") + @Ok("fm:template.admin.cdkey.category_add") + @RequiresPermissions("system.cdkey:category.add") + @PermissionTag(name = "添加分类", tag = "CDK分类", enable = true) + public void category_add() { + } + + @At("/category/save") + @Ok("json") + @RequiresPermissions("system.cdkey:category.add") + @PermissionTag(name = "添加分类", tag = "CDK分类", enable = false) + public Message category_save(@Param("name") String name, @Param("type") int type, HttpServletRequest req) { + if (cdKeyCategoryService.isNotExists(type)) { + cdKeyCategoryService.insert(new CdkeyCategory(name, type)); + return Message.success("ok", req); + } + return Message.error("error.type.exists", req); + } + + @At("/category/edit") + @Ok("fm:template.admin.cdkey.category_edit") + @RequiresPermissions("system.cdkey:category.edit") + @PermissionTag(name = "编辑分类", tag = "CDK分类", enable = true) + public CdkeyCategory category_edit(@Param("id") String id) { + return cdKeyCategoryService.fetchByID(id); + } + + @At("/category/update") + @Ok("json") + @RequiresPermissions("system.cdkey:category.edit") + @PermissionTag(name = "编辑分类", tag = "CDK分类", enable = false) + public Message category_update(@Param("::cc.") CdkeyCategory cc, HttpServletRequest req) { + cdKeyCategoryService.update(cc); + return Message.success("ok", req); + } + + @At + @Ok("fm:template.admin.cdkey.add") + @RequiresPermissions("system.cdkey:add") + @PermissionTag(name = "添加CDK", tag = "CDK", enable = true) + public String add(@Param("type") String type, HttpServletRequest req) { + req.setAttribute("rule", type.length()); + return type; + } + + @At + @Ok("json") + @RequiresPermissions("system.cdkey:add") + @PermissionTag(name = "添加CDK", tag = "CDK", enable = false) + public Message save(@Param("type") String taskid, @Param("num") int num, @Param("len") int len, HttpServletRequest req) { + if ((taskid).length() > len) { + return Message.error("长度不能小于" + taskid.length(), req); + } + cdKeyService.addCdkey(taskid, num, len); + return Message.success("ok", req); + } + + @At + @Ok("down") + @RequiresPermissions("system.cdkey:down") + @PermissionTag(name = "下载CDK", tag = "CDK", enable = true) + public ByteArrayOutputStream down(@Param("type") int type) throws IOException { + List records = cdKeyService.searchDown(type, false); + return loadDown(records); + } +} diff --git a/src/main/java/com/rekoe/module/admin/AdminCommonAct.java b/src/main/java/com/rekoe/module/admin/AdminCommonAct.java new file mode 100644 index 0000000..c026e07 --- /dev/null +++ b/src/main/java/com/rekoe/module/admin/AdminCommonAct.java @@ -0,0 +1,40 @@ +package com.rekoe.module.admin; + +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.Mvcs; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Filters; +import org.nutz.mvc.annotation.Ok; + +import com.rekoe.common.Message; + +@IocBean +@At("/admin/common") +@Filters +public class AdminCommonAct { + + protected static final String ERROR = "/admin/common/error"; + protected static final Message MESSAGE_ERROR = Message.error("admin.message.error", Mvcs.getReq()); + protected static final Message MESSAGE_ERROR_FORBIT = Message.error("admin.error.message.forbit", Mvcs.getReq()); + protected static final Message MESSAGE_SUCCESS = Message.success("admin.message.success", Mvcs.getReq()); + + // admin/common/unauthorized.jhtml + + @At + @Ok("fm:template.admin.common.error") + public Message unauthorized() { + return MESSAGE_ERROR; + } + + @At + @Ok("fm:template.admin.common.error") + public Message forbit() { + return MESSAGE_ERROR_FORBIT; + } + + @At + @Ok("fm:template.admin.common.error") + public Message success() { + return MESSAGE_SUCCESS; + } +} diff --git a/src/main/java/com/rekoe/module/admin/AdminGameServerAct.java b/src/main/java/com/rekoe/module/admin/AdminGameServerAct.java new file mode 100644 index 0000000..30fed95 --- /dev/null +++ b/src/main/java/com/rekoe/module/admin/AdminGameServerAct.java @@ -0,0 +1,165 @@ +package com.rekoe.module.admin; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.apache.shiro.authz.annotation.RequiresUser; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Attr; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; +import org.nutz.web.Webs; + +import com.rekoe.annotation.PermissionTag; +import com.rekoe.common.Message; +import com.rekoe.common.PlatformVO; +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.AuthType; +import com.rekoe.domain.GameServer; +import com.rekoe.domain.User; +import com.rekoe.service.GameServerService; +import com.rekoe.service.UserService; + +@IocBean(create = "init") +@At("/admin/server") +public class AdminGameServerAct { + + @Inject + private GameServerService gameServerService; + + @Inject + private UserService userService; + + private List authTypeList = new ArrayList<>(); + + public void init() { + authTypeList.add(new PlatformVO(AuthType.TOKEN.getDisplay(), AuthType.TOKEN.getDisplay())); + authTypeList.add(new PlatformVO(AuthType.DEFAULT.getDisplay(), AuthType.DEFAULT.getDisplay())); + authTypeList.add(new PlatformVO(AuthType.QQ_HTML5.getDisplay(), AuthType.QQ_HTML5.getDisplay())); + } + + @At + @Ok("fm:template.admin.server.list") + @RequiresPermissions("server:view") + @PermissionTag(name = "应用浏览", tag = "游戏应用", enable = true) + public Pagination list(@Param(value = "pageNumber", df = "1") int pageNumber) { + return gameServerService.getObjectListByPager(pageNumber, 20); + } + + @At("/change/?") + @Ok("json") + @RequiresUser + public Message select(@Param("id") int id, @Attr(Webs.ME) User user, HttpServletRequest req, HttpSession session) { + GameServer server = user.getServers().get(id); + if (!Lang.isEmpty(server)) { + session.setAttribute("sid", id); + return Message.success("button.submit.success", req); + } + return Message.error("admin.message.error", req); + } + + @At + @Ok("fm:template.admin.server.add") + @RequiresPermissions("server:add") + @PermissionTag(name = "添加应用", tag = "游戏应用", enable = true) + public List add() { + return authTypeList; + } + + @At + @Ok("json") + @RequiresPermissions("server:add") + @PermissionTag(name = "添加应用", tag = "游戏应用", enable = false) + public Message o_save(@Param("::p.") GameServer server, HttpServletRequest req, @Param("..") NutMap map) { + if (gameServerService.canAdd(server.getPid())) { + gameServerService.insert(server); + return Message.success("button.submit.success", req); + } + Iterator> iterator = map.entrySet().iterator(); + while (iterator.hasNext()) { + Entry entry = iterator.next(); + String key = entry.getKey(); + if (key.startsWith("p.")) { + iterator.remove(); + } + } + server.setMobileAuth(map); + return Message.error("admin.message.error", req); + } + + @At + @Ok("fm:template.admin.server.edit") + @RequiresPermissions("server:edit") + @PermissionTag(name = "编辑应用", tag = "游戏应用", enable = true) + public GameServer edit(@Param("id") int id, HttpServletRequest request) throws Throwable { + GameServer server = gameServerService.getServer(id); + if (Lang.isEmpty(server)) { + throw new Throwable(); + } + request.setAttribute("authTypes", authTypeList); + return server; + } + + @At + @Ok(">>:/admin/game_server/list") + @RequiresPermissions("server:edit") + @PermissionTag(name = "编辑应用", tag = "游戏应用", enable = false) + public void update(@Param("::server.") GameServer server, @Param("..") NutMap map) { + gameServerService.update(server); + } + + @At + @Ok("fm:template.admin.server.servers_edit") + @RequiresUser + public void v_servers_edit(@Param("id") long id, HttpServletRequest request) { + User user = userService.view(id); + List list = gameServerService.getAllIds(); + List servers = new ArrayList(); + for (Integer iid : list) { + GameServer server = gameServerService.getServer(iid.intValue()); + if (!Lang.isEmpty(server)) { + servers.add(server); + } + } + List userServeridList = new ArrayList(); + Map serverMap = user.getServers(); + if (!Lang.isEmpty(serverMap)) { + Iterator userlist = serverMap.keySet().iterator(); + while (userlist.hasNext()) { + int serverid = userlist.next(); + userServeridList.add(serverid); + } + } + request.setAttribute("serverList", servers); + request.setAttribute("serverIds", userServeridList); + } + + @At + @Ok("json") + @RequiresPermissions("server:add") + @PermissionTag(name = "添加应用", tag = "游戏应用", enable = false) + public Message o_update(@Param("::p.") GameServer server, HttpServletRequest req, @Param("..") NutMap map) { + Iterator> iterator = map.entrySet().iterator(); + while (iterator.hasNext()) { + Entry entry = iterator.next(); + String key = entry.getKey(); + if (key.startsWith("p.")) { + iterator.remove(); + } + } + server.setMobileAuth(map); + gameServerService.update(server); + return Message.success("button.submit.success", req); + } +} diff --git a/src/main/java/com/rekoe/module/admin/AdminLoginAct.java b/src/main/java/com/rekoe/module/admin/AdminLoginAct.java new file mode 100644 index 0000000..68710af --- /dev/null +++ b/src/main/java/com/rekoe/module/admin/AdminLoginAct.java @@ -0,0 +1,82 @@ +package com.rekoe.module.admin; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.LockedAccountException; +import org.apache.shiro.authz.annotation.RequiresAuthentication; +import org.apache.shiro.subject.Subject; +import org.apache.shiro.util.ThreadContext; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.mvc.Mvcs; +import org.nutz.mvc.View; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Attr; +import org.nutz.mvc.annotation.By; +import org.nutz.mvc.annotation.Filters; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.view.ForwardView; +import org.nutz.mvc.view.ServerRedirectView; +import org.nutz.mvc.view.ViewWrapper; +import org.nutz.plugins.view.freemarker.FreeMarkerConfigurer; +import org.nutz.plugins.view.freemarker.FreemarkerView; +import org.nutz.web.Webs; + +import com.rekoe.domain.User; +import com.rekoe.exception.IncorrectCaptchaException; +import com.rekoe.filter.AuthenticationFilter; + +/** + * @author 科技㊣²º¹³
+ * 2014年2月3日 下午4:48:45
+ * http://www.rekoe.com QQ:5382211 + */ +@IocBean +@At("/admin") +public class AdminLoginAct { + + private static final String TEMPLATE_LOGIN = "template/login/login"; + @Inject + private FreeMarkerConfigurer freeMarkerConfigurer; + + @At + @Filters(@By(type = AuthenticationFilter.class)) + public View login(@Attr("loginToken") AuthenticationToken token, HttpSession session, HttpServletRequest req) { + try { + Subject subject = SecurityUtils.getSubject(); + ThreadContext.bind(subject); + subject.login(token); + session.setAttribute(Webs.ME, subject.getPrincipal()); + return new ServerRedirectView("/admin/main.rk"); + } catch (IncorrectCaptchaException e) { + return new ViewWrapper(new FreemarkerView(freeMarkerConfigurer, TEMPLATE_LOGIN), e.getMessage()); + } catch (LockedAccountException e) { + return new ViewWrapper(new FreemarkerView(freeMarkerConfigurer, TEMPLATE_LOGIN), e.getMessage()); + } catch (AuthenticationException e) { + return new ViewWrapper(new FreemarkerView(freeMarkerConfigurer, TEMPLATE_LOGIN), Mvcs.getMessage(req, "common.error.login.account")); + } catch (Exception e) { + return new ViewWrapper(new FreemarkerView(freeMarkerConfigurer, TEMPLATE_LOGIN), e.getMessage()); + } + } + + @At + @Ok(">>:/user/login.rk") + @RequiresAuthentication + public void logout() { + } + + @At + @Ok("fm:template.front.account.create_user") + @RequiresAuthentication + public Object register(@Attr(Webs.ME) User user) { + if (Lang.isEmpty(user) || user.isSystem()) { + return new ForwardView("/admin/common/unauthorized.rk"); + } + return null; + } +} diff --git a/src/main/java/com/rekoe/module/admin/AdminNoticeAct.java b/src/main/java/com/rekoe/module/admin/AdminNoticeAct.java new file mode 100644 index 0000000..d49398a --- /dev/null +++ b/src/main/java/com/rekoe/module/admin/AdminNoticeAct.java @@ -0,0 +1,149 @@ +package com.rekoe.module.admin; + +import java.io.File; +import java.io.IOException; +import java.util.Date; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.apache.shiro.authz.annotation.RequiresUser; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Files; +import org.nutz.lang.Times; +import org.nutz.lang.random.R; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.annotation.AdaptBy; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Fail; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.POST; +import org.nutz.mvc.annotation.Param; +import org.nutz.mvc.upload.TempFile; +import org.nutz.mvc.upload.UploadAdaptor; +import org.nutz.mvc.view.HttpStatusView; + +import com.rekoe.annotation.PermissionTag; +import com.rekoe.common.Message; +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.GameServer; +import com.rekoe.domain.Notice; +import com.rekoe.service.GameServerService; +import com.rekoe.service.NoticeService; + +/** + * @author 科技㊣²º¹³
+ * 2014年2月3日 下午4:48:45
+ * http://www.rekoe.com
+ * QQ:5382211
+ * 公告系统 + */ +@IocBean +@At("/admin/notice") +public class AdminNoticeAct { + + @Inject + private NoticeService noticeService; + + @Inject + private GameServerService gameServerService; + + @At + @Ok("fm:template.admin.notice.list") + @RequiresPermissions("system.notice") + @PermissionTag(name = "浏览公告", tag = "游戏公告", enable = false) + public Pagination list(@Param(value = "pageNumber", df = "1") int pageNumber) { + return noticeService.getObjListByPager(pageNumber, 20, null); + } + + @At + @Ok("fm:template.admin.notice.add") + @RequiresPermissions("system.notice:add") + @PermissionTag(name = "添加公告", tag = "游戏公告", enable = true) + public List add() { + return gameServerService.list(); + } + + @At + @Ok("json") + @RequiresPermissions("system.notice:add") + @PermissionTag(name = "添加公告", tag = "游戏公告", enable = false) + public Message save(@Param("::notice.") Notice notice, HttpServletRequest req) { + Date now = Times.now(); + notice.setCreateDate(now); + notice.setModifyDate(now); + noticeService.insert(notice); + return Message.success("button.submit.success", req); + } + + @At + @Ok("fm:template.admin.notice.edit") + @RequiresPermissions("system.notice:edit") + @PermissionTag(name = "编辑公告", tag = "游戏公告", enable = true) + public List edit(long id, HttpServletRequest req) { + Notice art = noticeService.fetch(id); + req.setAttribute("notice", art); + return gameServerService.list(); + } + + @At + @Ok("json") + @RequiresPermissions("system.notice:edit") + @PermissionTag(name = "编辑公告", tag = "游戏公告", enable = false) + public Message update(@Param("::notice.") Notice notice, HttpServletRequest req) { + notice.setModifyDate(Times.now()); + noticeService.update(notice); + return Message.success("button.submit.success", req); + } + + @At + @Ok("json") + @RequiresPermissions("system.notice:delete") + @PermissionTag(name = "删除公告", tag = "游戏公告", enable = true) + public Message delete(@Param("id") long id, HttpServletRequest req) { + noticeService.delete(id); + return Message.success("button.submit.success", req); + } + + @Inject("java:$conf.get('topic.image.dir')") + protected String imageDir; + private final static String NEWS_FILE_PATH = "/upload/notice/"; + + @SuppressWarnings("deprecation") + @AdaptBy(type = UploadAdaptor.class, args = { "${app.root}/WEB-INF/tmp2" }) + @POST + @At + @Ok("json") + @RequiresUser + public Object upload(@Param("file") TempFile tmp, HttpServletRequest req, HttpServletResponse resp) throws IOException { + resp.setContentType("application/json"); + NutMap jsonrpc = new NutMap(); + if (tmp == null || tmp.getSize() == 0) { + return jsonrpc.setv("msg", "空文件"); + } + if (tmp.getSize() > 2 * 1024 * 1024) { + return jsonrpc.setv("msg", "文件太大了"); + } + String id = R.UU32(); + String path = "/" + id.substring(0, 2) + "/" + id.substring(2); + File f = new File(imageDir + NEWS_FILE_PATH + path); + Files.createNewFile(f); + Files.copyFile(tmp.getFile(), f); + jsonrpc.setv("url", req.getRequestURI() + path); + jsonrpc.setv("success", true); + return jsonrpc; + } + + @Ok("raw:jpg") + @At("/upload/?/?") + @Fail("http:404") + public Object image(String p, String p2) throws IOException { + if ((p + p2).contains(".")) + return HttpStatusView.HTTP_404; + File f = new File(imageDir + NEWS_FILE_PATH, p + "/" + p2); + return f; + } +} diff --git a/src/main/java/com/rekoe/module/admin/AdminOauthClientAct.java b/src/main/java/com/rekoe/module/admin/AdminOauthClientAct.java new file mode 100644 index 0000000..cf05f5f --- /dev/null +++ b/src/main/java/com/rekoe/module/admin/AdminOauthClientAct.java @@ -0,0 +1,87 @@ +package com.rekoe.module.admin; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.POST; +import org.nutz.mvc.annotation.Param; + +import com.rekoe.annotation.PermissionTag; +import com.rekoe.common.Message; +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.OAuthClient; +import com.rekoe.service.OAuthClientService; + +@IocBean +@At("/admin/oauth/client") +public class AdminOauthClientAct { + + @Inject + private OAuthClientService oAuthClientService; + + @At + @Ok("fm:template.admin.oauth_client.list") + @RequiresPermissions({ "oauth.client:view" }) + @PermissionTag(name = "浏览", tag = "OauthClient", enable = true) + public Pagination list(@Param(value = "pageNumber", df = "1") int page) { + return oAuthClientService.getListPager(page); + } + + @At + @Ok("fm:template.admin.oauth_client.add") + @PermissionTag(name = "添加", tag = "OauthClient", enable = true) + @RequiresPermissions({ "oauth.client:add" }) + public void add() { + } + + @At + @POST + @Ok("json") + @RequiresPermissions({ "oauth.client:add" }) + @PermissionTag(name = "浏览", tag = "OauthClient", enable = false) + public Message o_save(@Param("::client.") OAuthClient client, HttpServletRequest req) { + if (StringUtils.isBlank(client.getClientName())) { + return Message.error("error.code.name.empty", req); + } + if (oAuthClientService.check(client.getClientName())) { + oAuthClientService.createClient(client); + return Message.success("ok", req); + } + /** 被占用 **/ + return Message.error("error.code.name.occupied", req); + } + + @At + @Ok("fm:template.admin.oauth_client.edit") + @RequiresPermissions({ "oauth.client:edit" }) + @PermissionTag(name = "编辑", tag = "OauthClient", enable = true) + public OAuthClient edit(@Param("id") long id) { + return oAuthClientService.findOne(id); + } + + @At + @Ok("json") + @POST + @RequiresPermissions({ "oauth.client:edit" }) + @PermissionTag(name = "编辑", tag = "OauthClient", enable = false) + public Message o_update(@Param("::client.") OAuthClient client, HttpServletRequest req) { + oAuthClientService.updateClient(client); + return Message.success("OK", req); + } + + @At + @POST + @Ok("json") + @RequiresPermissions({ "oauth.client:delete" }) + @PermissionTag(name = "删除", tag = "OauthClient", enable = true) + public Message delete(long id, HttpServletRequest req) { + oAuthClientService.deleteClient(id); + return Message.success("ok", req); + } + +} diff --git a/src/main/java/com/rekoe/module/admin/AdminOauthUserAct.java b/src/main/java/com/rekoe/module/admin/AdminOauthUserAct.java new file mode 100644 index 0000000..7f4e042 --- /dev/null +++ b/src/main/java/com/rekoe/module/admin/AdminOauthUserAct.java @@ -0,0 +1,52 @@ +package com.rekoe.module.admin; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.POST; +import org.nutz.mvc.annotation.Param; + +import com.rekoe.annotation.PermissionTag; +import com.rekoe.common.Message; +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.OAuthUser; +import com.rekoe.service.OAuthUserService; + +@IocBean +@At("/admin/oauth/user") +public class AdminOauthUserAct { + + @Inject + private OAuthUserService oAuthUserService; + + @At + @Ok("fm:template.admin.oauth_user.list") + @RequiresPermissions({ "oauth.user:view" }) + @PermissionTag(name = "浏览", tag = "OauthUser", enable = true) + public Pagination list(@Param(value = "pageNumber", df = "1") int page) { + return oAuthUserService.getListPager(page); + } + + @At + @Ok("fm:template.admin.oauth_user.edit") + @RequiresPermissions({ "oauth.user:edit" }) + @PermissionTag(name = "浏览", tag = "OauthUser", enable = true) + public OAuthUser edit(@Param("id") long id) { + return oAuthUserService.findOne(id); + } + + @At + @Ok("json") + @POST + @RequiresPermissions({ "oauth.user:edit" }) + @PermissionTag(name = "浏览", tag = "OauthUser", enable = false) + public Message o_update(@Param("::user.") OAuthUser user, HttpServletRequest req) { + //oAuthUserService.updateUser(user); + return Message.success("OK", req); + } + +} diff --git a/src/main/java/com/rekoe/module/admin/AdminOfficialAct.java b/src/main/java/com/rekoe/module/admin/AdminOfficialAct.java new file mode 100644 index 0000000..a407eff --- /dev/null +++ b/src/main/java/com/rekoe/module/admin/AdminOfficialAct.java @@ -0,0 +1,128 @@ +package com.rekoe.module.admin; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.shiro.authz.annotation.RequiresUser; +import org.nutz.dao.Cnd; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.mvc.Scope; +import org.nutz.mvc.View; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Attr; +import org.nutz.mvc.annotation.By; +import org.nutz.mvc.annotation.Filters; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; +import org.nutz.mvc.view.ViewWrapper; +import org.nutz.plugins.view.freemarker.FreeMarkerConfigurer; +import org.nutz.plugins.view.freemarker.FreemarkerView; +import org.nutz.web.Webs; + +import com.rekoe.common.Message; +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.GameServer; +import com.rekoe.domain.OfficialServer; +import com.rekoe.domain.User; +import com.rekoe.domain.VerifyServer; +import com.rekoe.filter.ChectServerExitsActionFilter; +import com.rekoe.filter.SelectServerActionFilter; +import com.rekoe.service.GameServerService; +import com.rekoe.service.OfficialServerService; +import com.rekoe.service.VerifyServerService; + +@IocBean +@At("/admin/official_server") +public class AdminOfficialAct { + + @Inject + private VerifyServerService verifyServerService; + + @Inject + private OfficialServerService officialServerService; + + @Inject + private FreeMarkerConfigurer freeMarkerConfigurer; + + @Inject + private GameServerService gameServerService; + + @At + @Filters(@By(type = SelectServerActionFilter.class, args = { "ioc:selectServerActionFilter" })) + public View view(@Attr(scope = Scope.SESSION, value = Webs.ME) User user, @Param("pid") int pid) { + VerifyServer verifyServer = verifyServerService.fetch(Cnd.where("pid", "=", pid)); + GameServer server = gameServerService.fetch(Cnd.where("pid", "=", pid)); + if (Lang.isEmpty(server)) { + throw Lang.makeThrow("Not Fond PID[%s] Server", pid); + } + GameServer userServer = user.getServers().get(server.getId()); + if (Lang.isEmpty(userServer)) { + throw Lang.makeThrow("You Not Have This Server[%s] Permission ", server.getPlatformName()); + } + if (Lang.isEmpty(verifyServer)) { + return new ViewWrapper(new FreemarkerView(freeMarkerConfigurer, "template/admin/game_server/server/verify/add"), server); + } + verifyServer.setGameServer(server); + return new ViewWrapper(new FreemarkerView(freeMarkerConfigurer, "template/admin/game_server/server/verify/edit"), verifyServer); + } + + @At + @Ok("json") + //@Filters(@By(type = SelectServerActionFilter.class, args = { "ioc:selectServerActionFilter" })) + @RequiresUser + public Message o_save(@Attr(scope = Scope.SESSION, value = "sid") int sid, @Param("::p.") OfficialServer vserver, HttpServletRequest req) { + GameServer gameServer = gameServerService.fetch(sid); + OfficialServer verifyServer = officialServerService.fetch(Cnd.where("pid", "=", gameServer.getPid()).and("sid", "=", vserver.getSid())); + if (!Lang.isEmpty(verifyServer)) { + throw Lang.makeThrow("Not Fond PID[%s] Server", vserver.getPid()); + } + vserver.setPid(gameServer.getPid()); + boolean isRight = officialServerService.insert(vserver); + if (isRight) { + return Message.success("button.submit.success", req); + } + return Message.error("admin.message.error", req); + } + + @At + @Ok("json") + @Filters(@By(type = SelectServerActionFilter.class, args = { "ioc:selectServerActionFilter" })) + public Message o_update(@Param("::p.") OfficialServer vserver, HttpServletRequest req) { + OfficialServer verifyServer = officialServerService.fetch(Cnd.where("pid", "=", vserver.getPid())); + if (Lang.isEmpty(verifyServer)) { + throw Lang.makeThrow("Not Fond PID[%s] Server", vserver.getPid()); + } + officialServerService.update(vserver); + return Message.success("button.submit.success", req); + } + + @At + @Ok("fm:template.admin.server.official.list") + @Filters(@By(type = ChectServerExitsActionFilter.class, args = { "ioc:chectServerExitsActionFilter" })) + public Pagination list(@Attr(scope = Scope.SESSION, value = "sid") int sid, @Param("pageNumber") Integer pageNumber) { + GameServer gameServer = gameServerService.fetch(sid); + return list_view(gameServer.getPid(), pageNumber); + } + + @At + @Ok("fm:template.admin.server.official.list_view") + @Filters(@By(type = ChectServerExitsActionFilter.class, args = { "ioc:chectServerExitsActionFilter" })) + public Pagination list_view(@Param("pid") int pid, @Param(value="pageNumber",df="1") Integer pageNumber) { + return officialServerService.getObjListByPager(pageNumber, Cnd.where("pid", "=", pid).desc("sid")); + } + + @At + @Ok("fm:template.admin.server.official.add") + @RequiresUser + public void add() { + + } + + @At + @Ok("fm:template.admin.server.official.edit") + @RequiresUser + public OfficialServer edit(@Param("id") String id) { + return officialServerService.fetch(Cnd.where("id", "=", id)); + } +} diff --git a/src/main/java/com/rekoe/module/admin/AdminPlatformConfigAction.java b/src/main/java/com/rekoe/module/admin/AdminPlatformConfigAction.java new file mode 100644 index 0000000..12196ca --- /dev/null +++ b/src/main/java/com/rekoe/module/admin/AdminPlatformConfigAction.java @@ -0,0 +1,185 @@ +package com.rekoe.module.admin; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.nutz.dao.Cnd; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.Mvcs; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.By; +import org.nutz.mvc.annotation.Filters; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +import com.rekoe.annotation.PermissionTag; +import com.rekoe.common.AppleVO; +import com.rekoe.common.GooglePVO; +import com.rekoe.common.GoogleVO; +import com.rekoe.common.Message; +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.PlatformConfig; +import com.rekoe.filter.ServerPermisionActionFilter; +import com.rekoe.service.PlatformConfigService; + +@IocBean +@At("/admin/platform_config") +@Filters(@By(type = ServerPermisionActionFilter.class, args = { "ioc:serverPermisionActionFilter" })) +public class AdminPlatformConfigAction { + + @Inject + private PlatformConfigService platformConfigService; + + @At + @Ok("fm:template.admin.server.platform.list") + @RequiresPermissions("admin.platform") + @PermissionTag(name = "浏览列表", tag = "平台接入", enable = false) + public Pagination list(@Param("platformid") int sid, @Param(value = "pageNumber", df = "1") int pageNumber) { + Mvcs.getReq().setAttribute("platformid", sid); + return platformConfigService.getListByPager(pageNumber, sid); + } + + @At + @Ok("fm:template.admin.server.platform.add") + @RequiresPermissions("admin.platform:add") + @PermissionTag(name = "添加平台", tag = "平台接入", enable = true) + public int add(@Param("platformid") int sid) { + return sid; + } + + @At + @Ok("fm:template.admin.server.platform.edit") + @RequiresPermissions("admin.platform:edit") + @PermissionTag(name = "编辑平台", tag = "平台接入") + public PlatformConfig edit(@Param("platformid") int sid, @Param("id") String id) { + return platformConfigService.fetch(Cnd.where("id", "=", id)); + } + + @At + @Ok("fm:template.admin.server.platform.${obj}.add_${obj}") + @RequiresPermissions("admin.platform") + @PermissionTag(name = "浏览列表", tag = "平台接入", enable = false) + public String add_view(@Param("platformid") int sid, @Param(value = "provider", df = "uc") String provider) { + Mvcs.getReq().setAttribute("platformid", sid); + return provider; + } + + @At + @Ok("json") + @RequiresPermissions("admin.platform:add") + @PermissionTag(name = "添加平台", tag = "平台接入", enable = false) + public Message o_save(@Param("platformid") int sid, @Param("..") NutMap map, HttpServletRequest req) { + PlatformConfig platformConfig = platformConfigService.fetch(Cnd.where("sid", "=", sid).and("provider", "=", map.getString("provider"))); + if (Lang.isEmpty(platformConfig)) { + platformConfigService.insert(new PlatformConfig(sid, map)); + } else { + return Message.error("duplate.data", req); + } + return Message.success("ok", req); + } + + @At + @Ok("json") + @RequiresPermissions("admin.platform:edit") + @PermissionTag(name = "编辑平台", tag = "平台接入", enable = false) + public Message o_update(@Param("platformid") int sid, @Param("id") String id, @Param("..") NutMap map, HttpServletRequest req) { + map.remove("platformid"); + map.remove("id"); + PlatformConfig platformConfig = platformConfigService.fetch(Cnd.where("id", "=", id)); + platformConfig.setConfig(map); + platformConfigService.update(platformConfig); + return Message.success("ok", req); + } + + @At("/googleP/o_update") + @Ok("json") + @RequiresPermissions("admin.platform:edit") + @PermissionTag(name = "编辑平台", tag = "平台接入", enable = false) + public Message google_play_update(@Param("platformid") int sid, @Param("id") String id, @Param("::p.") GooglePVO googlePVO, HttpServletRequest req) { + PlatformConfig platformConfig = platformConfigService.fetch(Cnd.where("id", "=", id)); + platformConfig.setConfig(Lang.obj2nutmap(googlePVO)); + platformConfigService.update(platformConfig); + return Message.success("ok", req); + } + + @At("/googleP/o_save") + @Ok("json") + @RequiresPermissions("admin.platform:add") + @PermissionTag(name = "添加平台", tag = "平台接入", enable = false) + public Message google_play_save(@Param("platformid") int sid, @Param("provider") String provider, @Param("::p.") GooglePVO googlePVO, HttpServletRequest req) { + PlatformConfig platformConfig = platformConfigService.fetch(Cnd.where("sid", "=", sid).and("provider", "=", provider)); + if (Lang.isEmpty(platformConfig)) { + NutMap map = Lang.obj2nutmap(googlePVO); + map.put("provider", provider); + platformConfigService.insert(new PlatformConfig(sid, map)); + } else { + return Message.error("duplate.data", req); + } + return Message.success("ok", req); + } + + /** + * google + */ + + @At("/google/o_update") + @Ok("json") + @RequiresPermissions("admin.platform:edit") + @PermissionTag(name = "编辑平台", tag = "平台接入", enable = false) + public Message google_update(@Param("platformid") int sid, @Param("id") String id, @Param("::p.") GoogleVO googleVO, HttpServletRequest req) { + PlatformConfig platformConfig = platformConfigService.fetch(Cnd.where("id", "=", id)); + platformConfig.setConfig(Lang.obj2nutmap(googleVO)); + platformConfigService.update(platformConfig); + return Message.success("ok", req); + } + + @At("/google/o_save") + @Ok("json") + @RequiresPermissions("admin.platform:add") + @PermissionTag(name = "添加平台", tag = "平台接入", enable = false) + public Message google_save(@Param("platformid") int sid, @Param("provider") String provider, @Param("::p.") GoogleVO googleVO, HttpServletRequest req) { + PlatformConfig platformConfig = platformConfigService.fetch(Cnd.where("sid", "=", sid).and("provider", "=", provider)); + if (Lang.isEmpty(platformConfig)) { + NutMap map = Lang.obj2nutmap(googleVO); + map.put("provider", provider); + platformConfigService.insert(new PlatformConfig(sid, map)); + } else { + return Message.error("duplate.data", req); + } + return Message.success("ok", req); + } + + /** + * apple + */ + + @At("/apple/o_update") + @Ok("json") + @RequiresPermissions("admin.platform:edit") + @PermissionTag(name = "编辑平台", tag = "平台接入", enable = false) + public Message apple_update(@Param("platformid") int sid, @Param("id") String id, @Param("::p.") AppleVO appleVO, HttpServletRequest req) { + PlatformConfig platformConfig = platformConfigService.fetch(Cnd.where("id", "=", id)); + platformConfig.setConfig(Lang.obj2nutmap(appleVO)); + platformConfigService.update(platformConfig); + return Message.success("ok", req); + } + + @At("/apple/o_save") + @Ok("json") + @RequiresPermissions("admin.platform:add") + @PermissionTag(name = "添加平台", tag = "平台接入", enable = false) + public Message apple_save(@Param("platformid") int sid, @Param("provider") String provider, @Param("::p.") AppleVO appleVO, HttpServletRequest req) { + PlatformConfig platformConfig = platformConfigService.fetch(Cnd.where("sid", "=", sid).and("provider", "=", provider)); + if (Lang.isEmpty(platformConfig)) { + NutMap map = Lang.obj2nutmap(appleVO); + map.put("provider", provider); + platformConfigService.insert(new PlatformConfig(sid, map)); + } else { + return Message.error("duplate.data", req); + } + return Message.success("ok", req); + } +} diff --git a/src/main/java/com/rekoe/module/admin/AdminReportAdsAct.java b/src/main/java/com/rekoe/module/admin/AdminReportAdsAct.java new file mode 100644 index 0000000..c2334f0 --- /dev/null +++ b/src/main/java/com/rekoe/module/admin/AdminReportAdsAct.java @@ -0,0 +1,48 @@ +package com.rekoe.module.admin; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Collection; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Attr; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; +import org.nutz.web.Webs; + +import com.rekoe.annotation.PermissionTag; +import com.rekoe.domain.GameServer; +import com.rekoe.domain.User; +import com.rekoe.module.BaseAction; +import com.rekoe.service.GameServerService; +import com.rekoe.service.ReportAdsService; + +@IocBean +@At("/admin/report/ads") +public class AdminReportAdsAct extends BaseAction { + + @Inject + private ReportAdsService reportAdsService; + + @Inject + private GameServerService gameServerService; + + @At + @Ok("fm:template.admin.report.ads.search") + @RequiresPermissions({ "report:ads" }) + @PermissionTag(name = "设备号汇报搜索", tag = "数据统计") + public Collection search(@Attr(Webs.ME) User user) { + return user.getServers().values(); + } + + @At + @Ok("down") + @RequiresPermissions({ "report:ads.down" }) + @PermissionTag(name = "设备号数据下载", tag = "数据统计") + public ByteArrayOutputStream down(@Param("pid") int pid) throws IOException { + return loadDown(reportAdsService.getList(pid)); + } +} diff --git a/src/main/java/com/rekoe/module/admin/AdminRoleAct.java b/src/main/java/com/rekoe/module/admin/AdminRoleAct.java new file mode 100644 index 0000000..083efbe --- /dev/null +++ b/src/main/java/com/rekoe/module/admin/AdminRoleAct.java @@ -0,0 +1,117 @@ +package com.rekoe.module.admin; + +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.nutz.dao.Cnd; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.mvc.NutConfigException; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +import com.rekoe.annotation.PermissionTag; +import com.rekoe.common.Message; +import com.rekoe.domain.Permission; +import com.rekoe.domain.PermissionCategory; +import com.rekoe.domain.Role; +import com.rekoe.service.PermissionCategoryService; +import com.rekoe.service.PermissionService; +import com.rekoe.service.RoleService; + +/** + * @author 科技㊣²º¹³
+ * 2014年2月3日 下午4:48:45
+ * http://www.rekoe.com
+ * QQ:5382211 + */ +@IocBean +@At("/admin/role") +public class AdminRoleAct { + + @Inject + private RoleService roleService; + + @Inject + private PermissionService permissionService; + + @Inject + private PermissionCategoryService permissionCategoryService; + + @At + @Ok("fm:template.admin.user.role.list") + @RequiresPermissions("system.role:view") + @PermissionTag(name = "浏览角色", tag = "角色管理") + public Object list(@Param(value = "pageNumber", df = "1") int pageNumber) { + return roleService.getRoleListByPager(pageNumber, 20); + } + + @At + @Ok("fm:template.admin.user.role.edit") + @RequiresPermissions("system.role:edit") + @PermissionTag(name = "编辑角色", tag = "角色管理") + public Object edit(@Param("id") long id, HttpServletRequest req) { + Role role = roleService.view(id); + List pcList = permissionCategoryService.list(); + req.setAttribute("pcList", pcList); + return role; + } + + @At + @Ok(">>:/admin/role/list.rk") + @RequiresPermissions("system.role:edit") + public void update(@Param("::role.") Role tempRole, @Param("name") String name, @Param("authorities") int[] permIds) { + Role $role = roleService.view(tempRole.getId()); + if (!Lang.isEmpty($role)) { + List perms = permissionService.query(Cnd.where("id", "in", permIds), null); + $role.setDescription(tempRole.getDescription()); + $role.setName(name); + roleService.updateRoleRelation($role, perms); + } else { + throw new NutConfigException("用户不存在"); + } + } + + /** + * 添加新的角色 + */ + @At + @Ok("fm:template.admin.user.role.add") + @RequiresPermissions("system.role:add") + @PermissionTag(name = "添加角色", tag = "角色管理") + public List add(HttpServletRequest req) { + return permissionCategoryService.list(); + } + + @At + @Ok(">>:${obj==true?'/role/list.rk':'/admin/common/unauthorized.rk'}") + @RequiresPermissions("system.role:add") + @PermissionTag(name = "添加角色", tag = "角色管理", enable = false) + public boolean save(@Param("name") String name, @Param("description") String desc, @Param("authorities") int[] ids) { + Role role = roleService.fetchByName(name); + if (Lang.isEmpty(role)) { + role = new Role(); + role.setDescription(desc); + role.setName(name); + role.setPermissions(permissionService.query(Cnd.where("id", "in", ids), null)); + roleService.insert(role); + return true; + } + return false; + } + + @At + @Ok("json") + @RequiresPermissions("system.role:delete") + @PermissionTag(name = "删除角色", tag = "角色管理") + public Message delete(@Param("ids") Long[] uids, HttpServletRequest req) { + for (Long id : uids) { + roleService.delete(id); + } + return Message.success("admin.message.success", req); + } +} diff --git a/src/main/java/com/rekoe/module/admin/AdminUserAct.java b/src/main/java/com/rekoe/module/admin/AdminUserAct.java new file mode 100644 index 0000000..89e6f0d --- /dev/null +++ b/src/main/java/com/rekoe/module/admin/AdminUserAct.java @@ -0,0 +1,308 @@ +package com.rekoe.module.admin; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authz.annotation.RequiresAuthentication; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.apache.shiro.authz.annotation.RequiresUser; +import org.apache.shiro.crypto.RandomNumberGenerator; +import org.apache.shiro.crypto.SecureRandomNumberGenerator; +import org.apache.shiro.crypto.hash.Sha256Hash; +import org.apache.shiro.subject.Subject; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.lang.Mirror; +import org.nutz.mvc.NutConfigException; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Attr; +import org.nutz.mvc.annotation.Fail; +import org.nutz.mvc.annotation.Filters; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; +import org.nutz.web.Webs; +import org.nutz.web.ajax.Ajax; + +import com.alibaba.druid.util.DruidWebUtils; +import com.rekoe.annotation.PermissionTag; +import com.rekoe.common.Message; +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.GameServer; +import com.rekoe.domain.Role; +import com.rekoe.domain.User; +import com.rekoe.service.GameServerService; +import com.rekoe.service.RoleService; +import com.rekoe.service.UserService; + +/** + * @author 科技㊣²º¹³
+ * 2014年2月3日 下午4:48:45
+ * http://www.rekoe.com
+ * QQ:5382211 + */ +@IocBean +@At("/admin/user") +public class AdminUserAct { + + @Inject + private UserService userService; + @Inject + private RoleService roleService; + + @Inject + private GameServerService gameServerService; + + @At + @Ok("fm:template.admin.common.main") + @RequiresAuthentication + public void main() { + } + + @At + @Ok("fm:template.admin.user.list") + @RequiresPermissions({ "system.user:view" }) + @PermissionTag(name = "浏览账号", tag = "账号管理") + public Pagination list(@Param(value = "pageNumber", df = "1") int pageNumber) { + return userService.getUserListByPager(pageNumber, 20); + } + + @At + @Ok("fm:template.admin.user.add") + @RequiresPermissions({ "system.user:add" }) + @PermissionTag(name = "添加账号", tag = "账号管理", enable = false) + public List add() { + return roleService.list(); + } + + @At + @Ok("json") + @RequiresPermissions("system.user:delete") + @PermissionTag(name = "删除账号", tag = "账号管理") + public Message delete(@Param("ids") int[] uids, HttpServletRequest req) { + for (int id : uids) { + userService.delete(id); + } + return Message.success("admin.message.success", req); + } + + @At + @Ok(">>:${obj==true?'/admin/user/list.rk':'/admin/common/unauthorized.rk'}") + @RequiresPermissions({ "system.user:add" }) + @PermissionTag(name = "添加账号", tag = "账号管理", enable = false) + public boolean save(HttpServletRequest req, @Param("username") String username, @Param("password") String password, @Param("isEnabled") boolean isEnabled, @Param("roleIds") int[] roleIds) { + return userService.save(username, password, isEnabled, req.getRemoteAddr(), roleIds); + } + + @At("/check/username") + @Ok("raw") + public boolean checkName(@Param("username") String username) { + User user = userService.fetchByName(username); + return Lang.isEmpty(user) ? true : false; + } + + @At("/check_email") + @Ok("raw") + public boolean checkEmail(@Param("email") String email) { + return StringUtils.isBlank(email) ? false : email.matches("\\w+@\\w+\\.(com\\.cn)|\\w+@\\w+\\.(com|cn)"); + } + + @At + @Ok("fm:template.admin.user.edit") + @Fail("json") + @RequiresPermissions({ "system.user:edit" }) + @PermissionTag(name = "编辑账号", tag = "账号管理") + public User edit(@Attr(Webs.ME) User user, @Param("id") long id, HttpServletRequest req) { + User editUser = userService.view(id); + if (Lang.isEmpty(editUser) || editUser.isLocked()) { + throw new NutConfigException(String.format("先解除帐号 %s 的锁定状态", editUser.getName())); + } + boolean isSupper = user.isSystem(); + if (user.getId() != editUser.getId()) { + if (!isSupper && editUser.isSystem()) { + throw new NutConfigException("不可以编辑比自己权限高的账号"); + } + } + List roleList = user.getRoles(); + if (isSupper) { + roleList = roleService.list(); + } + List serverList = gameServerService.loadAll(); + int systemSize = serverList.size(); + int userSize = editUser.getServers().size(); + boolean allServer = userSize >= systemSize; + req.setAttribute("allServer", allServer); + req.setAttribute("serverList", serverList); + req.setAttribute("roleList", roleList); + return editUser; + } + + @At + @Ok(">>:/admin/user/list") + @RequiresPermissions({ "system.user:edit" }) + public Object update(@Param("id") long id, @Param("allServer") Boolean allServer, @Param("serverIds") Integer[] serverIds, @Param("roleIds") Integer[] roleIds) { + User user = userService.fetch(id); + userService.removeUserUpdata(user); + allServer = user.isSystem() ? true : allServer; + if (allServer) { + List serverList = gameServerService.loadAll(); + Map serverMap = user.getServers(); + if (Lang.isEmpty(serverMap)) { + serverMap = new HashMap<>(); + user.setServers(serverMap); + } + for (GameServer server : serverList) { + serverMap.put(server.getId(), server); + } + } else { + List serverList = gameServerService.loadAllByIds(serverIds); + Map serverMap = user.getServers(); + if (Lang.isEmpty(serverMap)) { + serverMap = new HashMap<>(); + user.setServers(serverMap); + } + for (GameServer server : serverList) { + serverMap.put(server.getId(), server); + } + } + user.setRoles(roleService.loadRoles(roleIds)); + userService.insertRelations(user); + return user; + } + + /** + * 锁定用户 + */ + @At + @Ok("json") + @RequiresPermissions("system.user:lock") + @PermissionTag(name = "锁定账号", tag = "账号管理") + public Message lock(@Param("id") long id, HttpServletRequest req) { + User user = userService.view(id); + if (Lang.isEmpty(user)) { + return Message.error("common.error.lock.account.empty", req); + } + if (user.isSystem()) { + return Message.error("common.error.lock.account.system", req); + } + boolean lock = user.isLocked(); + user.setLocked(!lock); + userService.updateLock(user); + return Message.success("button.submit.success", req); + } + + @At("/profile/check_current_password") + @Ok("raw") + @RequiresUser + public boolean checkCurrentPassword(@Param("currentPassword") String password) { + if (StringUtils.isBlank(password)) { + return false; + } + Object principal = SecurityUtils.getSubject().getPrincipal(); + User user = (User) principal; + if (StringUtils.equals(new Sha256Hash(password, user.getSalt(), 1024).toBase64(), user.getPassword())) { + return true; + } + return false; + } + + @At("/profile/edit") + @Ok("fm:template.admin.profile.edit") + public Subject profileEdit() { + return SecurityUtils.getSubject(); + } + + /** + * 添加账号 + */ + @At + @Ok("fm:template.admin.user.add_user") + @RequiresPermissions("system.user:add") + @PermissionTag(name = "添加账号", tag = "账号管理") + public void add_user() { + } + + @At + @Ok(">>:/admin/user/list") + @RequiresPermissions("system.user:add") + public Object save_user(@Param("::user.") User user, HttpServletRequest req) { + User selectUser = userService.fetchByName(user.getName()); + if (Lang.isEmpty(selectUser)) { + userService.regist(user, DruidWebUtils.getRemoteAddr(req)); + return Ajax.ok(); + } + return Ajax.fail(); + } + + @At("/profile/update") + @Ok("fm:template.admin.profile.edit") + @RequiresUser + public boolean profileUpdate(@Param("currentPassword") String currentPassword, @Param("password") String password) { + if (checkCurrentPassword(currentPassword)) { + Object principal = SecurityUtils.getSubject().getPrincipal(); + Object uid = Mirror.me(User.class).getValue(principal, "id"); + userService.updatePwd(uid, password); + return true; + } + return false; + } + + @At("/profile/re_update") + @Ok(">>:${obj?'/admin/main':'/admin/common/unauthorized.rk'}") + @Filters + public boolean regUpate(@Param("username") String username, @Param("password") String password, @Attr("me") User suser) { + if (StringUtils.isBlank(username) || StringUtils.isBlank(password)) { + return false; + } + User selectUser = userService.fetchByName(username); + if (!Lang.isEmpty(selectUser)) { + return false; + } + suser.setSystem(false); + suser.setName(username); + String salt = new SecureRandomNumberGenerator().nextBytes().toBase64(); + suser.setSalt(salt); + suser.setPassword(new Sha256Hash(password, salt, 1024).toBase64()); + userService.update(suser); + return true; + } + + @At + @Ok("fm:template.admin.account.change_pwd") + @RequiresUser + public void change_pwd() { + + } + + @At + @Ok("json") + @RequiresUser + public Object pwd_updata(@Param("oldpwd") String oldpwd, @Param("newpwd") String newpwd, @Param("rewpwd") String rewpwd, @Attr(Webs.ME) User user) { + if (StringUtils.isNotBlank(newpwd)) { + if (Lang.equals(newpwd, rewpwd)) { + String oldSalt = user.getSalt(); + String $oldPwd = new Sha256Hash(oldpwd, oldSalt, 1024).toBase64(); + if (Lang.equals($oldPwd, user.getPassword())) { + RandomNumberGenerator rng = new SecureRandomNumberGenerator(); + String salt = rng.nextBytes().toBase64(); + String hashedPasswordBase64 = new Sha256Hash(newpwd, salt, 1024).toBase64(); + user.setSalt(salt); + user.setPassword(hashedPasswordBase64); + userService.update(user); + return Ajax.ok(); + } else { + return Ajax.fail().setMsg("旧的密码错误"); + } + } else { + return Ajax.fail().setMsg("两次输入的密码不一致"); + } + } else { + return Ajax.fail().setMsg("密码不能为空"); + } + } +} diff --git a/src/main/java/com/rekoe/module/admin/AdminVerifyAct.java b/src/main/java/com/rekoe/module/admin/AdminVerifyAct.java new file mode 100644 index 0000000..d0a137e --- /dev/null +++ b/src/main/java/com/rekoe/module/admin/AdminVerifyAct.java @@ -0,0 +1,91 @@ +package com.rekoe.module.admin; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.shiro.authz.annotation.RequiresUser; +import org.nutz.dao.Cnd; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.mvc.View; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Attr; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; +import org.nutz.mvc.view.ViewWrapper; +import org.nutz.plugins.view.freemarker.FreeMarkerConfigurer; +import org.nutz.plugins.view.freemarker.FreemarkerView; +import org.nutz.web.Webs; + +import com.rekoe.common.Message; +import com.rekoe.domain.GameServer; +import com.rekoe.domain.User; +import com.rekoe.domain.VerifyServer; +import com.rekoe.service.GameServerService; +import com.rekoe.service.VerifyServerService; + +/** + * 提审服务器配置 + * @author kouxian + * + */ +@IocBean +@At("/admin/verify") +public class AdminVerifyAct { + + @Inject + private VerifyServerService verifyServerService; + + @Inject + private FreeMarkerConfigurer freeMarkerConfigurer; + + @Inject + private GameServerService gameServerService; + + @At + @RequiresUser + public View view(@Attr(Webs.ME) User user, @Param("pid") int pid) { + VerifyServer verifyServer = verifyServerService.fetch(Cnd.where("pid", "=", pid)); + GameServer server = gameServerService.fetch(Cnd.where("pid", "=", pid)); + if (Lang.isEmpty(server)) { + throw Lang.makeThrow("Not Fond PID[%s] Server", pid); + } + GameServer userServer = user.getServers().get(server.getId()); + if (Lang.isEmpty(userServer)) { + throw Lang.makeThrow("You Not Have This Server[%s] Permission ", server.getPlatformName()); + } + if (Lang.isEmpty(verifyServer)) { + return new ViewWrapper(new FreemarkerView(freeMarkerConfigurer, "template/admin/server/verify/add"), server); + } + verifyServer.setGameServer(server); + return new ViewWrapper(new FreemarkerView(freeMarkerConfigurer, "template/admin/server/verify/edit"), verifyServer); + } + + @At + @Ok("json") + @RequiresUser + public Message o_save(@Param("::p.") VerifyServer vserver, HttpServletRequest req) { + VerifyServer verifyServer = verifyServerService.fetch(Cnd.where("pid", "=", vserver.getPid())); + if (!Lang.isEmpty(verifyServer)) { + throw Lang.makeThrow("Not Fond PID[%s] Server", vserver.getPid()); + } + vserver.setPid(vserver.getPid()); + boolean isRight = verifyServerService.insert(vserver); + if (isRight) { + return Message.success("button.submit.success", req); + } + return Message.error("admin.message.error", req); + } + + @At + @Ok("json") + @RequiresUser + public Message o_update(@Param("::p.") VerifyServer vserver, HttpServletRequest req) { + VerifyServer verifyServer = verifyServerService.fetch(Cnd.where("pid", "=", vserver.getPid())); + if (Lang.isEmpty(verifyServer)) { + throw Lang.makeThrow("Not Fond PID[%s] Server", vserver.getPid()); + } + verifyServerService.update(vserver); + return Message.success("button.submit.success", req); + } +} diff --git a/src/main/java/com/rekoe/module/admin/FrameAct.java b/src/main/java/com/rekoe/module/admin/FrameAct.java new file mode 100644 index 0000000..c485a73 --- /dev/null +++ b/src/main/java/com/rekoe/module/admin/FrameAct.java @@ -0,0 +1,207 @@ +package com.rekoe.module.admin; + +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; + +@IocBean +public class FrameAct { + + /** 用户管理 **/ + @At("/admin/frame/user/main") + @Ok("fm:template.admin.user.frame.main") + public void userMain() { + } + + @At("/admin/frame/user/left") + @Ok("fm:template.admin.user.frame.left") + public void userLeft() { + } + + @At("/admin/frame/user/right") + @Ok("fm:template.admin.user.frame.right") + public void userRight() { + } + + // Server + @At("/admin/frame/server/main") + @Ok("fm:template.admin.server.frame.main") + public void serverMain() { + } + + @At("/admin/frame/server/left") + @Ok("fm:template.admin.server.frame.left") + public void serverLeft() { + } + + @At("/admin/frame/server/right") + @Ok("fm:template.admin.server.frame.right") + public void serverRight() { + } + + /* + * 修改密码 + */ + // 系统配置 + @At("/admin/frame/account/main") + @Ok("fm:template.admin.account.frame.main") + public void accountPwdMain() { + } + + @At("/admin/frame/account/left") + @Ok("fm:template.admin.account.frame.left") + public void accountPwdLeft() { + } + + @At("/admin/frame/account/right") + @Ok("fm:template.admin.account.frame.right") + public void gamePwdRight() { + } + + /** + * 用户操作日志 + */ + + @At("/admin/frame/system/log/main") + @Ok("fm:template.admin.system.log.frame.main") + public void system_log_main() { + } + + @At("/admin/frame/system/log/left") + @Ok("fm:template.admin.system.log.frame.left") + public void system_log_left() { + } + + @At("/admin/frame/system/log/right") + @Ok("fm:template.admin.system.log.frame.right") + public void system_log_right() { + } + + /** + * 账号处理 + */ + + @At("/admin/frame/pay_refund/main") + @Ok("fm:template.admin.pay_refund.frame.main") + public void pay_refund_main() { + } + + @At("/admin/frame/pay_refund/left") + @Ok("fm:template.admin.pay_refund.frame.left") + public void pay_refund_left() { + } + + @At("/admin/frame/pay_refund/right") + @Ok("fm:template.admin.pay_refund.frame.right") + public void pay_refund_right() { + } + + /** + * 退单处理 + */ + + @At("/admin/app/frame/account/main") + @Ok("fm:template.admin.app.account.frame.main") + public void app_account_main() { + } + + @At("/admin/app/frame/account/left") + @Ok("fm:template.admin.app.account.frame.left") + public void app_account_left() { + } + + @At("/admin/app/frame/account/right") + @Ok("fm:template.admin.app.account.frame.right") + public void app_account_right() { + } + + /** + * CDKEY + */ + @At("/admin/frame/cdkey/main") + @Ok("fm:template.admin.cdkey.frame.main") + public void cdkey_main() { + } + + @At("/admin/frame/cdkey/left") + @Ok("fm:template.admin.cdkey.frame.left") + public void cdkey_left() { + } + + @At("/admin/frame/cdkey/right") + @Ok("fm:template.admin.cdkey.frame.right") + public void cdkey_right() { + } + + /*** + * oauth_client + */ + @At("/admin/frame/oauth_client/main") + @Ok("fm:template.admin.oauth_client.frame.main") + public void oauth_client_main() { + } + + @At("/admin/frame/oauth_client/left") + @Ok("fm:template.admin.oauth_client.frame.left") + public void oauth_client_left() { + } + + @At("/admin/frame/oauth_client/right") + @Ok("fm:template.admin.oauth_client.frame.right") + public void oauth_client_right() { + } + + /*** + * oauth_user + */ + @At("/admin/frame/oauth_user/main") + @Ok("fm:template.admin.oauth_user.frame.main") + public void oauth_user_main() { + } + + @At("/admin/frame/oauth_user/left") + @Ok("fm:template.admin.oauth_user.frame.left") + public void oauth_user_left() { + } + + @At("/admin/frame/oauth_user/right") + @Ok("fm:template.admin.oauth_user.frame.right") + public void oauth_user_right() { + } + + /** + * 公告 + */ + @At("/admin/frame/notice/main") + @Ok("fm:template.admin.notice.frame.main") + public void notice_main() { + } + + @At("/admin/frame/notice/left") + @Ok("fm:template.admin.notice.frame.left") + public void notice_left() { + } + + @At("/admin/frame/notice/right") + @Ok("fm:template.admin.notice.frame.right") + public void notice_right() { + } + + /** + * 数据汇报 + */ + @At("/admin/frame/report/main") + @Ok("fm:template.admin.report.frame.main") + public void report_main() { + } + + @At("/admin/frame/report/left") + @Ok("fm:template.admin.report.frame.left") + public void report_left() { + } + + @At("/admin/frame/report/right") + @Ok("fm:template.admin.report.frame.right") + public void report_right() { + } +} diff --git a/src/main/java/com/rekoe/module/admin/PayRefundAct.java b/src/main/java/com/rekoe/module/admin/PayRefundAct.java new file mode 100644 index 0000000..2bb8512 --- /dev/null +++ b/src/main/java/com/rekoe/module/admin/PayRefundAct.java @@ -0,0 +1,152 @@ +package com.rekoe.module.admin; + +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; +import org.nutz.ioc.impl.PropertiesProxy; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.lang.Lang; +import org.nutz.log.Log; +import org.nutz.log.Logs; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +import com.rekoe.annotation.PermissionTag; +import com.rekoe.common.Message; +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.PayRefund; +import com.rekoe.domain.PlatformUser; +import com.rekoe.module.facebook.pay.Order; +import com.rekoe.service.PayFefundService; +import com.rekoe.service.PlatformUserService; +import com.restfb.Parameter; +import com.restfb.batch.BatchRequest; +import com.restfb.batch.BatchRequest.BatchRequestBuilder; +import com.restfb.batch.BatchResponse; + +@IocBean +@At("/admin/pay_refund") +public class PayRefundAct { + + private final static Log log = Logs.get(); + /** + * /PAYMENT_ID/refunds + */ + @Inject + private PayFefundService payFefundService; + + @At + @Ok("fm:template.admin.pay_refund.list") + @RequiresPermissions("admin.pay:refund") + @PermissionTag(name = "退单管理", tag = "退单管理", enable = true) + public Pagination list(@Param(value = "pageNumber", df = "1") Integer pageNumber) { + return payFefundService.getPayRefundListByPager(pageNumber); + } + + @At + @Ok("fm:template.admin.pay_refund.view") + @RequiresPermissions("admin.pay:refund") + @PermissionTag(name = "退单管理", tag = "退单管理", enable = false) + public Order view(@Param("id") String id, @Param("appid") String appid, HttpServletRequest req) throws Exception { + return edit(id, appid, req); + } + + @At + @Ok("fm:template.admin.pay_refund.edit") + @RequiresPermissions("admin.pay:refund") + @PermissionTag(name = "退单管理", tag = "退单管理", enable = false) + public Order edit(@Param("id") String id, @Param("appid") String appid, HttpServletRequest req) throws Exception { + req.setAttribute("appid", appid); + return Json.fromJson(Order.class, payFefundService.facebookFetch(id)); + } + + @At + @Ok("json") + @RequiresPermissions("admin.pay:refund") + @PermissionTag(name = "退单管理", tag = "退单管理", enable = false) + public Message refund(@Param("appid") String appid, @Param("id") String id, @Param("currency") String currency, @Param("amount") String amount, @Param("reason") String reason, HttpServletRequest req) throws Exception { + BatchRequest postRequest = new BatchRequestBuilder(id + "/refunds").method("POST").body(Parameter.with("reason", reason), Parameter.with("currency", currency), Parameter.with("amount", amount)).build(); + List list = payFefundService.getFacebookClient().executeBatch(postRequest); + BatchResponse res = list.get(0); + String result = res.getBody(); + disputeResult disputeResult = Json.fromJson(disputeResult.class, result); + if (!Lang.isEmpty(disputeResult) && disputeResult.isSuccess()) { + PayRefund payRefund = payFefundService.fetchByKeyId(appid); + payRefund.setStatus(true); + payFefundService.update(payRefund); + return Message.success("admin.message.success", req); + } + com.rekoe.module.facebook.pay.Error pay = Json.fromJson(com.rekoe.module.facebook.pay.Error.class, result); + return Message.error(pay.getError().getMessage(), req); + } + + @At + @Ok("json") + @RequiresPermissions("admin.pay:refund") + @PermissionTag(name = "退单管理", tag = "退单管理", enable = false) + public Message dispute(@Param("appid") String appid, @Param("id") String id, @Param("reason") String reason, HttpServletRequest req) throws Exception { + BatchRequest postRequest = new BatchRequestBuilder(id + "/dispute").method("POST").body(Parameter.with("reason", reason)).build(); + List list = payFefundService.getFacebookClient().executeBatch(postRequest); + BatchResponse res = list.get(0); + String result = res.getBody(); + log.infof("dispute res[%s]", result); + disputeResult disputeResult = Json.fromJson(disputeResult.class, result); + if (!Lang.isEmpty(disputeResult) && disputeResult.isSuccess()) { + PayRefund payRefund = payFefundService.fetchByKeyId(appid); + payRefund.setStatus(true); + payFefundService.update(payRefund); + return Message.success("admin.message.success", req); + } + com.rekoe.module.facebook.pay.Error pay = Json.fromJson(com.rekoe.module.facebook.pay.Error.class, result); + return Message.error(pay.getError().getMessage(), req); + } + + public static void main(String[] args) { + String json = "[{\"success\":true}]"; + List rest = Json.fromJsonAsList(disputeResult.class, json); + System.out.println(rest.get(0).isSuccess()); + } + + public static class disputeResult { + private boolean success; + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + } + + @Inject + private PlatformUserService platformUserService; + @Inject + private PropertiesProxy conf; + + @At + @Ok("json") + @RequiresPermissions("admin.pay:refund") + @PermissionTag(name = "退单管理", tag = "退单管理", enable = false) + public Message update(@Param("id") String id, HttpServletRequest req) { + PayRefund payRefund = payFefundService.fetchByID(id); + if (Lang.isEmpty(payRefund)) { + return Message.error("admin.common.error.notfund", req); + } + String passportid = payRefund.getPassportid(); + PlatformUser platformUser = platformUserService.getPlatformUser(conf.getInt("facebook.pid"), passportid, conf.get("facebook.pfid")); + if (Lang.isEmpty(platformUser)) { + return Message.error("admin.common.error.notfund", req); + } + platformUser.setLocked(true); + platformUserService.update(Chain.make("is_locked", true), Cnd.where("id", "=", platformUser.getId())); + return Message.success("admin.message.success", req); + } +} diff --git a/src/main/java/com/rekoe/module/admin/PermissionAct.java b/src/main/java/com/rekoe/module/admin/PermissionAct.java new file mode 100644 index 0000000..df26c43 --- /dev/null +++ b/src/main/java/com/rekoe/module/admin/PermissionAct.java @@ -0,0 +1,110 @@ +package com.rekoe.module.admin; + +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Attr; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; +import org.nutz.web.Webs; + +import com.rekoe.annotation.PermissionTag; +import com.rekoe.common.Message; +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.Permission; +import com.rekoe.domain.PermissionCategory; +import com.rekoe.domain.User; +import com.rekoe.service.PermissionCategoryService; +import com.rekoe.service.PermissionService; + +/** + * @author 科技㊣²º¹³
+ * 2014年4月19日 上午9:20:28
+ * http://www.rekoe.com
+ * QQ:5382211 + */ +@IocBean +@At("/admin/permission") +public class PermissionAct { + + @Inject + private PermissionCategoryService permissionCategoryService; + @Inject + private PermissionService permissionService; + + @At + @Ok("fm:template.admin.user.permission.list") + @RequiresPermissions({ "system.permission:view" }) + @PermissionTag(name = "浏览权限", tag = "权限管理") + public Pagination list(@Param(value = "pageNumber", df = "1") int pageNumber) { + return permissionService.getPermissionListByPager(pageNumber); + } + + @At("/list_category/?") + @Ok("fm:template.admin.user.permission.list") + @RequiresPermissions({ "system.permission:view" }) + @PermissionTag(name = "浏览权限分类", tag = "权限管理", enable = false) + public Pagination listCategory(String id, @Param(value = "pageNumber", df = "1") Integer pageNumber) { + return permissionService.getPermissionListByPager(pageNumber, id); + } + + @At + @Ok("fm:template.admin.user.permission.edit") + @RequiresPermissions({ "system.permission:edit" }) + @PermissionTag(name = "编辑限分类", tag = "权限管理") + public List edit(long id, HttpServletRequest req) { + Permission permission = permissionService.fetch(id); + req.setAttribute("permission", permission); + return add(); + } + + @At + @Ok("fm:template.admin.user.permission.add") + @RequiresPermissions({ "system.permission:add" }) + @PermissionTag(name = "添加权限", tag = "权限管理") + public List add() { + List list = permissionCategoryService.list(); + return list; + } + + @At + @Ok("json") + @RequiresPermissions({ "system.permission:delete" }) + @PermissionTag(name = "删除权限", tag = "权限管理") + public Message delete(@Attr(Webs.ME) User user, @Param("id") long id, HttpServletRequest req) { + Permission permission = permissionService.fetch(id); + if (permission.isLocked() && !user.isSystem()) { + return Message.error("admin.permissionCategory.deleteLockedNotAllowed", req); + } + permissionService.delete(id); + return Message.success("admin.common.success", req); + } + + @At + @Ok(">>:/admin/permission/list.rk") + @RequiresPermissions({ "system.permission:edit" }) + @PermissionTag(name = "编辑权限", tag = "权限管理", enable = false) + public boolean update(@Param("::permission.") Permission permission, @Param("description") String description, @Param("name") String name, @Param("id") String id) { + permission.setName(name); + permission.setDescription(description); + permissionService.update(permission); + return true; + } + + @At + @Ok(">>:/admin/permission/list.rk") + @RequiresPermissions({ "system.permission:add" }) + @PermissionTag(name = "添加权限", tag = "权限管理") + public void save(@Param("name") String name, @Param("permissionCategoryId") String permissionCategoryId, @Param("description") String description) { + Permission permission = new Permission(); + permission.setName(name); + permission.setDescription(description); + permission.setPermissionCategoryId(permissionCategoryId); + permissionService.insert(permission); + } +} diff --git a/src/main/java/com/rekoe/module/admin/PermissionCategoryAct.java b/src/main/java/com/rekoe/module/admin/PermissionCategoryAct.java new file mode 100644 index 0000000..4277359 --- /dev/null +++ b/src/main/java/com/rekoe/module/admin/PermissionCategoryAct.java @@ -0,0 +1,86 @@ +package com.rekoe.module.admin; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +import com.rekoe.annotation.PermissionTag; +import com.rekoe.common.Message; +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.PermissionCategory; +import com.rekoe.service.PermissionCategoryService; + +/** + * @author 科技㊣²º¹³
+ * 2014年2月3日 下午4:48:45
+ * http://www.rekoe.com
+ * QQ:5382211 + */ +@IocBean +@At("/admin/permission/category") +public class PermissionCategoryAct { + + @Inject + private PermissionCategoryService permissionCategoryService; + + @At + @Ok("fm:template.admin.user.permission_category.list") + @RequiresPermissions({ "system.permission:view" }) + @PermissionTag(name = "浏览权限", tag = "权限管理", enable = false) + public Pagination list(@Param(value = "pageNumber", df = "1") Integer pageNumber) { + return permissionCategoryService.getPermissionCategoryListByPager(pageNumber); + } + + @At + @Ok("fm:template.admin.user.permission_category.edit") + @RequiresPermissions({ "system.permission:edit" }) + @PermissionTag(name = "编辑权限", tag = "权限管理", enable = false) + public PermissionCategory edit(String id) { + return permissionCategoryService.fetchByID(id); + } + + @At + @Ok(">>:/admin/permission/category/list.rk") + @RequiresPermissions({ "system.permission:edit" }) + @PermissionTag(name = "编辑权限", tag = "权限管理", enable = false) + public boolean update(@Param("name") String name, @Param("id") String id) { + permissionCategoryService.update(Chain.make("name", name), Cnd.where("id", "=", id)); + return true; + } + + @At + @Ok("fm:template.admin.user.permission_category.add") + @RequiresPermissions({ "system.permission:add" }) + public void add() { + } + + @At + @Ok(">>:/admin/permission/category/list.rk") + @RequiresPermissions({ "system.permission:add" }) + @PermissionTag(name = "添加权限", tag = "权限管理", enable = false) + public void save(@Param("name") String name) { + PermissionCategory pc = new PermissionCategory(); + pc.setName(name); + permissionCategoryService.insert(pc); + } + + @At + @Ok("json") + @RequiresPermissions({ "system.permission:delete" }) + @PermissionTag(name = "删除权限", tag = "权限管理", enable = false) + public Message delete(@Param("id") String id, HttpServletRequest req) { + PermissionCategory pc = permissionCategoryService.fetchByID(id); + if (pc.isLocked()) { + return Message.error("admin.permissionCategory.deleteLockedNotAllowed", req); + } + permissionCategoryService.remove(id); + return Message.success("admin.common.success", req); + } +} diff --git a/src/main/java/com/rekoe/module/admin/WelcomeAct.java b/src/main/java/com/rekoe/module/admin/WelcomeAct.java new file mode 100644 index 0000000..4501cf7 --- /dev/null +++ b/src/main/java/com/rekoe/module/admin/WelcomeAct.java @@ -0,0 +1,58 @@ +package com.rekoe.module.admin; + +import java.util.ArrayList; +import java.util.Collection; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authz.annotation.RequiresUser; +import org.nutz.castor.Castors; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; + +import com.rekoe.domain.GameServer; +import com.rekoe.domain.User; +import com.rekoe.module.BaseAction; + +@IocBean +public class WelcomeAct extends BaseAction { + + @At("/admin/index_main") + @Ok("fm:template.admin.main") + public void index() { + } + + @At("/admin/top") + @Ok("fm:template.admin.top") + @RequiresUser + public boolean top(HttpServletRequest req) { + Object obj = SecurityUtils.getSubject().getPrincipal(); + if (obj instanceof User) { + User user = Castors.me().castTo(obj, User.class); + Collection servers = Lang.isEmpty(user.getServers()) ? (new ArrayList()) : ((User) obj).getServers().values(); + req.setAttribute("servers", servers); + return Lang.equals("local", user.getProviderid()); + } else { + req.setAttribute("servers", new ArrayList()); + } + return true; + } + + @At("/admin/main") + @Ok("fm:template.admin.index") + public void main() { + } + + @At("/admin/left") + @Ok("fm:template.admin.left") + public void left() { + } + + @At("/admin/right") + @Ok("fm:template.admin.right") + public void right() { + } +} diff --git a/src/main/java/com/rekoe/module/facebook/FaceBookLoginAct.java b/src/main/java/com/rekoe/module/facebook/FaceBookLoginAct.java new file mode 100644 index 0000000..d47796e --- /dev/null +++ b/src/main/java/com/rekoe/module/facebook/FaceBookLoginAct.java @@ -0,0 +1,179 @@ +package com.rekoe.module.facebook; + +import java.io.PrintWriter; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.commons.lang3.StringUtils; +import org.brickred.socialauth.util.OAuthConfig; +import org.nutz.ioc.impl.PropertiesProxy; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.lang.Times; +import org.nutz.mvc.View; +import org.nutz.mvc.adaptor.JsonAdaptor; +import org.nutz.mvc.annotation.AdaptBy; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; +import org.nutz.mvc.view.ViewWrapper; +import org.nutz.mvc.view.VoidView; +import org.nutz.plugins.view.freemarker.FreeMarkerConfigurer; +import org.nutz.plugins.view.freemarker.FreemarkerView; +import org.nutz.web.ajax.Ajax; +import org.nutz.web.ajax.AjaxReturn; + +import com.rekoe.domain.OfficialServer; +import com.rekoe.domain.PlatformUser; +import com.rekoe.domain.ServerHistory; +import com.rekoe.module.facebook.pay.PayObject; +import com.rekoe.service.IdWorkerService; +import com.rekoe.service.OfficialServerService; +import com.rekoe.service.PayFefundService; +import com.rekoe.service.PlatformUserService; +import com.rekoe.service.ServerHistoryService; +import com.restfb.DefaultFacebookClient; +import com.restfb.FacebookClient; +import com.restfb.types.User; + +@IocBean +@At("/facebook") +public class FaceBookLoginAct { + + public static final String OAUTH_ID = "facebook"; + private final String FB_URL = "https://apps.facebook.com/"; + private final String FB_TYPE_USER = "me"; + @Inject("java:conf.get('facebook.pid')") + private static int PLARFORM_ID = 1002; + @Inject("java:conf.get('facebook.pfid')") + private static String PFID; + @Inject("java:conf.get('facebook.namespace')") + private static String NAMESPACE; + @Inject("java:conf.get('facebook.feed.upstream.url')") + private static String FEED_UPSTREAM_URL; + @Inject + private PlatformUserService platformUserService; + + @Inject + private IdWorkerService idFactory; + + @Inject + private FreeMarkerConfigurer freeMarkerConfigurer; + + @Inject + private ServerHistoryService serverHistoryService; + + @Inject + private OfficialServerService officialServerService; + + @Inject + private PropertiesProxy conf; + @Inject + private PayFefundService payFefundService; + + @At + public View login(@Param("signed_request") String code, HttpServletRequest req, HttpServletResponse res, HttpSession session) throws Exception { + OAuthConfig oAuthConfig = payFefundService.getConfig().getProviderConfig(OAUTH_ID); + String appId = oAuthConfig.get_consumerKey(); + boolean isRight = true; + if (StringUtils.isBlank(code)) { + isRight = false; + } + if (isRight) { + FacebookSignedRequest facebookSR = FacebookSignedRequest.getFacebookSignedRequest(code, FacebookSignedRequest.class); + String accessToken = facebookSR.getOauth_token(); + if (StringUtils.isBlank(accessToken)) { + isRight = false; + } else { + OfficialServer server = officialServerService.getRecommendServer(PLARFORM_ID); + FacebookClient facebookClient = new DefaultFacebookClient(accessToken); + User user = facebookClient.fetchObject(FB_TYPE_USER, User.class); + PlatformUser platformUser = platformUserService.getPlatformUser(PLARFORM_ID, user.getId(), PFID); + if (Lang.isEmpty(platformUser)) { + long openid = idFactory.nextId(); + platformUser = platformUserService.add(PLARFORM_ID, user.getId(), openid, PFID); + ServerHistory entity = new ServerHistory(platformUser.getOpenid(), PLARFORM_ID, server.getSid()); + serverHistoryService.add(entity); + req.setAttribute("sid", server.getSid()); + } else { + if (platformUser.isLocked()) { + return new ViewWrapper(new FreemarkerView(freeMarkerConfigurer, "template/admin/common/lock"), ""); + } + ServerHistory entity = serverHistoryService.getLastLoginServer(platformUser.getOpenid(), PLARFORM_ID); + if (!Lang.isEmpty(entity)) { + req.setAttribute("sid", entity.getSid()); + } + } + ServerHistory hisroty = serverHistoryService.getLoginServerList(platformUser.getOpenid(), PLARFORM_ID, 1); + req.setAttribute("top", server); + req.setAttribute("userHistory", hisroty); + req.setAttribute("user", user); + req.setAttribute("code", code); + req.setAttribute("ads", req.getQueryString()); + req.setAttribute("zone", server); + } + } + if (isRight) { + res.addHeader("P3P", "CP=CAO PSA OUR IDC DSP COR ADM DEVi TAIi PSD IVAi IVDi CONi HIS IND CNT"); + List zones = officialServerService.getShowList(PLARFORM_ID); + req.setAttribute("zones", zones); + req.setAttribute("namespace", NAMESPACE); + req.setAttribute("appId", appId); + req.setAttribute("feed_upstream_url", FEED_UPSTREAM_URL); + return new ViewWrapper(new FreemarkerView(freeMarkerConfigurer, "template/front/zone/in"), zones); + } else { + String url = "http://www.facebook.com/dialog/oauth?client_id=" + appId + "&scope=email,publish_actions&redirect_uri=" + FB_URL + NAMESPACE + "/?" + req.getQueryString(); + res.setContentType("text/html"); + PrintWriter writer = res.getWriter(); + writer.print(""); + writer.close(); + return new VoidView(); + } + } + + @At("/change/?/?") + @Ok("json") + public AjaxReturn change(int sid, String passportid) { + PlatformUser platformUser = platformUserService.getPlatformUser(PLARFORM_ID, passportid, PFID); + if (Lang.isEmpty(platformUser)) { + return Ajax.fail(); + } + if (platformUser.isLocked()) { + return Ajax.fail(); + } + OfficialServer officialServer = officialServerService.getOfficialServer(PLARFORM_ID, sid); + if (Lang.isEmpty(officialServer)) { + return Ajax.fail(); + } + ServerHistory entity = serverHistoryService.getServerHistory(platformUser.getOpenid(), PLARFORM_ID, sid); + if (Lang.isEmpty(entity)) { + entity = new ServerHistory(platformUser.getOpenid(), PLARFORM_ID, sid); + serverHistoryService.add(entity); + } else { + entity.setModifyTime(Times.now()); + serverHistoryService.update(entity); + } + return Ajax.ok().setData(officialServer); + } + + @At + @Ok("redirect:${obj}") + public String upstream() { + return "https://apps.facebook.com/" + NAMESPACE + "/"; + } + + @At + @AdaptBy(type = JsonAdaptor.class) + @Ok("raw") + public String refund(PayObject pay, @Param("::hub.") ReFund reFund) { + payFefundService.push(pay); + if (Lang.isEmpty(reFund)) { + return "ok"; + } + return reFund.getChallenge(); + } +} diff --git a/src/main/java/com/rekoe/module/facebook/FacebookSignedRequest.java b/src/main/java/com/rekoe/module/facebook/FacebookSignedRequest.java new file mode 100644 index 0000000..7e8700f --- /dev/null +++ b/src/main/java/com/rekoe/module/facebook/FacebookSignedRequest.java @@ -0,0 +1,125 @@ +package com.rekoe.module.facebook; + +import org.nutz.json.Json; +public class FacebookSignedRequest { + + private String algorithm; + private Long expires; + private Long issued_at; + private String oauth_token; + private Long user_id; + private FacebookSignedRequestUser user; + + public static T getFacebookSignedRequest(String signedRequest, Class clazz) throws Exception { + String payload = signedRequest.split("[.]", 2)[1]; + payload = payload.replace("-", "+").replace("_", "/").trim(); + String jsonString = new String(org.nutz.repo.Base64.decodeFast(payload.getBytes())); + return Json.fromJson(clazz, jsonString); + + } + + public static void main(String[] args) { + String payload = "eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImV4cGlyZXMiOjE0MDI5MDIwMDAsImlzc3VlZF9hdCI6MTQwMjg5Njk3MSwib2F1dGhfdG9rZW4iOiJDQUFVZVZjb25FWkJrQkFIdFJtdjJOTVpBRUdvU3NGOENzb1lNYlZxZTVmNXRtYU9jRHdGWkF4QklKUHRaQWVYM3JEajlJVmVZVE5OcmJ6SkdaQmhNUU1oRW80enpXUGI2QTlLTnJVWkFXWkFjUjF2S0Y2WGhFdlNmWkJJbUNoSERHOEt4SVhiRlQ0VkNNSEFTZXNoblVnWkFSc3p3R3RqS0hodHJKZlVjM0ZaQkRoT295OGJUeEEzbFpCbG1xRlhaQU44REUyWVA4aUFxcFhWTlB3WkRaRCIsInVzZXIiOnsiY291bnRyeSI6InVzIiwibG9jYWxlIjoiemhfQ04iLCJhZ2UiOnsibWluIjoyMX19LCJ1c2VyX2lkIjoiMTAwMDAxNzI4NTc5ODU4In0"; + //{"algorithm":"HMAC-SHA256","expires":1402902000,"issued_at":1402896971,"oauth_token":"CAAUeVconEZBkBAHtRmv2NMZAEGoSsF8CsoYMbVqe5f5tmaOcDwFZAxBIJPtZAeX3rDj9IVeYTNNrbzJGZBhMQMhEo4zzWPb6A9KNrUZAWZAcR1vKF6XhEvSfZBImChHDG8KxIXbFT4VCMHASeshnUgZARszwGtjKHhtrJfUc3FZBDhOoy8bTxA3lZBlmqFXZAN8DE2YP8iAqpXVNPwZDZD","user":{"country":"us","locale":"zh_CN","age":{"min":21}},"user_id":"100001728579858"} + String jsonString = new String(org.nutz.repo.Base64.decodeFast(payload.getBytes())); + System.out.println(jsonString);} + public String getAlgorithm() { + return algorithm; + } + + public void setAlgorithm(String algorithm) { + this.algorithm = algorithm; + } + + public Long getExpires() { + return expires; + } + + public void setExpires(Long expires) { + this.expires = expires; + } + + public Long getIssued_at() { + return issued_at; + } + + public void setIssued_at(Long issued_at) { + this.issued_at = issued_at; + } + + public String getOauth_token() { + return oauth_token; + } + + public void setOauth_token(String oauth_token) { + this.oauth_token = oauth_token; + } + + public Long getUser_id() { + return user_id; + } + + public void setUser_id(Long user_id) { + this.user_id = user_id; + } + + public FacebookSignedRequestUser getUser() { + return user; + } + + public void setUser(FacebookSignedRequestUser user) { + this.user = user; + } + + public static class FacebookSignedRequestUser { + + private String country; + private String locale; + private FacebookSignedRequestUserAge age; + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + public String getLocale() { + return locale; + } + + public void setLocale(String locale) { + this.locale = locale; + } + + public FacebookSignedRequestUserAge getAge() { + return age; + } + + public void setAge(FacebookSignedRequestUserAge age) { + this.age = age; + } + + public static class FacebookSignedRequestUserAge { + private int min; + private int max; + + public int getMin() { + return min; + } + + public void setMin(int min) { + this.min = min; + } + + public int getMax() { + return max; + } + + public void setMax(int max) { + this.max = max; + } + } + } +} diff --git a/src/main/java/com/rekoe/module/facebook/ReFund.java b/src/main/java/com/rekoe/module/facebook/ReFund.java new file mode 100644 index 0000000..db094ac --- /dev/null +++ b/src/main/java/com/rekoe/module/facebook/ReFund.java @@ -0,0 +1,38 @@ +package com.rekoe.module.facebook; + +/** + * @author 科技㊣²º¹³
+ * 2014年6月15日 下午8:35:20
+ * http://www.rekoe.com
+ * QQ:5382211
+ */ +public class ReFund { + + private String challenge; + private String mode; + private String verify_token; + + public String getMode() { + return mode; + } + + public void setMode(String mode) { + this.mode = mode; + } + + public String getVerify_token() { + return verify_token; + } + + public void setVerify_token(String verify_token) { + this.verify_token = verify_token; + } + + public String getChallenge() { + return challenge; + } + + public void setChallenge(String challenge) { + this.challenge = challenge; + } +} diff --git a/src/main/java/com/rekoe/module/facebook/pay/Action.java b/src/main/java/com/rekoe/module/facebook/pay/Action.java new file mode 100644 index 0000000..0ece3cf --- /dev/null +++ b/src/main/java/com/rekoe/module/facebook/pay/Action.java @@ -0,0 +1,62 @@ +package com.rekoe.module.facebook.pay; + +import org.nutz.json.JsonField; + +public class Action { + private String type; + private String status; + private String currency; + private String amount; + @JsonField("time_created") + private String timeCreated; + @JsonField("time_updated") + private String timeUpdated; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getCurrency() { + return currency; + } + + public void setCurrency(String currency) { + this.currency = currency; + } + + public String getAmount() { + return amount; + } + + public void setAmount(String amount) { + this.amount = amount; + } + + public String getTimeCreated() { + return timeCreated; + } + + public void setTimeCreated(String timeCreated) { + this.timeCreated = timeCreated; + } + + public String getTimeUpdated() { + return timeUpdated; + } + + public void setTimeUpdated(String timeUpdated) { + this.timeUpdated = timeUpdated; + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/module/facebook/pay/Application.java b/src/main/java/com/rekoe/module/facebook/pay/Application.java new file mode 100644 index 0000000..8ab1c36 --- /dev/null +++ b/src/main/java/com/rekoe/module/facebook/pay/Application.java @@ -0,0 +1,32 @@ +package com.rekoe.module.facebook.pay; + +public class Application { + + private String name; + private String namespace; + private String id; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getNamespace() { + return namespace; + } + + public void setNamespace(String namespace) { + this.namespace = namespace; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } +} diff --git a/src/main/java/com/rekoe/module/facebook/pay/Dispute.java b/src/main/java/com/rekoe/module/facebook/pay/Dispute.java new file mode 100644 index 0000000..0e57c69 --- /dev/null +++ b/src/main/java/com/rekoe/module/facebook/pay/Dispute.java @@ -0,0 +1,55 @@ +package com.rekoe.module.facebook.pay; + +import org.nutz.json.JsonField; + +public class Dispute { + + @JsonField("user_comment") + private String userComment; + @JsonField("time_created") + private String timeCreated; + @JsonField("user_email") + private String userEmail; + private String status; + private String reason; + + public String getUserComment() { + return userComment; + } + + public void setUserComment(String userComment) { + this.userComment = userComment; + } + + public String getTimeCreated() { + return timeCreated; + } + + public void setTimeCreated(String timeCreated) { + this.timeCreated = timeCreated; + } + + public String getUserEmail() { + return userEmail; + } + + public void setUserEmail(String userEmail) { + this.userEmail = userEmail; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } +} diff --git a/src/main/java/com/rekoe/module/facebook/pay/Entry.java b/src/main/java/com/rekoe/module/facebook/pay/Entry.java new file mode 100644 index 0000000..4e777cb --- /dev/null +++ b/src/main/java/com/rekoe/module/facebook/pay/Entry.java @@ -0,0 +1,37 @@ +package com.rekoe.module.facebook.pay; + +import java.util.List; + +import org.nutz.json.JsonField; + +public class Entry { + + private String id; + private long time; + @JsonField("changed_fields") + private List changedFields; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public long getTime() { + return time; + } + + public void setTime(long time) { + this.time = time; + } + + public List getChangedFields() { + return changedFields; + } + + public void setChangedFields(List changedFields) { + this.changedFields = changedFields; + } +} diff --git a/src/main/java/com/rekoe/module/facebook/pay/Error.java b/src/main/java/com/rekoe/module/facebook/pay/Error.java new file mode 100644 index 0000000..f98f02d --- /dev/null +++ b/src/main/java/com/rekoe/module/facebook/pay/Error.java @@ -0,0 +1,15 @@ +package com.rekoe.module.facebook.pay; + +public class Error { + + private ErrorInfo error; + + public ErrorInfo getError() { + return error; + } + + public void setError(ErrorInfo error) { + this.error = error; + } + +} diff --git a/src/main/java/com/rekoe/module/facebook/pay/ErrorInfo.java b/src/main/java/com/rekoe/module/facebook/pay/ErrorInfo.java new file mode 100644 index 0000000..fb604b7 --- /dev/null +++ b/src/main/java/com/rekoe/module/facebook/pay/ErrorInfo.java @@ -0,0 +1,33 @@ +package com.rekoe.module.facebook.pay; + +public class ErrorInfo { + + private String message; + private String type; + private int code; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + +} diff --git a/src/main/java/com/rekoe/module/facebook/pay/FacebookRequestResult.java b/src/main/java/com/rekoe/module/facebook/pay/FacebookRequestResult.java new file mode 100644 index 0000000..7ab155e --- /dev/null +++ b/src/main/java/com/rekoe/module/facebook/pay/FacebookRequestResult.java @@ -0,0 +1,17 @@ +package com.rekoe.module.facebook.pay; + +import com.restfb.Facebook; + +public class FacebookRequestResult { + + @Facebook + private boolean success; + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/src/main/java/com/rekoe/module/facebook/pay/Items.java b/src/main/java/com/rekoe/module/facebook/pay/Items.java new file mode 100644 index 0000000..1cbdee8 --- /dev/null +++ b/src/main/java/com/rekoe/module/facebook/pay/Items.java @@ -0,0 +1,33 @@ +package com.rekoe.module.facebook.pay; + +public class Items { + + private String type; + private String product; + private int quantity; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getProduct() { + return product; + } + + public void setProduct(String product) { + this.product = product; + } + + public int getQuantity() { + return quantity; + } + + public void setQuantity(int quantity) { + this.quantity = quantity; + } + +} diff --git a/src/main/java/com/rekoe/module/facebook/pay/Order.java b/src/main/java/com/rekoe/module/facebook/pay/Order.java new file mode 100644 index 0000000..9095b68 --- /dev/null +++ b/src/main/java/com/rekoe/module/facebook/pay/Order.java @@ -0,0 +1,121 @@ +package com.rekoe.module.facebook.pay; + +import java.util.List; + +import org.nutz.json.JsonField; + +public class Order { + + private String id; + private Application application; + private PlatformUser user; + private List actions; + @JsonField("refundable_amount") + private RefundableAmount refundableAmount; + private String country; + @JsonField("request_id") + private String requestID; + @JsonField("created_time") + private String createdTime; + @JsonField("payout_foreign_exchange_rate") + private int payoutForeignExchangeRate; + private List items; + private List disputes; + private int test; + + public int getTest() { + return test; + } + + public void setTest(int test) { + this.test = test; + } + + public List getDisputes() { + return disputes; + } + + public void setDisputes(List disputes) { + this.disputes = disputes; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Application getApplication() { + return application; + } + + public void setApplication(Application application) { + this.application = application; + } + + public PlatformUser getUser() { + return user; + } + + public void setUser(PlatformUser user) { + this.user = user; + } + + public List getActions() { + return actions; + } + + public void setActions(List actions) { + this.actions = actions; + } + + public RefundableAmount getRefundableAmount() { + return refundableAmount; + } + + public void setRefundableAmount(RefundableAmount refundableAmount) { + this.refundableAmount = refundableAmount; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + public String getRequestID() { + return requestID; + } + + public void setRequestID(String requestID) { + this.requestID = requestID; + } + + public String getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(String createdTime) { + this.createdTime = createdTime; + } + + public int getPayoutForeignExchangeRate() { + return payoutForeignExchangeRate; + } + + public void setPayoutForeignExchangeRate(int payoutForeignExchangeRate) { + this.payoutForeignExchangeRate = payoutForeignExchangeRate; + } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } +} diff --git a/src/main/java/com/rekoe/module/facebook/pay/PayObject.java b/src/main/java/com/rekoe/module/facebook/pay/PayObject.java new file mode 100644 index 0000000..85ebf71 --- /dev/null +++ b/src/main/java/com/rekoe/module/facebook/pay/PayObject.java @@ -0,0 +1,30 @@ +package com.rekoe.module.facebook.pay; + +import java.util.List; + +import org.nutz.json.JsonField; + +//{"object":"payments","entry":[{"id":"577551589029171","time":1402986080,"changed_fields":["actions"]}]} +public class PayObject { + + private String object; + @JsonField("entry") + private List entryList; + + public List getEntryList() { + return entryList; + } + + public void setEntryList(List entryList) { + this.entryList = entryList; + } + + public String getObject() { + return object; + } + + public void setObject(String object) { + this.object = object; + } + +} diff --git a/src/main/java/com/rekoe/module/facebook/pay/PlatformUser.java b/src/main/java/com/rekoe/module/facebook/pay/PlatformUser.java new file mode 100644 index 0000000..b2cc7d9 --- /dev/null +++ b/src/main/java/com/rekoe/module/facebook/pay/PlatformUser.java @@ -0,0 +1,24 @@ +package com.rekoe.module.facebook.pay; + +public class PlatformUser { + + private String id; + private String name; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/src/main/java/com/rekoe/module/facebook/pay/RefundableAmount.java b/src/main/java/com/rekoe/module/facebook/pay/RefundableAmount.java new file mode 100644 index 0000000..ae24752 --- /dev/null +++ b/src/main/java/com/rekoe/module/facebook/pay/RefundableAmount.java @@ -0,0 +1,23 @@ +package com.rekoe.module.facebook.pay; + +public class RefundableAmount { + + private String currency; + private String amount; + + public String getCurrency() { + return currency; + } + + public void setCurrency(String currency) { + this.currency = currency; + } + + public String getAmount() { + return amount; + } + + public void setAmount(String amount) { + this.amount = amount; + } +} diff --git a/src/main/java/com/rekoe/mvc/ProcessTimeProcessor.java b/src/main/java/com/rekoe/mvc/ProcessTimeProcessor.java new file mode 100644 index 0000000..619473d --- /dev/null +++ b/src/main/java/com/rekoe/mvc/ProcessTimeProcessor.java @@ -0,0 +1,29 @@ +package com.rekoe.mvc; + +import javax.servlet.http.HttpServletRequest; + +import org.nutz.log.Log; +import org.nutz.log.Logs; +import org.nutz.mvc.ActionContext; +import org.nutz.mvc.impl.processor.AbstractProcessor; + +/** + * 执行时间过滤器 + */ +public class ProcessTimeProcessor extends AbstractProcessor { + private final static Log log = Logs.get() ; + /** + * 请求执行开始时间 + */ + public static final String START_TIME = "_start_time"; + + @Override + public void process(ActionContext ac) throws Throwable { + long time = System.currentTimeMillis(); + HttpServletRequest request = ac.getRequest(); + request.setAttribute(START_TIME, time); + doNext(ac); + time = System.currentTimeMillis() - time; + log.debugf("process in {%s} ms: {%s}", time, request.getRequestURI()); + } +} diff --git a/src/main/java/com/rekoe/mvc/RkCmsNutFilter.java b/src/main/java/com/rekoe/mvc/RkCmsNutFilter.java new file mode 100644 index 0000000..e88310d --- /dev/null +++ b/src/main/java/com/rekoe/mvc/RkCmsNutFilter.java @@ -0,0 +1,42 @@ +package com.rekoe.mvc; + +import java.io.IOException; +import java.util.HashSet; +import java.util.Set; + +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; + +import org.nutz.mvc.NutFilter; + +public class RkCmsNutFilter extends NutFilter { + + protected Set prefixs = new HashSet(); + + + public void init(FilterConfig conf) throws ServletException { + super.init(conf); + prefixs.add(conf.getServletContext().getContextPath() + "/druid/"); + prefixs.add(conf.getServletContext().getContextPath() + "/res/"); + prefixs.add(conf.getServletContext().getContextPath() + "/thirdparty/"); + prefixs.add(conf.getServletContext().getContextPath() + "/tinyeditor/"); + } + + @Override + public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { + if (req instanceof HttpServletRequest) { + String uri = ((HttpServletRequest) req).getRequestURI(); + for (String prefix : prefixs) { + if (uri.startsWith(prefix)) { + chain.doFilter(req, resp); + return; + } + } + } + super.doFilter(req, resp, chain); + } +} diff --git a/src/main/java/com/rekoe/mvc/mvc-chains.js b/src/main/java/com/rekoe/mvc/mvc-chains.js new file mode 100644 index 0000000..876e645 --- /dev/null +++ b/src/main/java/com/rekoe/mvc/mvc-chains.js @@ -0,0 +1,16 @@ +var chain={ + "default" : { + "ps" : [ + "org.nutz.mvc.impl.processor.UpdateRequestAttributesProcessor", + "org.nutz.mvc.impl.processor.EncodingProcessor", + "org.nutz.mvc.impl.processor.ModuleProcessor", + "org.nutz.integration.shiro.NutShiroProcessor", + "org.nutz.mvc.impl.processor.ActionFiltersProcessor", + "org.nutz.mvc.impl.processor.AdaptorProcessor", + "org.nutz.mvc.impl.processor.MethodInvokeProcessor", + "com.rekoe.mvc.ProcessTimeProcessor", + "org.nutz.mvc.impl.processor.ViewProcessor" + ], + "error" : 'org.nutz.mvc.impl.processor.FailProcessor' + } +}; \ No newline at end of file diff --git a/src/main/java/com/rekoe/mvc/view/DataDownView.java b/src/main/java/com/rekoe/mvc/view/DataDownView.java new file mode 100644 index 0000000..dff590e --- /dev/null +++ b/src/main/java/com/rekoe/mvc/view/DataDownView.java @@ -0,0 +1,26 @@ +package com.rekoe.mvc.view; + +import java.io.ByteArrayOutputStream; +import java.net.URLEncoder; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.nutz.lang.Encoding; +import org.nutz.lang.Streams; +import org.nutz.lang.random.R; +import org.nutz.mvc.View; + +public class DataDownView implements View { + + @Override + public void render(HttpServletRequest req, HttpServletResponse resp, Object obj) throws Throwable { + if (obj instanceof ByteArrayOutputStream) { + ByteArrayOutputStream bout = (ByteArrayOutputStream) obj; + String filename = URLEncoder.encode(R.sg(5, 10).next() + ".csv", Encoding.UTF8); + resp.setHeader("Content-Length", "" + bout.size()); + resp.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); + Streams.writeAndClose(resp.getOutputStream(), bout.toByteArray()); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/mvc/view/DataDownViewMaker.java b/src/main/java/com/rekoe/mvc/view/DataDownViewMaker.java new file mode 100644 index 0000000..846b7cb --- /dev/null +++ b/src/main/java/com/rekoe/mvc/view/DataDownViewMaker.java @@ -0,0 +1,16 @@ +package com.rekoe.mvc.view; + +import org.nutz.ioc.Ioc; +import org.nutz.mvc.View; +import org.nutz.mvc.ViewMaker; + +public class DataDownViewMaker implements ViewMaker { + + public View make(Ioc ioc, String type, String value) { + if ("down".equals(type)) { + return new DataDownView(); + } + return null; + } + +} diff --git a/src/main/java/com/rekoe/service/BaseService.java b/src/main/java/com/rekoe/service/BaseService.java new file mode 100644 index 0000000..6dcc9cd --- /dev/null +++ b/src/main/java/com/rekoe/service/BaseService.java @@ -0,0 +1,155 @@ +package com.rekoe.service; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Random; +import java.util.Set; +import java.util.TreeSet; + +import org.apache.commons.lang3.StringUtils; +import org.nutz.dao.Cnd; +import org.nutz.dao.Condition; +import org.nutz.dao.Dao; +import org.nutz.dao.pager.Pager; +import org.nutz.lang.Lang; +import org.nutz.log.Log; +import org.nutz.log.Logs; +import org.nutz.service.IdEntityService; + +import com.rekoe.common.page.Pagination; + +/** + * @author 科技㊣²º¹³
+ * 2014年2月3日 下午4:48:45
+ * http://www.rekoe.com
+ * QQ:5382211 + */ +public class BaseService extends IdEntityService { + + protected final static int DEFAULT_PAGE_NUMBER = 20; + + private final static Log log = Logs.get(); + + public BaseService() { + super(); + } + + public BaseService(Dao dao) { + super(dao); + } + + public Pagination getObjListByPager(Integer pageNumber, int pageSize, Condition cnd) { + return getObjListByPager(dao(), pageNumber, pageSize, cnd); + } + + public Pagination getObjListByPager(Dao dao, Integer pageNumber, int pageSize, Condition cnd) { + pageNumber = getPageNumber(pageNumber); + Pager pager = dao.createPager(pageNumber, pageSize); + List list = dao.query(getEntityClass(), cnd, pager); + pager.setRecordCount(dao.count(getEntityClass(), cnd)); + return new Pagination(pageNumber, pageSize, pager.getRecordCount(), list); + } + + public Pagination getObjListByPager(Integer pageNumber, Condition cnd) { + return getObjListByPager(pageNumber, DEFAULT_PAGE_NUMBER, cnd); + } + + protected int getPageNumber(Integer pageNumber) { + return Lang.isEmpty(pageNumber) ? 1 : pageNumber; + } + + public void delete(String[] ids) { + dao().clear(getEntityClass(), Cnd.where("id", "in", ids)); + } + public void delete(String id) { + dao().clear(getEntityClass(), Cnd.where("id", "in", id)); + } + + public boolean insert(T t) { + try { + dao().insert(t); + } catch (Exception e) { + log.error(e); + return false; + } + return true; + } + + protected String getRandomStr(String str, String num) { + int len = str.length(); + char[] numArr = num.toCharArray(); + Set rr = getRandomIntArray(len, numArr.length); + Iterator iterator = rr.iterator(); + List strList = new ArrayList<>(); + int i = 0; + int last = 0; + while (iterator.hasNext()) { + int site = iterator.next(); + if (i == 0 && site == 0) { + strList.add(""); + } else { + strList.add(StringUtils.substring(str, last, site)); + } + last = site; + } + StringBuffer sb = new StringBuffer(); + int ii = 0; + for (String st : strList) { + sb.append(st).append(numArr[ii]); + ii++; + } + if (last < len) { + sb.append(StringUtils.substring(str, last, str.length())); + } + return sb.toString(); + } + + protected Set getRandomIntArray(int upLimit, int size) { + Set tempSet = new TreeSet(); + if (upLimit <= size) { + for (int i = 0; i < upLimit; i++) { + tempSet.add(i); + } + } else { + int pollNum = 0; + while (tempSet.size() < size && pollNum < 25 * size) { + Integer temp = getRandomInt(upLimit) - 1; + if (temp < 0) { + temp = 0; + } + if (!tempSet.contains(temp)) { + tempSet.add(temp); + } + pollNum++; + } + return tempSet; + } + return tempSet; + } + + private Random r = new Random(); + + protected int getRandomInt(int upLimit) { + if (upLimit <= 0) { + return 0; + } else { + return r.nextInt(upLimit) + 1; + } + } + + /** + * 获得随机数字 + * + * @param size + * @return + */ + protected String getRandomIntStr(int size) { + Set ids = getRandomIntArray(9, size); + StringBuffer sb = new StringBuffer(); + for (Integer id : ids) { + sb.append(id); + } + return sb.toString(); + } +} diff --git a/src/main/java/com/rekoe/service/CdKeyCategoryService.java b/src/main/java/com/rekoe/service/CdKeyCategoryService.java new file mode 100644 index 0000000..4700fe9 --- /dev/null +++ b/src/main/java/com/rekoe/service/CdKeyCategoryService.java @@ -0,0 +1,81 @@ +package com.rekoe.service; + +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.lang3.math.NumberUtils; +import org.nutz.dao.Cnd; +import org.nutz.dao.pager.Pager; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; + +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.CdkeyCategory; + +@IocBean(fields = { "dao" }) +public class CdKeyCategoryService extends BaseService { + public List list() { + List list = query(null, null); + return list; + } + + public boolean insert(CdkeyCategory cdkeycategory) { + dao().insert(cdkeycategory); + return true; + } + + public CdkeyCategory fetchByID(String id) { + return dao().fetch(getEntityClass(), Cnd.where("id", "=", id)); + } + + public CdkeyCategory view(String id) { + return fetchByID(id); + } + + public void update(CdkeyCategory cdkeycategory) { + dao().update(cdkeycategory, "(name)$"); + } + + public boolean isNotExists(int type) { + return Lang.isEmpty(dao().fetch(getEntityClass(), Cnd.where("cdkeyType", "=", type))); + } + + protected int getPageNumber(Integer pageNumber) { + return Lang.isEmpty(pageNumber) ? 1 : pageNumber; + } + + public Pagination getCategoryListByPager(Integer pageNumber) { + int pageSize = 20; + pageNumber = getPageNumber(pageNumber); + Pager pager = dao().createPager(pageNumber, pageSize); + List list = dao().query(CdkeyCategory.class, null, pager); + pager.setRecordCount(dao().count(CdkeyCategory.class, null)); + return new Pagination(pageNumber, pageSize, pager.getRecordCount(), list); + } + + public boolean isExists(int type) { + return !isNotExists(type); + } + + private String getDigit(String text) { + StringBuffer sb = new StringBuffer(); + Pattern p = Pattern.compile("(\\d+)"); + Matcher m = p.matcher(text); + while (m.find()) { + String find = m.group(1); + sb.append(find); + } + return sb.toString(); + } + + public int getType(String cdk) { + return NumberUtils.toInt(getDigit(cdk), -1); + } + + public boolean isExists(String cdkey) { + int type = NumberUtils.toInt(getDigit(cdkey), -1); + return !isNotExists(type); + } + +} diff --git a/src/main/java/com/rekoe/service/CdKeyLogService.java b/src/main/java/com/rekoe/service/CdKeyLogService.java new file mode 100644 index 0000000..6521560 --- /dev/null +++ b/src/main/java/com/rekoe/service/CdKeyLogService.java @@ -0,0 +1,19 @@ +package com.rekoe.service; + +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.IocBean; + +import com.rekoe.domain.CdkeyLog; + +@IocBean(fields = { "dao" }) +public class CdKeyLogService extends BaseService { + + public CdKeyLogService() { + } + + public CdKeyLogService(Dao dao) { + super(dao); + } + + +} diff --git a/src/main/java/com/rekoe/service/CdKeyService.java b/src/main/java/com/rekoe/service/CdKeyService.java new file mode 100644 index 0000000..6ba833a --- /dev/null +++ b/src/main/java/com/rekoe/service/CdKeyService.java @@ -0,0 +1,197 @@ +package com.rekoe.service; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; + +import org.apache.commons.lang3.StringUtils; +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; +import org.nutz.dao.ConnCallback; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.entity.Record; +import org.nutz.dao.sql.Sql; +import org.nutz.dao.sql.SqlCallback; +import org.nutz.dao.util.Daos; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.lang.Times; +import org.nutz.log.Log; +import org.nutz.log.Logs; + +import com.rekoe.domain.CdkeyCategory; +import com.rekoe.domain.CdkeyEntity; +import com.rekoe.utils.StringGenerator; + +@IocBean(fields = { "dao" }, create = "init") +public class CdKeyService extends BaseService { + + private final static String CDKEY_SUFFIX = "cdkey_"; + + private final static Log log = Logs.get(); + private final Map CDKEY_PROCESS_STATUS_ON = new HashMap(); + private Object lock = new Object(); + + private ExecutorService executorService; + + public CdKeyService() { + } + + public CdKeyService(Dao dao) { + } + + public void init() { + executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); + /** + * 修复下表结构 + */ + Sql sql = Sqls.create("select cdkey_type from $table"); + sql.setEntity(dao().getEntity(CdkeyCategory.class)); + sql.vars().set("table", sql.getEntity().getTableName()); + final List typeList = new ArrayList<>(); + sql.setCallback(new SqlCallback() { + + @Override + public Object invoke(Connection conn, ResultSet rs, Sql sql) throws SQLException { + while (rs.next()) { + typeList.add(rs.getInt(1)); + } + return null; + } + }); + dao().execute(sql); + for (int id : typeList) { + Daos.migration(dao(), CdkeyEntity.class, true, true, id); + } + } + + public boolean use(String cdkey, int taskid) { + Dao dao = Daos.ext(dao(), taskid); + return dao.update(CdkeyEntity.class, Chain.make("is_used", true), Cnd.where("cdkey", "=", cdkey).and("is_used", "=", false)) > 0; + } + + public boolean addCdkey(final String taskid, final int num, final int len) { + synchronized (lock) { + Boolean isRight = CDKEY_PROCESS_STATUS_ON.get(taskid); + if (Lang.isEmpty(isRight) || !isRight) { + CDKEY_PROCESS_STATUS_ON.put(taskid, true); + executorService.execute(new Runnable() { + @Override + public void run() { + try { + Date now = Times.now(); + List linkd = new ArrayList(); + Dao dao = Daos.ext(dao(), taskid); + boolean exists = dao.exists(CdkeyEntity.class); + Set temp = new HashSet<>(); + Set set = new HashSet(); + if (!exists) { + dao.create(CdkeyEntity.class, false); + } else { + Sql sql = Sqls.create("select cdkey from $table"); + sql.setEntity(dao.getEntity(CdkeyEntity.class)); + sql.vars().set("table", sql.getEntity().getTableName() + taskid); + sql.setCallback(Sqls.callback.strList()); + dao.execute(sql); + List list = sql.getList(String.class); + linkd.addAll(list); + for (String str : list) { + temp.add(str.toLowerCase()); + } + } + int count = 0; + int safeCount = 0; + BlockingQueue queue = new LinkedBlockingQueue(); + StringGenerator sg = new StringGenerator(len, len); + while (true) { + String key = sg.next(); + String newStrKey = getRandomStr(key, taskid); + if (temp.contains(newStrKey.toLowerCase())) { + safeCount++; + continue; + } + count++; + if (count > num) { + break; + } + if (safeCount > 10000) { + break; + } + set.add(newStrKey); + } + for (String $key : set) { + queue.add(new CdkeyEntity($key, now)); + linkd.add($key); + } + List list = new ArrayList<>(); + while (true) { + if (queue.size() >= 100) { + queue.drainTo(list, 100); + dao.fastInsert(list); + list.clear(); + } else if (queue.size() != 0) { + queue.drainTo(list, 50); + dao.fastInsert(list); + list.clear(); + } else { + list.clear(); + break; + } + } + } catch (Exception e) { + log.error(e); + } + CDKEY_PROCESS_STATUS_ON.put(taskid, false); + } + }); + return true; + } + return false; + } + } + + public List cdkTables() { + final List tables = new ArrayList(); + dao().run(new ConnCallback() { + @Override + public void invoke(java.sql.Connection conn) throws Exception { + String showTables = "show tables"; + java.sql.PreparedStatement ppstat = conn.prepareStatement(showTables); + ResultSet rest = ppstat.executeQuery(); + while (rest.next()) { + String table = rest.getString(1); + if (StringUtils.contains(table, CDKEY_SUFFIX)) { + if (!StringUtils.containsOnly(table, CDKEY_SUFFIX)) { + tables.add(table); + } + } + } + } + }); + return tables; + } + + public List searchDown(int taskid, boolean used) { + Dao dao = Daos.ext(dao(), taskid); + Sql sql = Sqls.create("select * from $table $condition"); + sql.setEntity(dao.getEntity(CdkeyEntity.class)); + sql.vars().set("table", sql.getEntity().getTableName() + taskid); + sql.setCondition(used ? Cnd.where("used", "=", true) : null); + sql.setCallback(Sqls.callback.records()); + dao.execute(sql); + return sql.getList(Record.class); + } + +} diff --git a/src/main/java/com/rekoe/service/EmailService.java b/src/main/java/com/rekoe/service/EmailService.java new file mode 100644 index 0000000..a271a2c --- /dev/null +++ b/src/main/java/com/rekoe/service/EmailService.java @@ -0,0 +1,7 @@ +package com.rekoe.service; + +public interface EmailService { + + boolean send(String to, String subject, String html); + +} diff --git a/src/main/java/com/rekoe/service/EmailServiceImpl.java b/src/main/java/com/rekoe/service/EmailServiceImpl.java new file mode 100644 index 0000000..2470763 --- /dev/null +++ b/src/main/java/com/rekoe/service/EmailServiceImpl.java @@ -0,0 +1,31 @@ +package com.rekoe.service; + +import org.apache.commons.mail.HtmlEmail; +import org.nutz.ioc.Ioc; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.log.Log; +import org.nutz.log.Logs; + +@IocBean(name="emailService") +public class EmailServiceImpl implements EmailService { + + private static final Log log = Logs.get(); + + @Inject("refer:$ioc") + protected Ioc ioc; + + public boolean send(String to, String subject, String html) { + try { + HtmlEmail email = ioc.get(HtmlEmail.class); + email.setSubject(subject); + email.setHtmlMsg(html); + email.addTo(to); + email.send(); + return true; + } catch (Throwable e) { + log.info("send email fail", e); + return false; + } + } +} diff --git a/src/main/java/com/rekoe/service/GameServerService.java b/src/main/java/com/rekoe/service/GameServerService.java new file mode 100644 index 0000000..c476b16 --- /dev/null +++ b/src/main/java/com/rekoe/service/GameServerService.java @@ -0,0 +1,179 @@ +package com.rekoe.service; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import net.sf.ehcache.util.concurrent.ConcurrentHashMap; + +import org.nutz.aop.interceptor.async.Async; +import org.nutz.dao.Cnd; +import org.nutz.dao.Condition; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.dao.sql.SqlCallback; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.lang.util.NutMap; +import org.nutz.log.Log; +import org.nutz.log.Logs; + +import com.cloopen.rest.sdk.CCPRestSDK; +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.GameServer; +import com.rekoe.domain.OAuthUser; + +@IocBean(args = { "refer:dao" }) +public class GameServerService extends BaseService { + + private final static Log log = Logs.get(); + + private ConcurrentHashMap ccpSDKMaps = new ConcurrentHashMap(5); + + public GameServerService() { + super(); + } + + @Async + public boolean sendPhoneMail(GameServer server, OAuthUser user, String templateId, String... str) { + boolean isRight = sendPhoneMail(server, user.getPhoneCode() + "", templateId, str); + return isRight; + } + + public boolean sendPhoneMail(GameServer server, String phone, String templateId, String ...str) { + int pid = server.getPid(); + CCPRestSDK temp = ccpSDKMaps.get(pid); + if (Lang.isEmpty(temp)) { + NutMap config = server.getMobileAuth(); + String accountSid = config.getString("accountSid",""); + String accountToken = config.getString("accountToken",""); + String AppId = config.getString("AppId"); + String serverIP = config.getString("serverIP"); + String serverPort = config.getString("serverPort"); + CCPRestSDK restAPI = new CCPRestSDK(); + restAPI.init(serverIP, serverPort); + restAPI.setAccount(accountSid, accountToken); + restAPI.setAppId(AppId); + ccpSDKMaps.putIfAbsent(pid, restAPI); + } + CCPRestSDK restAPI = ccpSDKMaps.get(pid); + if (!Lang.isEmpty(restAPI) && server.isUseMobileAuth()) { + //Map result = restAPI.sendTemplateSMS("13691366833", "29337", new String[]{"91366","30"}); + Map result = restAPI.sendTemplateSMS(phone, templateId, str); + if (log.isDebugEnabled()) { + log.debug(result); + } + String res = result.get("statusCode").toString(); + boolean isRight = "000000".equalsIgnoreCase(res); + return isRight; + } + return false; + } + + public static void main(String[] args) { + String accountSid = "aaf98f894ecd7d6a014ed7b7ccd30fbb"; + String accountToken = "9951c6eacb424918a36e2c6d4185c491"; + String AppId = "aaf98f894ecd7d6a014ed7bb0e8d0fce"; + String serverIP = "app.cloopen.com"; + String serverPort = "8883"; + CCPRestSDK restAPI = new CCPRestSDK(); + restAPI.init(serverIP, serverPort); + restAPI.setAccount(accountSid, accountToken); + restAPI.setAppId(AppId); + //Map result = restAPI.sendTemplateSMS("13810275348", "29337", new String[]{"91366","30"}); + Map result = restAPI.sendTemplateSMS("13691366833", "29337", new String[]{"91366","30"}); + System.out.println(result); + } + public GameServerService(Dao dao) { + super(dao); + } + + public List list(Condition cdn) { + List list = query(cdn, null); + return list; + } + + public void update(GameServer server) { + if (server.getItems() == null) { + server.setItems(new ArrayList()); + } + if (server.isUseMobileAuth()) { + NutMap config = server.getMobileAuth(); + String accountSid = config.getString("accountSid"); + String accountToken = config.getString("accountToken"); + String AppId = config.getString("AppId"); + String serverIP = config.getString("serverIP"); + String serverPort = config.getString("serverPort"); + CCPRestSDK restAPI = new CCPRestSDK(); + restAPI.init(serverIP, serverPort); + // restAPI.init("app.cloopen.com", "8883"); + restAPI.setAccount(accountSid, accountToken); + restAPI.setAppId(AppId); + ccpSDKMaps.putIfAbsent(server.getPid(), restAPI); + } + dao().update(server, "(platformName|open|payUrl|loginUrl|version|verify|blackOpen|blackList|clientSecret|authType|mobileAuth)$"); + } + + public boolean insert(GameServer server) { + return super.insert(server); + } + + /** + * 获得所有的服务器ID + */ + public List getAllIds() { + Dao dao = dao(); + Sql sql = Sqls.create("select id from system_server $condition"); + sql.setCondition(Cnd.where("is_open", "=", true)); + sql.setCallback(new SqlCallback() { + @Override + public Object invoke(Connection conn, ResultSet rs, Sql sql) throws SQLException { + List results = new ArrayList(); + while (rs.next()) { + results.add(rs.getInt(1)); + } + return results; + } + }); + dao.execute(sql); + return sql.getList(Integer.class); + } + + public GameServer getServer(int serverid) { + GameServer server = dao().fetch(GameServer.class, Cnd.where("id", "=", serverid)); + return server; + } + + public Pagination getObjectListByPager(Integer pageNumber, int pageSize) { + return getObjListByPager(dao(), pageNumber, pageSize, null); + } + + public List loadAll() { + List gss = dao().query(getEntityClass(), Cnd.where("is_open", "=", true)); + return gss; + } + + public List loadAllByIds(Integer[] serverIds) { + List gss = dao().query(getEntityClass(), Cnd.where("id", "iN", serverIds)); + return gss; + } + + public boolean canAdd(int pid) { + return Lang.isEmpty(dao().fetch(getEntityClass(), Cnd.where("pid", "=", pid))); + } + + public GameServer getByPid(int pid) { + GameServer server = dao().fetch(getEntityClass(), Cnd.where("pid", "=", pid)); + return server; + } + + public List list() { + List gss = dao().query(getEntityClass(), null); + return gss; + } + +} diff --git a/src/main/java/com/rekoe/service/IdWorkerService.java b/src/main/java/com/rekoe/service/IdWorkerService.java new file mode 100644 index 0000000..8ca3e95 --- /dev/null +++ b/src/main/java/com/rekoe/service/IdWorkerService.java @@ -0,0 +1,114 @@ +/** Copyright 2010-2012 Twitter, Inc.*/ +package com.rekoe.service; + +import org.nutz.ioc.loader.annotation.IocBean; + +/** + * An object that generates IDs. This is broken into a separate class in case we + * ever want to support multiple worker threads per process + * + * @author yumin + */ +@IocBean(name = "idFactory") +public class IdWorkerService { + + private final long twepoch = 1288834974657L; + private final long workerIdBits = 10L; + private final long datacenterIdBits = 5L; + private final long maxWorkerId = -1L ^ (-1L << workerIdBits); + private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + private final long sequenceBits = 12L; + private final long workerIdShift = sequenceBits; + private final long datacenterIdShift = sequenceBits + workerIdBits; + private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + private final long sequenceMask = -1L ^ (-1L << sequenceBits); + + private long lastTimestamp = -1L; + private long workerId = 0; + private long datacenterId = 0; + private long sequence = 0L; + + public IdWorkerService() { + long workerId = 1L; + long datacenterId = 5; + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("workerId can't be greater than %d or less than 0.", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenterId can't be greater than %d or less than 0.", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + public IdWorkerService(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("workerId can't be greater than %d or less than 0.", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenterId can't be greater than %d or less than 0.", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } + + public long getId() { + long id = nextId(); + return id; + } + + public long getWorkerId() { + return workerId; + } + + public long getDatacenterId() { + return datacenterId; + } + + public long getTimestamp() { + return System.currentTimeMillis(); + } + + public synchronized long nextId() { + long id = 0L; + long timestamp = timeGen(); + if (timestamp < lastTimestamp) { + throw new RuntimeException(String.format("clock moved backwards. refusing to generate id for %d milliseconds.", lastTimestamp - timestamp)); + } + if (timestamp == lastTimestamp) { + sequence = (1 + sequence) & sequenceMask; + if (0 == sequence) { + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0; + } + lastTimestamp = timestamp; + id = ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift) | (workerId << workerIdShift) | sequence; + return id; + } + + protected long tilNextMillis(long lastTimestamp) { + long timestamp = timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = timeGen(); + } + return timestamp; + } + + protected long timeGen() { + return System.currentTimeMillis(); + } + + private static final long workerMask = 4190208; + private static final long datacenterMask = 130023424; + + public static void main(String args[]) { + long workerId = 1023L; + long datacenterId = 5; + IdWorkerService worker = new IdWorkerService(workerId, datacenterId); + long id = worker.nextId(); + System.out.println((id & workerMask) >> 12); + System.out.println((id & datacenterMask) >> 22); + } +} diff --git a/src/main/java/com/rekoe/service/NoticeService.java b/src/main/java/com/rekoe/service/NoticeService.java new file mode 100644 index 0000000..4d6d37c --- /dev/null +++ b/src/main/java/com/rekoe/service/NoticeService.java @@ -0,0 +1,56 @@ +package com.rekoe.service; + +import java.util.List; + +import org.nutz.dao.Cnd; +import org.nutz.dao.Condition; +import org.nutz.dao.Dao; +import org.nutz.dao.FieldFilter; +import org.nutz.dao.pager.Pager; +import org.nutz.dao.util.Daos; +import org.nutz.ioc.loader.annotation.IocBean; + +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.Notice; + +/** + * @author 科技㊣²º¹³
+ * 2014年2月3日 下午4:48:45
+ * http://www.rekoe.com
+ * QQ:5382211 + */ +@IocBean(fields = { "dao" }) +public class NoticeService extends BaseService { + public NoticeService() { + super(); + } + + public NoticeService(Dao dao) { + super(dao); + } + + public List list() { + return query(null, null); + } + + public List getIndexNewList(int limit, String desc) { + return getListByCnd(Cnd.NEW().limit(1, limit).desc(desc)); + } + + public List getListByCnd(Condition cnd) { + return dao().query(getEntityClass(), cnd); + } + + public void update(final Notice art) { + Daos.ext(dao(), FieldFilter.create(Notice.class, null, "^(createDate)$", true)).update(art); + } + + public Pagination getObjListByPager(int pageNumber, String keyWorld) { + Pager pager = dao().createPager(pageNumber, 10); + Cnd cnd = Cnd.where("title", "like", "%" + keyWorld + "%"); + List list = dao().query(getEntityClass(), cnd, pager); + pager.setRecordCount(dao().count(getEntityClass(), cnd)); + Pagination pagination = new Pagination(pageNumber, 10, pager.getRecordCount(), list); + return pagination; + } +} diff --git a/src/main/java/com/rekoe/service/OAuthClientService.java b/src/main/java/com/rekoe/service/OAuthClientService.java new file mode 100644 index 0000000..2536cab --- /dev/null +++ b/src/main/java/com/rekoe/service/OAuthClientService.java @@ -0,0 +1,27 @@ +package com.rekoe.service; + +import java.util.List; + +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.OAuthClient; + +public interface OAuthClientService { + + public OAuthClient createClient(OAuthClient client); + + public OAuthClient updateClient(OAuthClient client); + + public void deleteClient(Long clientId); + + public OAuthClient findOne(Long clientId); + + public List findAll(); + + public OAuthClient findByClientId(String clientId); + + public OAuthClient findByClientSecret(String clientSecret); + + public Pagination getListPager(int pageNumber); + + public boolean check(String name); +} diff --git a/src/main/java/com/rekoe/service/OAuthService.java b/src/main/java/com/rekoe/service/OAuthService.java new file mode 100644 index 0000000..43b66d8 --- /dev/null +++ b/src/main/java/com/rekoe/service/OAuthService.java @@ -0,0 +1,28 @@ +package com.rekoe.service; + +public interface OAuthService { + + //添加 auth code + public void addAuthCode(String authCode, String username); + //添加 access token + public void addAccessToken(String accessToken, String username); + + //验证auth code是否有效 + boolean checkAuthCode(String authCode); + //验证access token是否有效 + boolean checkAccessToken(String accessToken); + + String getUsernameByAuthCode(String authCode); + String getUsernameByAccessToken(String accessToken); + + + //auth code / access token 过期时间 + long getExpireIn(); + + + public boolean checkClientId(String clientId); + + public boolean checkClientSecret(String clientSecret); + + +} diff --git a/src/main/java/com/rekoe/service/OAuthServiceImpl.java b/src/main/java/com/rekoe/service/OAuthServiceImpl.java new file mode 100644 index 0000000..b3d2feb --- /dev/null +++ b/src/main/java/com/rekoe/service/OAuthServiceImpl.java @@ -0,0 +1,59 @@ +package com.rekoe.service; + +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.repo.cache.simple.LRUCache; + +@IocBean(name = "oAuthService") +public class OAuthServiceImpl implements OAuthService { + + private LRUCache cache = new LRUCache(1024); + + @Inject + private OAuthClientService oAuthClientService; + + @Override + public void addAuthCode(String authCode, String username) { + cache.put(authCode, username); + } + + @Override + public void addAccessToken(String accessToken, String username) { + cache.put(accessToken, username); + } + + @Override + public String getUsernameByAuthCode(String authCode) { + return cache.get(authCode); + } + + @Override + public String getUsernameByAccessToken(String accessToken) { + return cache.get(accessToken); + } + + @Override + public boolean checkAuthCode(String authCode) { + return cache.get(authCode) != null; + } + + @Override + public boolean checkAccessToken(String accessToken) { + return cache.get(accessToken) != null; + } + + @Override + public boolean checkClientId(String clientId) { + return oAuthClientService.findByClientId(clientId) != null; + } + + @Override + public boolean checkClientSecret(String clientSecret) { + return oAuthClientService.findByClientSecret(clientSecret) != null; + } + + @Override + public long getExpireIn() { + return 3600L; + } +} diff --git a/src/main/java/com/rekoe/service/OAuthUserService.java b/src/main/java/com/rekoe/service/OAuthUserService.java new file mode 100644 index 0000000..e1fae0a --- /dev/null +++ b/src/main/java/com/rekoe/service/OAuthUserService.java @@ -0,0 +1,61 @@ +package com.rekoe.service; + +import java.util.List; + +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.OAuthUser; + +public interface OAuthUserService { + /** + * 创建用户 + * + * @param user + */ + public OAuthUser createUser(OAuthUser user); + public OAuthUser createUser(OAuthUser user, long userid); + public OAuthUser updateUser(OAuthUser user); + + public boolean updateByChain(String name, String pwd); + + public void deleteUser(String userId); + + /** + * 修改密码 + * + * @param userId + * @param newPassword + */ + public void changePassword(String userId, String newPassword); + + OAuthUser findOne(long userId); + + List findAll(); + + /** + * 根据用户名查找用户 + * + * @param username + * @return + */ + public OAuthUser findByUsername(String username); + + /** + * 验证登录 + * + * @param username + * 用户名 + * @param password + * 密码 + * @param salt + * 盐 + * @param encryptpwd + * 加密后的密码 + * @return + */ + boolean checkUser(String username, String password, String salt, String encryptpwd); + + public boolean checkRestPwd(String name, long phone); + + public Pagination getListPager(int pageNumber); + public String getRandomCode(); +} diff --git a/src/main/java/com/rekoe/service/OAuthUserServiceImpl.java b/src/main/java/com/rekoe/service/OAuthUserServiceImpl.java new file mode 100644 index 0000000..68fba24 --- /dev/null +++ b/src/main/java/com/rekoe/service/OAuthUserServiceImpl.java @@ -0,0 +1,120 @@ +package com.rekoe.service; + +import java.util.List; + +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; + +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.OAuthUser; + +@IocBean(name = "oAuthUserService", fields = { "dao" }) +public class OAuthUserServiceImpl extends BaseService implements OAuthUserService { + + @Inject + private PasswordHelper passwordHelper; + + @Inject + private IdWorkerService idFactory; + + /** + * 创建用户 + * + * @param user + */ + public OAuthUser createUser(OAuthUser user) { + return createUser(user, idFactory.nextId()); + } + + public OAuthUser createUser(OAuthUser user, long userid) { + passwordHelper.encryptPassword(user); + user.setUserId(userid); + return dao().insert(user); + } + + @Override + public OAuthUser updateUser(OAuthUser user) { + dao().update(user); + return user; + } + + @Override + public void deleteUser(String userId) { + dao().delete(getEntityClass(), userId); + } + + /** + * 修改密码 + * + * @param userId + * @param newPassword + */ + public void changePassword(String userId, String newPassword) { + OAuthUser user = dao().fetch(getEntityClass(), userId); + user.setPassword(newPassword); + passwordHelper.encryptPassword(user); + updateUser(user); + } + + @Override + public OAuthUser findOne(long userId) { + return dao().fetch(getEntityClass(), Cnd.where("userId", "=", userId)); + } + + @Override + public List findAll() { + return dao().query(getEntityClass(), null); + } + + /** + * 根据用户名查找用户 + * + * @param username + * @return + */ + public OAuthUser findByUsername(String username) { + return dao().fetch(getEntityClass(), Cnd.where("userName", "=", username)); + } + + /** + * 验证登录 + * + * @param username + * 用户名 + * @param password + * 密码 + * @param salt + * 盐 + * @param encryptpwd + * 加密后的密码 + * @return + */ + public boolean checkUser(String username, String password, String salt, String encryptpwd) { + String pwd = passwordHelper.encryptPassword(username, password, salt); + return pwd.equals(encryptpwd); + } + + @Override + public boolean checkRestPwd(String name, long phoneCode) { + return !Lang.isEmpty(dao().fetch(getEntityClass(), Cnd.where("userName", "=", name).and("phoneCode", "=", phoneCode))); + } + + @Override + public boolean updateByChain(String name, String pwd) { + String salt = passwordHelper.buildSalt(); + String passpord = passwordHelper.encryptPassword(name, pwd, salt); + dao().update(getEntityClass(), Chain.make("password", passpord).add("salt", salt), Cnd.where("userName", "=", name)); + return true; + } + + public Pagination getListPager(int pageNumber) { + return getObjListByPager(pageNumber, DEFAULT_PAGE_NUMBER, null); + } + + public String getRandomCode() { + return getRandomIntStr(6); + } +} diff --git a/src/main/java/com/rekoe/service/OauthClientServiceImpl.java b/src/main/java/com/rekoe/service/OauthClientServiceImpl.java new file mode 100644 index 0000000..c1fb053 --- /dev/null +++ b/src/main/java/com/rekoe/service/OauthClientServiceImpl.java @@ -0,0 +1,62 @@ +package com.rekoe.service; + +import java.util.List; + +import org.nutz.dao.Cnd; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.lang.random.R; + +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.OAuthClient; + +@IocBean(name = "oAuthClientService", fields = { "dao" }) +public class OauthClientServiceImpl extends BaseService implements OAuthClientService { + + @Override + public OAuthClient createClient(OAuthClient client) { + client.setClientId(R.UU32()); + client.setClientSecret(R.UU32()); + return dao().insert(client); + } + + @Override + public OAuthClient updateClient(OAuthClient client) { + dao().update(client, "^(clientId|clientSecret)$"); + return client; + } + + @Override + public void deleteClient(Long clientId) { + dao().delete(getEntityClass(), clientId); + } + + @Override + public OAuthClient findOne(Long id) { + return dao().fetch(getEntityClass(), id); + } + + @Override + public List findAll() { + return dao().query(getEntityClass(), null); + } + + @Override + public OAuthClient findByClientId(String clientId) { + return dao().fetch(getEntityClass(), Cnd.where("clientId", "=", clientId)); + } + + @Override + public OAuthClient findByClientSecret(String clientSecret) { + return dao().fetch(getEntityClass(), Cnd.where("clientSecret", "=", clientSecret)); + } + + public Pagination getListPager(int pageNumber) { + return getObjListByPager(pageNumber, DEFAULT_PAGE_NUMBER, null); + } + + @Override + public boolean check(String name) { + return Lang.isEmpty(dao().fetch(getEntityClass(), Cnd.where("clientName", "=", name))); + } +} diff --git a/src/main/java/com/rekoe/service/OfficialServerService.java b/src/main/java/com/rekoe/service/OfficialServerService.java new file mode 100644 index 0000000..588d3e4 --- /dev/null +++ b/src/main/java/com/rekoe/service/OfficialServerService.java @@ -0,0 +1,84 @@ +package com.rekoe.service; + +import java.util.List; + +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.IocBean; + +import com.rekoe.domain.OfficialServer; + +/** + * 服务器列表 + * + * @author kouxian + * + */ +@IocBean(args = { "refer:dao" }) +public class OfficialServerService extends BaseService { + + /** + * 推荐 + */ + public static final short SERVER_TYPE_STATUS_RECOMMEND = 1; + + /** + * 正常 + */ + public static final short SERVER_TYPE_STATUS_NORMAL = 2; + + /** + * 拥挤 繁忙 + */ + public static final short SERVER_TYPE_STATUS_BUSY = 3; + + /** + * 关闭 + */ + + public static final short SERVER_TYPE_STATUS_CLOSE = 4; + + public OfficialServerService(Dao dao) { + super(dao); + } + + public void update(OfficialServer v) { + if (v.getStatus() == SERVER_TYPE_STATUS_RECOMMEND) { + dao().update(getEntityClass(), Chain.make("status", SERVER_TYPE_STATUS_NORMAL), Cnd.where("status", "=", SERVER_TYPE_STATUS_RECOMMEND).and("pid", "=", v.getPid())); + } + dao().update(v, "(sid|url|name|status|open|openWhiteList)$"); + } + + /** + * 如果添加的服务器为推荐服务器 那需要把原来的推荐服务器设置为默认开启状态 "0":"关闭","1":"推荐","2":"拥挤","3":"正常" + */ + public boolean insert(OfficialServer offic) { + if (offic.getStatus() == SERVER_TYPE_STATUS_RECOMMEND) { + dao().update(getEntityClass(), Chain.make("status", SERVER_TYPE_STATUS_NORMAL), Cnd.where("status", "=", SERVER_TYPE_STATUS_RECOMMEND).and("pid", "=", offic.getPid()).and("status", "<>", SERVER_TYPE_STATUS_CLOSE)); + } + return super.insert(offic); + } + + public List getList(int pid) { + return dao().query(getEntityClass(), Cnd.where("pid", "=", pid)); + } + + public List getShowList(int pid) { + return dao().query(getEntityClass(), Cnd.where("pid", "=", pid).and("status", "<>", SERVER_TYPE_STATUS_CLOSE)); + } + + /** + * 获得推荐服务器 + * + * @param pid + * @return + */ + public OfficialServer getRecommendServer(int pid) { + return dao().fetch(getEntityClass(), Cnd.where("pid", "=", pid).and("status", "=", SERVER_TYPE_STATUS_RECOMMEND)); + } + + public OfficialServer getOfficialServer(int pid, int sid) { + return dao().fetch(getEntityClass(), Cnd.where("pid", "=", pid).and("sid", "=", sid)); + } +} diff --git a/src/main/java/com/rekoe/service/PasswordHelper.java b/src/main/java/com/rekoe/service/PasswordHelper.java new file mode 100644 index 0000000..f3297c5 --- /dev/null +++ b/src/main/java/com/rekoe/service/PasswordHelper.java @@ -0,0 +1,51 @@ +package com.rekoe.service; + +import org.apache.shiro.crypto.RandomNumberGenerator; +import org.apache.shiro.crypto.SecureRandomNumberGenerator; +import org.apache.shiro.crypto.hash.SimpleHash; +import org.apache.shiro.util.ByteSource; +import org.nutz.ioc.loader.annotation.IocBean; + +import com.rekoe.domain.OAuthUser; + +@IocBean +public class PasswordHelper { + + private RandomNumberGenerator randomNumberGenerator = new SecureRandomNumberGenerator(); + + private String algorithmName = "md5"; + private int hashIterations = 2; + + public void setRandomNumberGenerator(RandomNumberGenerator randomNumberGenerator) { + this.randomNumberGenerator = randomNumberGenerator; + } + + public void setAlgorithmName(String algorithmName) { + this.algorithmName = algorithmName; + } + + public void setHashIterations(int hashIterations) { + this.hashIterations = hashIterations; + } + + public void encryptPassword(OAuthUser user) { + user.setSalt(buildSalt()); + user.setPassword(encryptPassword(user.getUserName(), user.getPassword(), user.getSalt())); + } + + /** + * 根据用户名和盐值加密 + * + * @param username + * @param password + * @param salt + */ + public String encryptPassword(String username, String password, String salt) { + String pwd = new SimpleHash(algorithmName, password, ByteSource.Util.bytes(salt), hashIterations).toHex(); + return pwd; + } + + public String buildSalt() { + return randomNumberGenerator.nextBytes().toHex(); + } +} diff --git a/src/main/java/com/rekoe/service/PayFefundService.java b/src/main/java/com/rekoe/service/PayFefundService.java new file mode 100644 index 0000000..2a2734a --- /dev/null +++ b/src/main/java/com/rekoe/service/PayFefundService.java @@ -0,0 +1,247 @@ +package com.rekoe.service; + +import java.io.File; +import java.io.FileInputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +import javax.mail.internet.AddressException; +import javax.mail.internet.InternetAddress; + +import org.apache.commons.mail.EmailException; +import org.apache.commons.mail.HtmlEmail; +import org.brickred.socialauth.SocialAuthConfig; +import org.brickred.socialauth.util.OAuthConfig; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.pager.Pager; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.json.JsonFormat; +import org.nutz.lang.Files; +import org.nutz.lang.Lang; +import org.nutz.lang.Times; +import org.nutz.lang.stream.NullInputStream; +import org.nutz.log.Log; +import org.nutz.log.Logs; + +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.PayRefund; +import com.rekoe.module.facebook.FaceBookLoginAct; +import com.rekoe.module.facebook.pay.Entry; +import com.rekoe.module.facebook.pay.FacebookRequestResult; +import com.rekoe.module.facebook.pay.Order; +import com.rekoe.module.facebook.pay.PayObject; +import com.restfb.DefaultFacebookClient; +import com.restfb.FacebookClient; +import com.restfb.Parameter; +import com.restfb.batch.BatchRequest; +import com.restfb.batch.BatchRequest.BatchRequestBuilder; +import com.restfb.batch.BatchResponse; + +import freemarker.template.Configuration; +import freemarker.template.Template; + +@IocBean(fields = { "dao" }, create = "init", depose = "depose") +public class PayFefundService extends BaseService { + + private static final Log log = Logs.get(); + protected ExecutorService es; + protected FacebookClient facebookClient; + + private SocialAuthConfig config; + + public void init() throws Exception { + + SocialAuthConfig config = new SocialAuthConfig(); + File devConfig = Files.findFile("oauth_consumer.properties_dev"); // 开发期所使用的配置文件 + if (devConfig == null) + devConfig = Files.findFile("oauth_consumer.properties"); // 真实环境所使用的配置文件 + if (devConfig == null) + config.load(new NullInputStream()); + else + config.load(new FileInputStream(devConfig)); + this.config = config; + try { + OAuthConfig oAuthConfig = config.getProviderConfig(FaceBookLoginAct.OAUTH_ID); + facebookClient = new DefaultFacebookClient(oAuthConfig.get_consumerKey() + "|" + oAuthConfig.get_consumerSecret()); + } catch (Exception e) { + log.error(e); + } + es = Executors.newFixedThreadPool(16); + } + + public SocialAuthConfig getConfig() { + return config; + } + + public void depose() { + es.shutdown(); + try { + es.awaitTermination(30, TimeUnit.SECONDS); + } catch (InterruptedException e) { + log.info("PayFefundService shutdown", e); + } + es = null; + } + + public PayFefundService() { + super(); + } + + public PayFefundService(Dao dao) { + super(dao); + } + + public boolean insert(PayRefund payRefund) { + dao().insert(payRefund); + return true; + } + + public void update(PayRefund payRefund) { + dao().update(payRefund); + } + + public String facebookFetch(String id) { + return facebookClient.fetchObject(id, String.class); + } + + public PayRefund fetchByID(String paymentid) { + PayRefund payRefund = fetch(Cnd.where("paymentid", "=", paymentid)); + return payRefund; + } + + public PayRefund fetchByKeyId(String appid) { + PayRefund payRefund = fetch(Cnd.where("id", "=", appid)); + return payRefund; + } + + public FacebookClient getFacebookClient() { + return facebookClient; + } + + public void push(final PayObject pay) { + ExecutorService es = this.es; + if (es == null || es.isShutdown()) { + log.info("PayFefundService.queue is shutdown, ignore push"); + return; + } + if (!Lang.isEmpty(pay)) { + es.execute(new Runnable() { + @Override + public void run() { + List entryList = pay.getEntryList(); + for (Entry entry : entryList) { + String id = entry.getId(); + PayRefund payRefund = new PayRefund(); + payRefund.setCreateTime(Times.now()); + payRefund.setPaymentid(id); + payRefund.setChangedFields(Json.toJson(entry.getChangedFields(), JsonFormat.compact())); + boolean isRight = entry.getChangedFields().contains("disputes"); + String http = facebookFetch(id); + Order order = Json.fromJson(Order.class, http); + if (!Lang.isEmpty(order) && isRight) { + payRefund.setName(order.getUser().getName()); + payRefund.setPassportid(order.getUser().getId()); + payRefund.setRequestId(order.getRequestID()); + payRefund.setStatus(!isRight); + insert(payRefund); + } + } + + } + }); + } + } + + @Inject + private Configuration configuration; + + public void sendOrderEmail(final Order order) { + es.execute(new Runnable() { + @Override + public void run() { + try { + Map root = new HashMap(); + root.put("obj", order); + root.put("base", "/"); + String str = processTemplateIntoString(configuration, "/template/admin/pay_refund/view.ftl", root); + HtmlEmail email = new HtmlEmail(); + email.setHostName("smtp.163.com");// 邮件服务器 + email.setSmtpPort(25); + email.setAuthentication("koukou890", "rekoenet");// smtp认证的用户名和密码 + List inter = new ArrayList(); + inter.add(new InternetAddress("koukou890@qq.com")); + email.setTo(inter); + email.setFrom("koukou890@163.com", "Hero-Defense");// 发信者 + email.setSubject("Order Disputes[Hero-Defense]");// 标题 + email.setCharset("UTF-8");// 编码格式 + // email.setMsg("这是一封用户发起Disputs的提醒邮件");// 内容 + email.setHtmlMsg(str); + email.send();// 发送 + } catch (AddressException | EmailException e) { + log.error(e.getMessage(), e); + } + } + }); + } + + public String processTemplateIntoString(Configuration cfg, String path, Map root) { + String result = null; + try { + Template template = cfg.getTemplate(path); + cfg.setDefaultEncoding("UTF-8"); + java.io.StringWriter writer = new java.io.StringWriter(); + template.process(root, writer); + result = writer.toString(); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return result; + } + + public Pagination getPayRefundListByPager(Integer pageNumber) { + pageNumber = getPageNumber(pageNumber); + Pager pager = dao().createPager(pageNumber, 20); + List list = dao().query(getEntityClass(), Cnd.orderBy().desc("createTime"), pager); + pager.setRecordCount(dao().count(getEntityClass(), null)); + return new Pagination(pageNumber, 20, pager.getRecordCount(), list); + } + + public static void main(String[] args) { + FacebookClient facebookClient = new DefaultFacebookClient("1440728696165353|3a4e87ac4f8ea6eb4d0bfcc266cd618c"); + BatchRequest postRequest = new BatchRequestBuilder("617649511680969" + "/dispute").method("POST").body(Parameter.with("reason", "GRANTED_REPLACEMENT_ITEM"), Parameter.with("currency", "USD"), Parameter.with("amount", 1.9)).build(); + List list = facebookClient.executeBatch(postRequest); + System.out.println(list); + BatchResponse res = list.get(0); + String result = res.getBody(); + System.out.println(result); + } + + public void publish(final List passportidList, final String message) { + es.execute(new Runnable() { + @Override + public void run() { + for (String uid : passportidList) + publish(uid, message); + } + }); + } + + public void publish(String passportid, String message) { + try { + FacebookRequestResult publishEventResponse = facebookClient.publish(passportid + "/notifications", FacebookRequestResult.class, Parameter.with("template", message)); + log.infof("Published event ID: %s", publishEventResponse.isSuccess()); + } catch (Exception e) { + // accountService.update(passportid, Chain.make("install", false), + // Cnd.where("passportid", "=", passportid)); + log.errorf("passportid[%s] ,msg [%s]", passportid, e.getMessage()); + } + } +} diff --git a/src/main/java/com/rekoe/service/PermissionCategoryService.java b/src/main/java/com/rekoe/service/PermissionCategoryService.java new file mode 100644 index 0000000..6910cb3 --- /dev/null +++ b/src/main/java/com/rekoe/service/PermissionCategoryService.java @@ -0,0 +1,71 @@ +package com.rekoe.service; + +import java.util.List; + +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.pager.Pager; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.service.IdEntityService; + +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.PermissionCategory; +/** + * @author 科技㊣²º¹³ + * 2014年2月3日 下午4:48:45 + * http://www.rekoe.com + * QQ:5382211 + */ +@IocBean(args = { "refer:dao" }) +public class PermissionCategoryService extends IdEntityService { + + public PermissionCategoryService() { + } + + public PermissionCategoryService(Dao dao) { + super(dao); + } + + public List list() { + List list = query(null, null); + for (PermissionCategory pc : list) { + dao().fetchLinks(pc, "permissions"); + } + return list; + } + + public void insert(PermissionCategory permission) { + dao().insert(permission); + } + + public PermissionCategory fetchByID(String id) { + return dao().fetch(getEntityClass(), Cnd.where("id", "=", id)); + } + + public PermissionCategory view(String id) { + return fetchByID(id); + } + + public void update(PermissionCategory permission) { + dao().update(permission); + } + + public void remove(String id) { + dao().execute(Sqls.createf("delete from permission_category where id = %s", id)); + } + + protected int getPageNumber(Integer pageNumber) { + return Lang.isEmpty(pageNumber) ? 1 : pageNumber; + } + + public Pagination getPermissionCategoryListByPager(Integer pageNumber) { + int pageSize = 20; + pageNumber = getPageNumber(pageNumber); + Pager pager = dao().createPager(pageNumber, pageSize); + List list = dao().query(PermissionCategory.class, null, pager); + pager.setRecordCount(dao().count(PermissionCategory.class, null)); + return new Pagination(pageNumber, pageSize, pager.getRecordCount(), list); + } +} diff --git a/src/main/java/com/rekoe/service/PermissionService.java b/src/main/java/com/rekoe/service/PermissionService.java new file mode 100644 index 0000000..dec66bd --- /dev/null +++ b/src/main/java/com/rekoe/service/PermissionService.java @@ -0,0 +1,75 @@ +package com.rekoe.service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.pager.Pager; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.service.IdEntityService; + +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.Permission; +/** + * @author 科技㊣²º¹³ + * 2014年2月3日 下午4:48:45 + * http://www.rekoe.com + * QQ:5382211 + */ +@IocBean(args = { "refer:dao" }) +public class PermissionService extends IdEntityService { + + public PermissionService() { + } + + public PermissionService(Dao dao) { + super(dao); + } + + public List list() { + return query(null, null); + } + + public Map map() { + Map map = new HashMap(); + List permissions = query(null, null); + for (Permission permission : permissions) { + map.put(permission.getId(), permission.getName()); + } + return map; + } + + public void insert(Permission permission) { + dao().insert(permission); + } + + public Permission view(Long id) { + return fetch(id); + } + + public void update(Permission permission) { + dao().update(permission); + } + + protected int getPageNumber(Integer pageNumber) { + return Lang.isEmpty(pageNumber) ? 1 : pageNumber; + } + + public Pagination getPermissionListByPager(Integer pageNumber) { + return getPermissionListByPager(pageNumber, null); + } + + public Pagination getPermissionListByPager(Integer pageNumber, String permissionCategoryId) { + int pageSize = 20; + pageNumber = getPageNumber(pageNumber); + Cnd cnd = Cnd.where("permissionCategoryId", "=", permissionCategoryId); + Pager pager = dao().createPager(pageNumber, pageSize); + List list = dao().query(Permission.class, StringUtils.isBlank(permissionCategoryId) ? null : cnd, pager); + pager.setRecordCount(dao().count(Permission.class, StringUtils.isBlank(permissionCategoryId) ? null : cnd)); + return new Pagination(pageNumber, pageSize, pager.getRecordCount(), list); + } +} diff --git a/src/main/java/com/rekoe/service/PlatformConfigService.java b/src/main/java/com/rekoe/service/PlatformConfigService.java new file mode 100644 index 0000000..3020825 --- /dev/null +++ b/src/main/java/com/rekoe/service/PlatformConfigService.java @@ -0,0 +1,40 @@ +package com.rekoe.service; + +import java.util.List; + +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.pager.Pager; +import org.nutz.ioc.loader.annotation.IocBean; + +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.PlatformConfig; + +/** + * @author 科技㊣²º¹³
+ * Mar 27, 2013 6:09:25 PM
+ * QQ:5382211 + */ +@IocBean(args = { "refer:dao" }) +public class PlatformConfigService extends BaseService { + + public PlatformConfigService(Dao dao) { + super(dao); + } + + public Pagination getListByPager(int pageNumber, int sid) { + Cnd cnd = Cnd.where("sid", "=", sid); + Pager pager = dao().createPager(pageNumber, 20); + List list = dao().query(getEntityClass(), cnd, pager); + pager.setRecordCount(dao().count(getEntityClass(), cnd)); + return new Pagination(pageNumber, 20, pager.getRecordCount(), list); + } + + public PlatformConfig getPlatformConfig(int sid, String provider) { + return dao().fetch(getEntityClass(), Cnd.where("sid", "=", sid).and("provider", "=", provider)); + } + + public void update(PlatformConfig conf) { + dao().update(conf,"^(config)$"); + } +} diff --git a/src/main/java/com/rekoe/service/PlatformProviderService.java b/src/main/java/com/rekoe/service/PlatformProviderService.java new file mode 100644 index 0000000..2f87020 --- /dev/null +++ b/src/main/java/com/rekoe/service/PlatformProviderService.java @@ -0,0 +1,41 @@ +package com.rekoe.service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.nutz.ioc.Ioc; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; +import org.nutz.resource.Scans; + +import com.rekoe.annotation.PlatformProvider; +import com.rekoe.mobile.AbstractParam; +import com.rekoe.mobile.provider.AbstractProvider; + +@IocBean +public class PlatformProviderService { + + private Map> providersMap = new HashMap<>(); + + @Inject("refer:$ioc") + private Ioc ioc; + + @SuppressWarnings("unchecked") + public void init() { + List> clazzList = Scans.me().scanPackage("com.rekoe.mobile.provider"); + for (Class clzz : clazzList) { + PlatformProvider platformProvider = clzz.getAnnotation(PlatformProvider.class); + if (Lang.isEmpty(platformProvider)) { + continue; + } + AbstractProvider provider = (AbstractProvider) ioc.get(clzz); + providersMap.put(platformProvider.name(), provider); + } + } + + public AbstractProvider getAbstractProvider(String key) { + return providersMap.get(key); + } +} diff --git a/src/main/java/com/rekoe/service/PlatformUserService.java b/src/main/java/com/rekoe/service/PlatformUserService.java new file mode 100644 index 0000000..bf7cd31 --- /dev/null +++ b/src/main/java/com/rekoe/service/PlatformUserService.java @@ -0,0 +1,43 @@ +package com.rekoe.service; + +import org.apache.commons.lang3.StringUtils; +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.IocBean; + +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.PlatformUser; + +@IocBean(args = { "refer:dao" }) +public class PlatformUserService extends BaseService { + + public PlatformUserService(Dao dao) { + super(dao); + } + + public PlatformUser getPlatformUser(int pid, String passportid, String pfid) { + PlatformUser user = dao().fetch(getEntityClass(), Cnd.where("pid", "=", pid).and("passportid", "=", passportid).and("pfid", "=", pfid)); + return user; + } + + public PlatformUser add(int pid, String passportid, long openid, String pfid, String addr) { + return dao().insert(new PlatformUser(pid, passportid, openid, pfid, addr)); + } + + public PlatformUser add(int pid, String passportid, long openid, String pfid) { + return dao().insert(new PlatformUser(pid, passportid, openid, pfid)); + } + + public Pagination getPlatformUserListPagerByPid(Integer pageNumber, int pageSize, String name) { + return getObjListByPager(pageNumber, pageSize, StringUtils.isBlank(name) ? Cnd.orderBy().desc("createTime") : Cnd.where("passportid", "=", name)); + } + + public Pagination getPlatformUserListPagerByOpenid(Integer pageNumber, int pageSize, long openid) { + return getObjListByPager(pageNumber, pageSize, openid == 0 ? Cnd.orderBy().desc("createTime") : Cnd.where("openid", "=", openid).desc("createTime")); + } + + public void lock(String id, boolean lock) { + dao().update(PlatformUser.class, Chain.make("locked", lock), Cnd.where("id", "=", id)); + } +} diff --git a/src/main/java/com/rekoe/service/QuartzService.java b/src/main/java/com/rekoe/service/QuartzService.java new file mode 100644 index 0000000..a5c74ef --- /dev/null +++ b/src/main/java/com/rekoe/service/QuartzService.java @@ -0,0 +1,51 @@ +package com.rekoe.service; + +import static org.quartz.CronScheduleBuilder.cronSchedule; +import static org.quartz.JobBuilder.newJob; +import static org.quartz.TriggerBuilder.newTrigger; + +import org.nutz.ioc.loader.annotation.IocBean; +import org.quartz.CronTrigger; +import org.quartz.Job; +import org.quartz.JobDetail; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.quartz.impl.StdSchedulerFactory; +/** + * @author 科技㊣²º¹³ + * 2014年2月3日 下午4:48:45 + * http://www.rekoe.com + * QQ:5382211 + */ +@IocBean(create = "init", depose = "depose") +public class QuartzService { + + private Scheduler scheduler; + + public void addTask(Class cls, String cron) throws SchedulerException { + String clsName = cls.getName(); + JobDetail job = newJob(cls).withIdentity(clsName + "Job", clsName + "Group").build(); + CronTrigger trigger = newTrigger().withIdentity(clsName + "Trigger", clsName + "Group").withSchedule(cronSchedule(cron)).build(); + this.scheduler.scheduleJob(job, trigger); + } + + public void init() throws SchedulerException { + this.scheduler = StdSchedulerFactory.getDefaultScheduler(); + this.scheduler.start(); + } + + public void depose() throws SchedulerException { + scheduler.shutdown(true); + } + + public JobDetail find(String name, String group) throws SchedulerException { + JobKey jobKey = new JobKey(name, group); + JobDetail jobDetail = scheduler.getJobDetail(jobKey); + return jobDetail; + } + + public boolean delete(String name, String group) throws SchedulerException { + return scheduler.deleteJob(new JobKey(name, group)); + } +} diff --git a/src/main/java/com/rekoe/service/ReportAdsService.java b/src/main/java/com/rekoe/service/ReportAdsService.java new file mode 100644 index 0000000..ebb322e --- /dev/null +++ b/src/main/java/com/rekoe/service/ReportAdsService.java @@ -0,0 +1,30 @@ +package com.rekoe.service; + +import java.util.List; + +import org.nutz.aop.interceptor.async.Async; +import org.nutz.dao.Cnd; +import org.nutz.dao.Sqls; +import org.nutz.dao.entity.Record; +import org.nutz.dao.sql.Sql; +import org.nutz.ioc.loader.annotation.IocBean; + +import com.rekoe.domain.ReportAds; + +@IocBean(fields = { "dao" }) +public class ReportAdsService extends BaseService { + + @Async + public void add(ReportAds reportAds) { + dao().insert(reportAds); + } + + public List getList(int pid) { + Sql sql = Sqls.create("select pfid,idfa,idfv,talking_data_id from $table $condition"); + sql.vars().set("table", dao().getEntity(getEntityClass()).getTableName()); + sql.setCallback(Sqls.callback.records()); + sql.setCondition(Cnd.where("pid", "=", pid)); + dao().execute(sql); + return sql.getList(Record.class); + } +} diff --git a/src/main/java/com/rekoe/service/RoleService.java b/src/main/java/com/rekoe/service/RoleService.java new file mode 100644 index 0000000..456d5e0 --- /dev/null +++ b/src/main/java/com/rekoe/service/RoleService.java @@ -0,0 +1,101 @@ +package com.rekoe.service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; + +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.Permission; +import com.rekoe.domain.Role; + +/** + * @author 科技㊣²º¹³ + * 2014年2月3日 下午4:48:45 + * http://www.rekoe.com + * QQ:5382211 + */ +@IocBean(args = { "refer:dao" }) +public class RoleService extends BaseService { + + public RoleService(Dao dao) { + super(dao); + } + + public List list() { + return query(null, null); + } + + public boolean insert(Role role) { + role = dao().insert(role); + dao().insertRelation(role, "permissions"); + return true; + } + + public void delete(Long id) { + dao().delete(Role.class, id); + dao().clear("system_role_permission", Cnd.where("roleid", "=", id)); + dao().clear("system_user_role", Cnd.where("roleid", "=", id)); + } + + public Role view(Long id) { + return dao().fetchLinks(fetch(id), "permissions"); + } + + public void update(Role role) { + dao().update(role); + } + + public Role fetchByName(String name) { + return fetch(Cnd.where("name", "=", name)); + } + + public List getPermissionNameList(Role role) { + List permissionNameList = new ArrayList(); + for (Permission permission : role.getPermissions()) { + permissionNameList.add(permission.getName()); + } + return permissionNameList; + } + + public void updateRoleRelation(Role role, List perms) { + dao().clearLinks(role, "permissions"); + role.getPermissions().clear(); + dao().update(role); + if (!Lang.isEmpty(perms)) { + role.setPermissions(perms); + dao().insertRelation(role, "permissions"); + } + } + + public Map map() { + Map map = new HashMap(); + List roles = query(null, null); + for (Role role : roles) { + map.put(role.getId(), role.getName()); + } + return map; + } + + public void addPermission(Long roleId, Long permissionId) { + dao().insert("system_role_permission", Chain.make("roleid", roleId).add("permissionid", permissionId)); + } + + public void removePermission(Long roleId, Long permissionId) { + dao().clear("system_role_permission", Cnd.where("roleid", "=", roleId).and("permissionid", "=", permissionId)); + } + + public Pagination getRoleListByPager(Integer pageNumber, int pageSize) { + return getObjListByPager(pageNumber, pageSize, null); + } + + public List loadRoles(Integer[] ids) { + return dao().query(getEntityClass(), Cnd.where("id", "iN", ids)); + } +} diff --git a/src/main/java/com/rekoe/service/ServerHistoryService.java b/src/main/java/com/rekoe/service/ServerHistoryService.java new file mode 100644 index 0000000..20fab11 --- /dev/null +++ b/src/main/java/com/rekoe/service/ServerHistoryService.java @@ -0,0 +1,71 @@ +package com.rekoe.service; + +import java.util.List; + +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Times; +import org.nutz.log.Log; +import org.nutz.log.Logs; + +import com.rekoe.domain.ServerHistory; + +@IocBean(args = { "refer:dao" }) +public class ServerHistoryService extends BaseService { + + private final static Log log = Logs.get(); + + /** + * Daos.ext(dao(), FieldFilter.create(getEntityClass(), + * FieldMatcher.make(null, "(createTime|passportid|pid)$", + * true))).update(server); + * + * @param dao + */ + public ServerHistoryService(Dao dao) { + super(dao); + } + + /** + * 更新最后登陆时间 + * + * @param server + */ + public void update(ServerHistory server) { + server.setModifyTime(Times.now()); + dao().update(server, "(modifyTime)$"); + } + + public boolean add(ServerHistory server) { + try { + dao().insert(server); + } catch (Exception e) { + log.error(e); + return false; + } + return true; + } + + /** + * 获取用户最后登陆的服务器 + * + * @param passportid + * @param pid + * @return + */ + public ServerHistory getLastLoginServer(long openid, int pid) { + return dao().fetch(getEntityClass(), Cnd.where("openid", "=", openid).and("pid", "=", pid).desc("modifyTime")); + } + + public ServerHistory getServerHistory(long openid, int pid, int sid) { + return dao().fetch(getEntityClass(), Cnd.where("openid", "=", openid).and("pid", "=", pid).and("sid", "=", sid)); + } + public List getLoginServerList(long openid, int pid) { + return dao().query(getEntityClass(), Cnd.where("openid", "=", openid).and("pid", "=", pid)); + } + + public ServerHistory getLoginServerList(long openid, int pid,int limit) { + return dao().fetch(getEntityClass(), Cnd.where("openid", "=", openid).and("pid", "=", pid).desc("modifyTime")); + } +} diff --git a/src/main/java/com/rekoe/service/UploadService.java b/src/main/java/com/rekoe/service/UploadService.java new file mode 100644 index 0000000..9739442 --- /dev/null +++ b/src/main/java/com/rekoe/service/UploadService.java @@ -0,0 +1,49 @@ +package com.rekoe.service; + +import java.io.File; + +import org.nutz.ioc.impl.PropertiesProxy; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Files; +import org.nutz.log.Log; +import org.nutz.log.Logs; +import org.nutz.mvc.upload.TempFile; + +/** + * @author 科技㊣²º¹³
+ * 2014年2月3日 下午4:48:45
+ * http://www.rekoe.com
+ * QQ:5382211 + */ +@IocBean +public class UploadService extends BaseService { + + private final static Log log = Logs.get(); + + @Inject + private PropertiesProxy conf; + + @SuppressWarnings("deprecation") + public File upload(TempFile tempFile) throws Exception { + String savePath = conf.get("xlsPath") + "/" + tempFile.getSubmittedFileName(); + Files.makeDir(new File(conf.get("xlsPath"))); + File saveFile = new File(savePath); + Files.move(tempFile.getFile(), saveFile); + if (log.isDebugEnabled()) { + log.debugf("save path[%s]", savePath); + } + return saveFile; + } + + @SuppressWarnings("deprecation") + public File upload(TempFile tempFile, String savePath) throws Exception { + Files.makeDir(new File(savePath)); + File saveFile = new File(savePath); + Files.move(tempFile.getFile(), saveFile); + if (log.isDebugEnabled()) { + log.debugf("save path[%s]", savePath); + } + return saveFile; + } +} diff --git a/src/main/java/com/rekoe/service/UserService.java b/src/main/java/com/rekoe/service/UserService.java new file mode 100644 index 0000000..c300442 --- /dev/null +++ b/src/main/java/com/rekoe/service/UserService.java @@ -0,0 +1,323 @@ +package com.rekoe.service; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.apache.shiro.crypto.SecureRandomNumberGenerator; +import org.apache.shiro.crypto.hash.Sha256Hash; +import org.nutz.dao.Chain; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.ContinueLoop; +import org.nutz.lang.Each; +import org.nutz.lang.ExitLoop; +import org.nutz.lang.Lang; +import org.nutz.lang.LoopException; +import org.nutz.lang.Times; +import org.nutz.lang.random.R; +import org.nutz.resource.Scans; + +import com.rekoe.annotation.PermissionTag; +import com.rekoe.common.page.Pagination; +import com.rekoe.domain.Permission; +import com.rekoe.domain.PermissionCategory; +import com.rekoe.domain.Role; +import com.rekoe.domain.User; + +/** + * @author 科技㊣²º¹³
+ * 2014年2月3日 下午4:48:45
+ * http://www.rekoe.com
+ * QQ:5382211 + */ +@IocBean(args = { "refer:dao" }) +public class UserService extends BaseService { + + public UserService(Dao dao) { + super(dao); + } + + public List list() { + return query(null, null); + } + + public void update(User user) { + dao().update(user); + } + + public void update(long uid, String password, boolean isLocked, Integer[] ids) { + User user = fetch(uid); + dao().clearLinks(user, "roles"); + if (!Lang.isEmptyArray(ids)) { + user.setRoles(dao().query(Role.class, Cnd.where("id", "in", ids))); + } + if (StringUtils.isNotBlank(password)) { + String salt = new SecureRandomNumberGenerator().nextBytes().toBase64(); + user.setSalt(salt); + user.setPassword(new Sha256Hash(password, salt, 1024).toBase64()); + } + user.setLocked(isLocked); + dao().update(user); + if (!Lang.isEmpty(user.getRoles())) { + dao().insertRelation(user, "roles"); + } + } + + public void updatePwd(Object uid, String password) { + String salt = new SecureRandomNumberGenerator().nextBytes().toBase64(); + dao().update(User.class, Chain.make("password", new Sha256Hash(password, salt, 1024).toBase64()).add("salt", salt), Cnd.where("id", "=", uid)); + } + + public boolean insert(User user) { + user = dao().insert(user); + dao().insertRelation(user, "roles"); + return true; + } + + public boolean save(String username, String password, boolean isEnabled, String addr, int[] roleIds) { + User user = new User(); + user.setCreateDate(Times.now()); + user.setDescription("--"); + user.setLocked(!isEnabled); + user.setName(username); + user.setRegisterIp(addr); + user.setRoles(dao().query(Role.class, Cnd.where("id", "in", roleIds))); + String salt = new SecureRandomNumberGenerator().nextBytes().toBase64(); + user.setSalt(salt); + user.setPassword(new Sha256Hash(password, salt, 1024).toBase64()); + insert(user); + return true; + } + + public User view(Long id) { + User user = fetch(id); + dao().fetchLinks(user, null); + return user; + } + + public User fetchByName(String name) { + User user = fetch(Cnd.where("name", "=", name)); + dao().fetchLinks(user, null); + return user; + } + + public List getRoleNameList(User user) { + List roleNameList = new ArrayList(); + for (Role role : user.getRoles()) { + roleNameList.add(role.getName()); + } + return roleNameList; + } + + public void addRole(Long userId, Long roleId) { + User user = fetch(userId); + Role role = new Role(); + role.setId(roleId); + user.setRoles(Lang.list(role)); + dao().insertRelation(user, "roles"); + } + + public void removeRole(Long userId, Long roleId) { + dao().clear("system_user_role", Cnd.where("userid", "=", userId).and("roleid", "=", roleId)); + } + + public Pagination getUserListByPager(Integer pageNumber, int pageSize) { + return getObjListByPager(pageNumber, pageSize, null); + } + + public User initUser(String name, String openid, String providerid, String addr) { + User temp = dao().fetch(getEntityClass(), Cnd.where("name", "=", name)); + if (!Lang.isEmpty(temp)) { + name += R.random(2, 5); + } + User user = new User(); + user.setCreateDate(Times.now()); + user.setName(name); + user.setOpenid(openid); + user.setProviderid(providerid); + user.setRegisterIp(addr); + user.setLocked(true); + user.setSystem(false); + return dao().insert(user); + } + + public User fetchByOpenID(String openid) { + User user = fetch(Cnd.where("openid", "=", openid)); + if (!Lang.isEmpty(user) && !user.isLocked()) { + dao().fetchLinks(user, "servers"); + dao().fetchLinks(user, "roles"); + } + return user; + } + + public User regist(User user, String addr) { + user.setCreateDate(Times.now()); + user.setRegisterIp(addr); + user.setSystem(false); + String salt = new SecureRandomNumberGenerator().nextBytes().toBase64(); + user.setSalt(salt); + user.setPassword(new Sha256Hash(user.getPassword(), salt, 1024).toBase64()); + return dao().insert(user); + } + + public void removeUserUpdata(User user) { + dao().clear("system_user_role", Cnd.where("USERID", "=", user.getId())); + dao().clear("system_user_server", Cnd.where("USERID", "=", user.getId())); + } + + public void insertRelations(User user) { + dao().insertRelation(user, "servers"); + dao().insertRelation(user, "roles"); + } + + public void updateLock(User user) { + dao().update(user, "^(locked)$"); + } + + class PermissionTagClzz { + + private String premission; + private String tag; + private String name; + + public PermissionTagClzz(String premission, String tag, String name) { + super(); + this.premission = premission; + this.tag = tag; + this.name = name; + } + + public String getPremission() { + return premission; + } + + public void setPremission(String premission) { + this.premission = premission; + } + + public String getTag() { + return tag; + } + + public void setTag(String tag) { + this.tag = tag; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + } + + public void initFormPackages(String... pkgs) { + List> allClazz = new ArrayList<>(); + for (String pkg : pkgs) { + List> scanPackage = Scans.me().scanPackage(pkg); + allClazz.addAll(scanPackage); + } + Set rpTagNames = new HashSet<>(); + final Set permissions = new HashSet(); + final Map perTagMap = new HashMap<>(); + for (Class klass : allClazz) { + for (Method method : klass.getMethods()) { + RequiresPermissions rp = method.getAnnotation(RequiresPermissions.class); + if (rp != null && rp.value() != null) { + PermissionTag rpTag = method.getAnnotation(PermissionTag.class); + if (rpTag == null || rpTag.enable() == false) + continue; + rpTagNames.add(rpTag.tag()); + for (String permission : rp.value()) { + if (permission != null && !permission.endsWith("*")) { + permissions.add(permission); + perTagMap.put(permission, new PermissionTagClzz(permission, rpTag.tag(), rpTag.name())); + } + } + } + } + } + + // 整理出 需要添加权限的所有的权限分类 + final Iterator> iter = perTagMap.entrySet().iterator(); + final Set perTags = new HashSet(); + while (iter.hasNext()) { + Entry entry = iter.next(); + PermissionTagClzz ptc = entry.getValue(); + String name = ptc.getTag(); + perTags.add(name); + } + + dao().each(PermissionCategory.class, null, new Each() { + public void invoke(int index, PermissionCategory ele, int length) throws ExitLoop, ContinueLoop, LoopException { + perTags.remove(ele.getName()); + } + }); + + // 把分类数据插入到数据库 + final Map tagIds = new HashMap(); + for (String name : perTags) { + PermissionCategory pc = new PermissionCategory(); + pc.setLocked(true); + pc.setName(name); + dao().insert(pc); + } + + // 把全部权限查出来一一检查 + dao().each(Permission.class, null, new Each() { + public void invoke(int index, Permission ele, int length) throws ExitLoop, ContinueLoop, LoopException { + permissions.remove(ele.getName()); + perTagMap.remove(ele.getName()); + } + }); + + Iterator> iterator = perTagMap.entrySet().iterator(); + Set tagNames = new HashSet(); + while (iterator.hasNext()) { + Entry entry = iterator.next(); + tagNames.add(entry.getValue().getTag()); + } + dao().each(PermissionCategory.class, Cnd.where("name", "in", tagNames), new Each() { + public void invoke(int index, PermissionCategory ele, int length) throws ExitLoop, ContinueLoop, LoopException { + tagIds.put(ele.getName(), ele.getId()); + } + }); + + List newSet = new ArrayList<>(); + final Iterator> $iter = perTagMap.entrySet().iterator(); + while ($iter.hasNext()) { + Entry entry = $iter.next(); + PermissionTagClzz ptc = entry.getValue(); + String name = ptc.getTag(); + Permission p = new Permission(); + p.setDescription(ptc.getName()); + p.setLocked(true); + p.setPermissionCategoryId(tagIds.get(name)); + p.setName(entry.getKey()); + newSet.add(p); + } + + if (!Lang.isEmpty(newSet)) { + dao().fastInsert(newSet); + } + } + + public void loadRolePermission(User user) { + List roleList = user.getRoles(); + for (Role role : roleList) { + dao().fetchLinks(role, "permissions"); + } + } +} diff --git a/src/main/java/com/rekoe/service/VerifyServerService.java b/src/main/java/com/rekoe/service/VerifyServerService.java new file mode 100644 index 0000000..ba2c8d7 --- /dev/null +++ b/src/main/java/com/rekoe/service/VerifyServerService.java @@ -0,0 +1,29 @@ +package com.rekoe.service; + +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.IocBean; + +import com.rekoe.domain.VerifyServer; + +/** + * 提审服 + * + * @author kouxian + * + */ +@IocBean(args = { "refer:dao" }) +public class VerifyServerService extends BaseService { + + public VerifyServerService(Dao dao) { + super(dao); + } + + public void update(VerifyServer v) { + dao().update(v, "(gid|url|name|loginUrl|payUrl|open)$"); + } + + public VerifyServer getVerifyServer(int pid) { + return dao().fetch(getEntityClass(), Cnd.where("pid", "=", pid)); + } +} diff --git a/src/main/java/com/rekoe/shiro/ModularRealmAuthenticator2.java b/src/main/java/com/rekoe/shiro/ModularRealmAuthenticator2.java new file mode 100644 index 0000000..d303ebc --- /dev/null +++ b/src/main/java/com/rekoe/shiro/ModularRealmAuthenticator2.java @@ -0,0 +1,73 @@ +package com.rekoe.shiro; + +import java.util.Collection; + +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.UnknownAccountException; +import org.apache.shiro.authc.pam.AuthenticationStrategy; +import org.apache.shiro.authc.pam.ModularRealmAuthenticator; +import org.apache.shiro.realm.Realm; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 改变Shiro原生的ModularRealmAuthenticator在多个Realm时的行为,如果仅一个Realm识别Token,那么行为跟单个Realm时一致 + * @author wendal + * + */ +public class ModularRealmAuthenticator2 extends ModularRealmAuthenticator { + + private static final Logger log = LoggerFactory.getLogger(ModularRealmAuthenticator.class); + + /** + * 官方实现里面, 如果有多个Realm,无论是不是只有一个Realm适合当前的AuthenticationToken,授权失败的时候都会抛出一个令人费解的异常 + */ + protected AuthenticationInfo doMultiRealmAuthentication(Collection realms, AuthenticationToken token) { + + AuthenticationStrategy strategy = getAuthenticationStrategy(); + + AuthenticationInfo aggregate = strategy.beforeAllAttempts(realms, token); + + if (log.isTraceEnabled()) { + log.trace("Iterating through {} realms for PAM authentication", realms.size()); + } + + Throwable t = null; + int count = 0; + Realm _realm = null; + for (Realm realm : realms) { + + if (realm.supports(token)) { + count ++; + _realm = realm; + log.trace("Attempting to authenticate token [{}] using realm [{}]", token, realm); + + AuthenticationInfo info = null; + try { + info = realm.getAuthenticationInfo(token); + } catch (Throwable throwable) { + t = throwable; + if (log.isDebugEnabled()) { + String msg = "Realm [" + realm + "] threw an exception during a multi-realm authentication attempt:"; + log.debug(msg, t); + } + } + + aggregate = strategy.afterAttempt(realm, token, info, aggregate, t); + + } else { + log.debug("Realm [{}] does not support token {}. Skipping realm.", realm, token); + } + } + if (count == 1 && t != null) { + String msg = "Realm [" + _realm + "] was unable to find account data for the " + + "submitted AuthenticationToken [" + token + "]."; + throw new UnknownAccountException(msg); + } + + aggregate = strategy.afterAllAttempts(token, aggregate); + + return aggregate; + } +} diff --git a/src/main/java/com/rekoe/shiro/RKSessionIdGenerator.java b/src/main/java/com/rekoe/shiro/RKSessionIdGenerator.java new file mode 100644 index 0000000..af3d749 --- /dev/null +++ b/src/main/java/com/rekoe/shiro/RKSessionIdGenerator.java @@ -0,0 +1,21 @@ +package com.rekoe.shiro; + +import java.io.Serializable; + +import org.apache.shiro.session.Session; +import org.apache.shiro.session.mgt.eis.SessionIdGenerator; +import org.nutz.lang.random.R; + +/** + * 使用UU32生成session id, 减少其长度 + * + * @author wendal + * + */ +public class RKSessionIdGenerator implements SessionIdGenerator { + + public Serializable generateId(Session session) { + return R.UU32(); + } + +} diff --git a/src/main/java/com/rekoe/shiro/authc/pam/AnySuccessfulStrategy.java b/src/main/java/com/rekoe/shiro/authc/pam/AnySuccessfulStrategy.java new file mode 100644 index 0000000..e959f69 --- /dev/null +++ b/src/main/java/com/rekoe/shiro/authc/pam/AnySuccessfulStrategy.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package com.rekoe.shiro.authc.pam; + +import java.util.Collection; + +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.ExcessiveAttemptsException; +import org.apache.shiro.authc.IncorrectCredentialsException; +import org.apache.shiro.authc.LockedAccountException; +import org.apache.shiro.authc.UnknownAccountException; +import org.apache.shiro.authc.pam.AbstractAuthenticationStrategy; +import org.apache.shiro.realm.Realm; +import org.apache.shiro.util.CollectionUtils; +import org.nutz.lang.Lang; + +/** + * @author 科技㊣²º¹³ + * 2014年2月3日 下午4:48:45 + * http://www.rekoe.com + * QQ:5382211 + */ +public class AnySuccessfulStrategy extends AbstractAuthenticationStrategy { + + /** + * Returns {@code null} immediately, relying on this class's {@link #merge + * merge} implementation to return only the first {@code info} object it + * encounters, ignoring all subsequent ones. + */ + public AuthenticationInfo beforeAllAttempts(Collection realms, AuthenticationToken token) throws AuthenticationException { + return null; + } + + /** + * Returns the specified {@code aggregate} instance if is non null and valid + * (that is, has principals and they are not empty) immediately, or, if it + * is null or not valid, the {@code info} argument is returned instead. + *

+ * This logic ensures that the first valid info encountered is the one + * retained and all subsequent ones are ignored, since this strategy + * mandates that only the info from the first successfully authenticated + * realm be used. + */ + protected AuthenticationInfo merge(AuthenticationInfo info, AuthenticationInfo aggregate) { + if (aggregate != null && !CollectionUtils.isEmpty(aggregate.getPrincipals())) { + return aggregate; + } + return info != null ? info : aggregate; + } + + @Override + public AuthenticationInfo afterAttempt(Realm realm, AuthenticationToken token, AuthenticationInfo singleRealmInfo, AuthenticationInfo aggregateInfo, Throwable t) throws AuthenticationException { + if (singleRealmInfo == null) { + if (t.getClass().isAssignableFrom(LockedAccountException.class)) { + throw Lang.makeThrow(LockedAccountException.class, t.getMessage()); + } else if (t.getClass().isAssignableFrom(UnknownAccountException.class)) { + throw Lang.makeThrow(UnknownAccountException.class, t.getMessage()); + } else if (t.getClass().isAssignableFrom(IncorrectCredentialsException.class)) { + throw Lang.makeThrow(IncorrectCredentialsException.class, t.getMessage()); + } else if (t.getClass().isAssignableFrom(ExcessiveAttemptsException.class)) { + throw Lang.makeThrow(ExcessiveAttemptsException.class, t.getMessage()); + } + throw Lang.makeThrow(AuthenticationException.class, "未知错误"); + } + return super.afterAttempt(realm, token, singleRealmInfo, aggregateInfo, t); + } + +} diff --git a/src/main/java/com/rekoe/shiro/freemarker/AuthenticatedTag.java b/src/main/java/com/rekoe/shiro/freemarker/AuthenticatedTag.java new file mode 100644 index 0000000..aaf29da --- /dev/null +++ b/src/main/java/com/rekoe/shiro/freemarker/AuthenticatedTag.java @@ -0,0 +1,47 @@ +package com.rekoe.shiro.freemarker; + +import java.io.IOException; +import java.util.Map; + +import org.nutz.log.Log; +import org.nutz.log.Logs; + +import freemarker.core.Environment; +import freemarker.template.TemplateDirectiveBody; +import freemarker.template.TemplateException; + + +/** + * JSP tag that renders the tag body only if the current user has executed a successful authentication attempt + * during their current session. + * + *

This is more restrictive than the {@link UserTag}, which only + * ensures the current user is known to the system, either via a current login or from Remember Me services, + * which only makes the assumption that the current user is who they say they are, and does not guarantee it like + * this tag does. + * + *

The logically opposite tag of this one is the {@link NotAuthenticatedTag} + * + *

Equivalent to {@link org.apache.shiro.web.tags.AuthenticatedTag}

+ * + * @since 0.2 + */ +public class AuthenticatedTag extends SecureTag { + private static final Log log = Logs.get(); + + @SuppressWarnings("rawtypes") + @Override + public void render(Environment env, Map params, TemplateDirectiveBody body) throws IOException, TemplateException { + if (getSubject() != null && getSubject().isAuthenticated()) { + if (log.isDebugEnabled()) { + log.debug("Subject exists and is authenticated. Tag body will be evaluated."); + } + + renderBody(env, body); + } else { + if (log.isDebugEnabled()) { + log.debug("Subject does not exist or is not authenticated. Tag body will not be evaluated."); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/shiro/freemarker/GuestTag.java b/src/main/java/com/rekoe/shiro/freemarker/GuestTag.java new file mode 100644 index 0000000..f88dd7c --- /dev/null +++ b/src/main/java/com/rekoe/shiro/freemarker/GuestTag.java @@ -0,0 +1,47 @@ +package com.rekoe.shiro.freemarker; + +import java.io.IOException; +import java.util.Map; + +import org.nutz.log.Log; +import org.nutz.log.Logs; + +import freemarker.core.Environment; +import freemarker.template.TemplateDirectiveBody; +import freemarker.template.TemplateException; + +/** + * JSP tag that renders the tag body if the current user is not known + * to the system, either because they haven't logged in yet, or because they + * have no 'RememberMe' identity. + * + *

+ * The logically opposite tag of this one is the {@link UserTag}. Please read + * that class's JavaDoc as it explains more about the differences between + * Authenticated/Unauthenticated and User/Guest semantic differences. + * + *

+ * Equivalent to {@link org.apache.shiro.web.tags.GuestTag} + *

+ * + * @since 0.9 + */ +public class GuestTag extends SecureTag { + private static final Log log = Logs.get(); + + @SuppressWarnings("rawtypes") + @Override + public void render(Environment env, Map params, TemplateDirectiveBody body) throws IOException, TemplateException { + if (getSubject() == null || getSubject().getPrincipal() == null) { + if (log.isDebugEnabled()) { + log.debug("Subject does not exist or does not have a known identity (aka 'principal'). Tag body will be evaluated."); + } + + renderBody(env, body); + } else { + if (log.isDebugEnabled()) { + log.debug("Subject exists or has a known identity (aka 'principal'). Tag body will not be evaluated."); + } + } + } +} diff --git a/src/main/java/com/rekoe/shiro/freemarker/HasAnyPermissionTag.java b/src/main/java/com/rekoe/shiro/freemarker/HasAnyPermissionTag.java new file mode 100644 index 0000000..746b0c4 --- /dev/null +++ b/src/main/java/com/rekoe/shiro/freemarker/HasAnyPermissionTag.java @@ -0,0 +1,32 @@ +package com.rekoe.shiro.freemarker; + +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.subject.Subject; + +public class HasAnyPermissionTag extends PermissionTag { + private static final String ROLE_NAMES_DELIMETER = ","; + + @Override + protected boolean isPermitted(String p) { + if (getSubject() == null || StringUtils.isBlank(p)) { + return false; + } + Subject subject = getSubject(); + if (!(subject.getPrincipal() instanceof com.rekoe.domain.User)) { + return false; + } + String[] permissionStrs = StringUtils.split(p, ROLE_NAMES_DELIMETER); + boolean[] haveAnyPermission = getSubject().isPermitted(permissionStrs); + for (boolean isRight : haveAnyPermission) { + if (isRight) { + return true; + } + } + return false; + } + + @Override + protected boolean showTagBody(String p) { + return isPermitted(p); + } +} diff --git a/src/main/java/com/rekoe/shiro/freemarker/HasAnyRolesTag.java b/src/main/java/com/rekoe/shiro/freemarker/HasAnyRolesTag.java new file mode 100644 index 0000000..7da6cb0 --- /dev/null +++ b/src/main/java/com/rekoe/shiro/freemarker/HasAnyRolesTag.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package com.rekoe.shiro.freemarker; + +import org.apache.shiro.subject.Subject; + + +/** + * Displays body content if the current user has any of the roles specified. + * + *

Equivalent to {@link org.apache.shiro.web.tags.HasAnyRolesTag}

+ * + * @since 0.2 + */ +public class HasAnyRolesTag extends RoleTag { + // Delimeter that separates role names in tag attribute + private static final String ROLE_NAMES_DELIMETER = ","; + + protected boolean showTagBody(String roleNames) { + boolean hasAnyRole = false; + Subject subject = getSubject(); + + if (subject != null) { + // Iterate through roles and check to see if the user has one of the roles + for (String role : roleNames.split(ROLE_NAMES_DELIMETER)) { + if (subject.hasRole(role.trim())) { + hasAnyRole = true; + break; + } + } + } + + return hasAnyRole; + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/shiro/freemarker/HasPermissionTag.java b/src/main/java/com/rekoe/shiro/freemarker/HasPermissionTag.java new file mode 100644 index 0000000..9476342 --- /dev/null +++ b/src/main/java/com/rekoe/shiro/freemarker/HasPermissionTag.java @@ -0,0 +1,13 @@ +package com.rekoe.shiro.freemarker; + + +/** + *

Equivalent to {@link org.apache.shiro.web.tags.HasPermissionTag}

+ * + * @since 0.1 + */ +public class HasPermissionTag extends PermissionTag { + protected boolean showTagBody(String p) { + return isPermitted(p); + } +} diff --git a/src/main/java/com/rekoe/shiro/freemarker/HasRoleTag.java b/src/main/java/com/rekoe/shiro/freemarker/HasRoleTag.java new file mode 100644 index 0000000..f86dd9c --- /dev/null +++ b/src/main/java/com/rekoe/shiro/freemarker/HasRoleTag.java @@ -0,0 +1,11 @@ +package com.rekoe.shiro.freemarker; + + +/** + *

Equivalent to {@link org.apache.shiro.web.tags.HasRoleTag}

+ */ +public class HasRoleTag extends RoleTag { + protected boolean showTagBody(String roleName) { + return getSubject() != null && getSubject().hasRole(roleName); + } +} diff --git a/src/main/java/com/rekoe/shiro/freemarker/LacksPermissionTag.java b/src/main/java/com/rekoe/shiro/freemarker/LacksPermissionTag.java new file mode 100644 index 0000000..9a55681 --- /dev/null +++ b/src/main/java/com/rekoe/shiro/freemarker/LacksPermissionTag.java @@ -0,0 +1,11 @@ +package com.rekoe.shiro.freemarker; + + +/** + *

Equivalent to {@link org.apache.shiro.web.tags.LacksPermissionTag}

+ */ +public class LacksPermissionTag extends PermissionTag { + protected boolean showTagBody(String p) { + return !isPermitted(p); + } +} diff --git a/src/main/java/com/rekoe/shiro/freemarker/LacksRoleTag.java b/src/main/java/com/rekoe/shiro/freemarker/LacksRoleTag.java new file mode 100644 index 0000000..022ece0 --- /dev/null +++ b/src/main/java/com/rekoe/shiro/freemarker/LacksRoleTag.java @@ -0,0 +1,12 @@ +package com.rekoe.shiro.freemarker; + + +/** + *

Equivalent to {@link org.apache.shiro.web.tags.LacksRoleTag}

+ */ +public class LacksRoleTag extends RoleTag { + protected boolean showTagBody(String roleName) { + boolean hasRole = getSubject() != null && getSubject().hasRole(roleName); + return !hasRole; + } +} diff --git a/src/main/java/com/rekoe/shiro/freemarker/NotAuthenticatedTag.java b/src/main/java/com/rekoe/shiro/freemarker/NotAuthenticatedTag.java new file mode 100644 index 0000000..41e20a3 --- /dev/null +++ b/src/main/java/com/rekoe/shiro/freemarker/NotAuthenticatedTag.java @@ -0,0 +1,35 @@ +package com.rekoe.shiro.freemarker; + +import java.io.IOException; +import java.util.Map; + +import org.nutz.log.Log; +import org.nutz.log.Logs; + +import freemarker.core.Environment; +import freemarker.template.TemplateDirectiveBody; +import freemarker.template.TemplateException; + + +/** + * Freemarker tag that renders the tag body only if the current user has not executed a successful authentication + * attempt during their current session. + * + *

The logically opposite tag of this one is the {@link org.apache.shiro.web.tags.AuthenticatedTag}. + * + *

Equivalent to {@link org.apache.shiro.web.tags.NotAuthenticatedTag}

+ */ +public class NotAuthenticatedTag extends SecureTag { + private static final Log log = Logs.get(); + + @SuppressWarnings("rawtypes") + @Override + public void render(Environment env, Map params, TemplateDirectiveBody body) throws IOException, TemplateException { + if (getSubject() == null || !getSubject().isAuthenticated()) { + log.debug("Subject does not exist or is not authenticated. Tag body will be evaluated."); + renderBody(env, body); + } else { + log.debug("Subject exists and is authenticated. Tag body will not be evaluated."); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/shiro/freemarker/PermissionTag.java b/src/main/java/com/rekoe/shiro/freemarker/PermissionTag.java new file mode 100644 index 0000000..024537f --- /dev/null +++ b/src/main/java/com/rekoe/shiro/freemarker/PermissionTag.java @@ -0,0 +1,61 @@ +package com.rekoe.shiro.freemarker; + +import java.io.IOException; +import java.util.Map; + +import org.apache.shiro.subject.Subject; +import org.nutz.lang.Lang; + +import com.rekoe.domain.User; + +import freemarker.core.Environment; +import freemarker.template.TemplateDirectiveBody; +import freemarker.template.TemplateException; +import freemarker.template.TemplateModelException; + +/** + *

+ * Equivalent to {@link org.apache.shiro.web.tags.PermissionTag} + *

+ */ +public abstract class PermissionTag extends SecureTag { + + @SuppressWarnings("rawtypes") + String getName(Map params) { + return getParam(params, "name"); + } + + @SuppressWarnings("rawtypes") + @Override + protected void verifyParameters(Map params) throws TemplateModelException { + String permission = getName(params); + + if (permission == null || permission.length() == 0) { + throw new TemplateModelException("The 'name' tag attribute must be set."); + } + } + + @SuppressWarnings("rawtypes") + @Override + public void render(Environment env, Map params, TemplateDirectiveBody body) throws IOException, TemplateException { + String p = getName(params); + + boolean show = showTagBody(p); + if (show) { + renderBody(env, body); + } + } + + protected boolean isPermitted(String p) { + Subject subject = getSubject(); + if (Lang.isEmpty(subject)) { + return false; + } + if (subject.getPrincipal() instanceof User) { + return getSubject().isPermitted(p); + } + return false; + } + + protected abstract boolean showTagBody(String p); +} diff --git a/src/main/java/com/rekoe/shiro/freemarker/PrincipalTag.java b/src/main/java/com/rekoe/shiro/freemarker/PrincipalTag.java new file mode 100644 index 0000000..77900b0 --- /dev/null +++ b/src/main/java/com/rekoe/shiro/freemarker/PrincipalTag.java @@ -0,0 +1,123 @@ +package com.rekoe.shiro.freemarker; + +import java.beans.BeanInfo; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.io.IOException; +import java.util.Map; + +import org.nutz.log.Log; +import org.nutz.log.Logs; + +import freemarker.core.Environment; +import freemarker.template.TemplateDirectiveBody; +import freemarker.template.TemplateException; +import freemarker.template.TemplateModelException; + +/** + *

Tag used to print out the String value of a user's default principal, + * or a specific principal as specified by the tag's attributes.

+ * + *

If no attributes are specified, the tag prints out the toString() + * value of the user's default principal. If the type attribute + * is specified, the tag looks for a principal with the given type. If the + * property attribute is specified, the tag prints the string value of + * the specified property of the principal. If no principal is found or the user + * is not authenticated, the tag displays nothing unless a defaultValue + * is specified.

+ * + *

Equivalent to {@link org.apache.shiro.web.tags.PrincipalTag}

+ * + * @since 0.2 + */ +public class PrincipalTag extends SecureTag { + private static final Log log = Logs.get(); + + /** + * The type of principal to be retrieved, or null if the default principal should be used. + */ + @SuppressWarnings("rawtypes") + String getType(Map params) { + return getParam(params, "type"); + } + + /** + * The property name to retrieve of the principal, or null if the toString() value should be used. + */ + @SuppressWarnings("rawtypes") + String getProperty(Map params) { + return getParam(params, "property"); + } + + @SuppressWarnings("rawtypes") + @Override + public void render(Environment env, Map params, TemplateDirectiveBody body) throws IOException, TemplateException { + String result = null; + + if (getSubject() != null) { + // Get the principal to print out + Object principal; + + if (getType(params) == null) { + principal = getSubject().getPrincipal(); + } else { + principal = getPrincipalFromClassName(params); + } + + // Get the string value of the principal + if (principal != null) { + String property = getProperty(params); + + if (property == null) { + result = principal.toString(); + } else { + result = getPrincipalProperty(principal, property); + } + } + } + + // Print out the principal value if not null + if (result != null) { + try { + env.getOut().write(result); + } catch (IOException ex) { + throw new TemplateException("Error writing ["+result+"] to Freemarker.", ex, env); + } + } + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + Object getPrincipalFromClassName(Map params) { + String type = getType(params); + + try { + Class cls = Class.forName(type); + + return getSubject().getPrincipals().oneByType(cls); + } catch (ClassNotFoundException ex) { + log.error("Unable to find class for name ["+type+"]", ex); + } + + return null; + } + + String getPrincipalProperty(Object principal, String property) throws TemplateModelException { + try { + BeanInfo beanInfo = Introspector.getBeanInfo(principal.getClass()); + + // Loop through the properties to get the string value of the specified property + for (PropertyDescriptor propertyDescriptor : beanInfo.getPropertyDescriptors()) { + if (propertyDescriptor.getName().equals(property)) { + Object value = propertyDescriptor.getReadMethod().invoke(principal, (Object[]) null); + + return String.valueOf(value); + } + } + + // property not found, throw + throw new TemplateModelException("Property ["+property+"] not found in principal of type ["+principal.getClass().getName()+"]"); + } catch (Exception ex) { + throw new TemplateModelException("Error reading property ["+property+"] from principal of type ["+principal.getClass().getName()+"]", ex); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/shiro/freemarker/RoleTag.java b/src/main/java/com/rekoe/shiro/freemarker/RoleTag.java new file mode 100644 index 0000000..0b6236b --- /dev/null +++ b/src/main/java/com/rekoe/shiro/freemarker/RoleTag.java @@ -0,0 +1,29 @@ +package com.rekoe.shiro.freemarker; + +import java.io.IOException; +import java.util.Map; + +import freemarker.core.Environment; +import freemarker.template.TemplateDirectiveBody; +import freemarker.template.TemplateException; + +/** + *

Equivalent to {@link org.apache.shiro.web.tags.RoleTag}

+ */ +public abstract class RoleTag extends SecureTag { + @SuppressWarnings("rawtypes") + String getName(Map params) { + return getParam(params, "name"); + } + + @SuppressWarnings("rawtypes") + @Override + public void render(Environment env, Map params, TemplateDirectiveBody body) throws IOException, TemplateException { + boolean show = showTagBody(getName(params)); + if (show) { + renderBody(env, body); + } + } + + protected abstract boolean showTagBody(String roleName); +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/shiro/freemarker/SecureTag.java b/src/main/java/com/rekoe/shiro/freemarker/SecureTag.java new file mode 100644 index 0000000..8332a08 --- /dev/null +++ b/src/main/java/com/rekoe/shiro/freemarker/SecureTag.java @@ -0,0 +1,54 @@ +package com.rekoe.shiro.freemarker; + +import java.io.IOException; +import java.util.Map; + +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.subject.Subject; + +import freemarker.core.Environment; +import freemarker.template.SimpleScalar; +import freemarker.template.TemplateDirectiveBody; +import freemarker.template.TemplateDirectiveModel; +import freemarker.template.TemplateException; +import freemarker.template.TemplateModel; +import freemarker.template.TemplateModelException; + +/** + *

Equivalent to {@link org.apache.shiro.web.tags.SecureTag}

+ */ +public abstract class SecureTag implements TemplateDirectiveModel { + @SuppressWarnings("rawtypes") + public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { + verifyParameters(params); + render(env, params, body); + } + + @SuppressWarnings("rawtypes") + public abstract void render(Environment env, Map params, TemplateDirectiveBody body) throws IOException, TemplateException; + + @SuppressWarnings("rawtypes") + protected String getParam(Map params, String name) { + Object value = params.get(name); + + if (value instanceof SimpleScalar) { + return ((SimpleScalar)value).getAsString(); + } + + return null; + } + + protected Subject getSubject() { + return SecurityUtils.getSubject(); + } + + @SuppressWarnings("rawtypes") + protected void verifyParameters(Map params) throws TemplateModelException { + } + + protected void renderBody(Environment env, TemplateDirectiveBody body) throws IOException, TemplateException { + if (body != null) { + body.render(env.getOut()); + } + } +} diff --git a/src/main/java/com/rekoe/shiro/freemarker/ShiroTags.java b/src/main/java/com/rekoe/shiro/freemarker/ShiroTags.java new file mode 100644 index 0000000..f618f1b --- /dev/null +++ b/src/main/java/com/rekoe/shiro/freemarker/ShiroTags.java @@ -0,0 +1,29 @@ +package com.rekoe.shiro.freemarker; + +import freemarker.template.SimpleHash; + +/** + * Shortcut for injecting the tags into Freemarker + * + *

Usage: cfg.setSharedVeriable("shiro", new ShiroTags());

+ */ +public class ShiroTags extends SimpleHash { + /** + * + */ + private static final long serialVersionUID = -6249359256658075586L; + + public ShiroTags() { + put("authenticated", new AuthenticatedTag()); + put("guest", new GuestTag()); + put("hasAnyRoles", new HasAnyRolesTag()); + put("hasPermission", new HasPermissionTag()); + put("hasAnyPermission", new HasAnyPermissionTag()); + put("hasRole", new HasRoleTag()); + put("lacksPermission", new LacksPermissionTag()); + put("lacksRole", new LacksRoleTag()); + put("notAuthenticated", new NotAuthenticatedTag()); + put("principal", new PrincipalTag()); + put("user", new UserTag()); + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/shiro/freemarker/UserTag.java b/src/main/java/com/rekoe/shiro/freemarker/UserTag.java new file mode 100644 index 0000000..03c31a1 --- /dev/null +++ b/src/main/java/com/rekoe/shiro/freemarker/UserTag.java @@ -0,0 +1,40 @@ +package com.rekoe.shiro.freemarker; + +import java.io.IOException; +import java.util.Map; + +import org.nutz.log.Log; +import org.nutz.log.Logs; + +import freemarker.core.Environment; +import freemarker.template.TemplateDirectiveBody; +import freemarker.template.TemplateException; + +/** + * Freemarker tag that renders the tag body if the current user known to the system, either from a successful login attempt + * (not necessarily during the current session) or from 'RememberMe' services. + * + *

Note: This is less restrictive than the AuthenticatedTag since it only assumes + * the user is who they say they are, either via a current session login or via Remember Me services, which + * makes no guarantee the user is who they say they are. The AuthenticatedTag however + * guarantees that the current user has logged in during their current session, proving they really are + * who they say they are. + * + *

The logically opposite tag of this one is the {@link org.apache.shiro.web.tags.GuestTag}. + * + *

Equivalent to {@link org.apache.shiro.web.tags.UserTag}

+ */ +public class UserTag extends SecureTag { + private static final Log log = Logs.get(); + + @SuppressWarnings("rawtypes") + @Override + public void render(Environment env, Map params, TemplateDirectiveBody body) throws IOException, TemplateException { + if (getSubject() != null && getSubject().getPrincipal() != null) { + log.debug("Subject has known identity (aka 'principal'). Tag body will be evaluated."); + renderBody(env, body); + } else { + log.debug("Subject does not exist or have a known identity (aka 'principal'). Tag body will not be evaluated."); + } + } +} diff --git a/src/main/java/com/rekoe/shiro/realm/AbstractNutAuthoRealm.java b/src/main/java/com/rekoe/shiro/realm/AbstractNutAuthoRealm.java new file mode 100644 index 0000000..61e6425 --- /dev/null +++ b/src/main/java/com/rekoe/shiro/realm/AbstractNutAuthoRealm.java @@ -0,0 +1,87 @@ +package com.rekoe.shiro.realm; + +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.apache.shiro.cache.Cache; +import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.subject.PrincipalCollection; +import org.apache.shiro.subject.SimplePrincipalCollection; +import org.nutz.castor.Castors; +import org.nutz.ioc.Ioc; +import org.nutz.lang.Lang; +import org.nutz.mvc.Mvcs; + +import com.rekoe.domain.Role; +import com.rekoe.domain.User; +import com.rekoe.mobile.Profile; +import com.rekoe.service.RoleService; +import com.rekoe.service.UserService; + +/** + * @author 科技㊣²º¹³
+ * 2014年2月3日 下午4:48:45
+ * http://www.rekoe.com QQ:5382211 + */ +public abstract class AbstractNutAuthoRealm extends AuthorizingRealm { + + private UserService userService; + private RoleService roleService; + + protected UserService getUserService() { + if (Lang.isEmpty(userService)) { + Ioc ioc = Mvcs.getIoc(); + userService = ioc.get(UserService.class); + } + return userService; + } + + protected RoleService getRoleService() { + if (Lang.isEmpty(roleService)) { + Ioc ioc = Mvcs.getIoc(); + roleService = ioc.get(RoleService.class); + } + return roleService; + } + + /** + * 更新用户授权信息缓存. + */ + public void clearCachedAuthorizationInfo(String principal) { + SimplePrincipalCollection principals = new SimplePrincipalCollection(principal, getName()); + clearCachedAuthorizationInfo(principals); + } + + /** + * 清除所有用户授权信息缓存. + */ + public void clearAllCachedAuthorizationInfo() { + Cache cache = getAuthorizationCache(); + if (cache != null) { + for (Object key : cache.keys()) { + cache.remove(key); + } + } + } + + /** + * 授权查询回调函数, 进行鉴权但缓存中无用户的授权信息时调用. + */ + @Override + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { + Object object = principals.getPrimaryPrincipal(); + if (object.getClass().isAssignableFrom(User.class)) { + User user = Castors.me().castTo(object, User.class); + SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); + info.addRoles(getUserService().getRoleNameList(user)); + for (Role role : user.getRoles()) { + info.addStringPermissions(getRoleService().getPermissionNameList(role)); + } + return info; + } else if (object.getClass().isAssignableFrom(Profile.class)) { + SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); + info.addStringPermission("auth.login"); + return info; + } + return null; + } +} diff --git a/src/main/java/com/rekoe/shiro/realm/AuthToken.java b/src/main/java/com/rekoe/shiro/realm/AuthToken.java new file mode 100644 index 0000000..b74aefe --- /dev/null +++ b/src/main/java/com/rekoe/shiro/realm/AuthToken.java @@ -0,0 +1,31 @@ +package com.rekoe.shiro.realm; + +import org.apache.shiro.authc.AuthenticationToken; + +import com.rekoe.mobile.AbstractParam; + +public class AuthToken implements AuthenticationToken { + + private static final long serialVersionUID = -8469592895652806116L; + + private AbstractParam param; + + public AuthToken(AbstractParam param) { + this.param = param; + } + + @Override + public AbstractParam getPrincipal() { + return param; + } + + @Override + public AbstractParam getCredentials() { + return param; + } + + public AbstractParam getParam() { + return param; + } + +} diff --git a/src/main/java/com/rekoe/shiro/realm/AuthTokenRealm.java b/src/main/java/com/rekoe/shiro/realm/AuthTokenRealm.java new file mode 100644 index 0000000..d17ee3b --- /dev/null +++ b/src/main/java/com/rekoe/shiro/realm/AuthTokenRealm.java @@ -0,0 +1,68 @@ +package com.rekoe.shiro.realm; + +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.DisabledAccountException; +import org.apache.shiro.authc.SimpleAuthenticationInfo; +import org.apache.shiro.authc.UnknownAccountException; +import org.nutz.castor.Castors; +import org.nutz.ioc.Ioc; +import org.nutz.json.Json; +import org.nutz.json.JsonFormat; +import org.nutz.lang.Lang; +import org.nutz.log.Log; +import org.nutz.log.Logs; +import org.nutz.mvc.Mvcs; + +import com.rekoe.mobile.AbstractParam; +import com.rekoe.mobile.Profile; +import com.rekoe.mobile.provider.AbstractProvider; +import com.rekoe.service.PlatformProviderService; + +/** + * @author 科技㊣²º¹³
+ * 2014年2月3日 下午4:48:45
+ * http://www.rekoe.com
+ * QQ:5382211 + */ +public class AuthTokenRealm extends AbstractNutAuthoRealm { + + private final static Log log = Logs.get(); + + private PlatformProviderService platformProviderService; + + public AuthTokenRealm() { + setAuthenticationTokenClass(AuthToken.class); + } + + private PlatformProviderService getPlatformProviderService() { + if (Lang.isEmpty(platformProviderService)) { + Ioc ioc = Mvcs.getIoc(); + this.platformProviderService = ioc.get(PlatformProviderService.class); + } + return platformProviderService; + } + + @Override + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws DisabledAccountException { + AuthToken oauthToken = Castors.me().castTo(token, AuthToken.class); + AbstractParam param = oauthToken.getPrincipal(); + AbstractProvider platformProvider = getPlatformProviderService().getAbstractProvider(param.getProviderId()); + if (Lang.isEmpty(platformProvider)) { + throw Lang.makeThrow(UnknownAccountException.class, "UnknownPlatformProvider [ %s ] ERROR.", param.getProviderId()); + } + Profile profile = null; + try { + profile = platformProvider.verifyResponse(param); + } catch (Exception e) { + log.errorf("PlatformProvider [%s] verifyResponse ERROR: %s", param.getProviderId(), e); + } + if (Lang.isEmpty(profile)) { + throw Lang.makeThrow(AuthenticationException.class, " [ %s ] Authentication ERROR.", Json.toJson(param, JsonFormat.compact())); + } + SimpleAuthenticationInfo account = new SimpleAuthenticationInfo(profile, param, getName()); + return account; + } + +} diff --git a/src/main/java/com/rekoe/shiro/realm/NutAuthoDaoRealm.java b/src/main/java/com/rekoe/shiro/realm/NutAuthoDaoRealm.java new file mode 100644 index 0000000..98caa43 --- /dev/null +++ b/src/main/java/com/rekoe/shiro/realm/NutAuthoDaoRealm.java @@ -0,0 +1,49 @@ +package com.rekoe.shiro.realm; + +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.DisabledAccountException; +import org.apache.shiro.authc.LockedAccountException; +import org.apache.shiro.authc.SimpleAuthenticationInfo; +import org.brickred.socialauth.Profile; +import org.nutz.castor.Castors; +import org.nutz.lang.Lang; + +import com.rekoe.domain.User; + +/** + * @author 科技㊣²º¹³
+ * 2014年2月3日 下午
+ * 4:48:45
+ * http://www.rekoe.com
+ * QQ:5382211 + */ +public class NutAuthoDaoRealm extends AbstractNutAuthoRealm { + + public NutAuthoDaoRealm() { + setAuthenticationTokenClass(OAuthToken.class); + } + + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws DisabledAccountException { + OAuthToken oauthToken = Castors.me().castTo(token, OAuthToken.class); + Profile credential = oauthToken.getCredentials(); + String openid = credential.getValidatedId(); + User user = getUserService().fetchByOpenID(openid); + if (Lang.isEmpty(user)) { + String nickName = StringUtils.defaultString(credential.getDisplayName(), openid); + String providerid = credential.getProviderId(); + user = getUserService().initUser(nickName, openid, providerid, oauthToken.getAddr()); + } else { + if (user.isLocked()) { + throw Lang.makeThrow(LockedAccountException.class, "Account [ %s ] is locked.", user.getName()); + } + getUserService().loadRolePermission(user); + } + oauthToken.setRname(user.isSystem()); + oauthToken.setUserId(openid); + SimpleAuthenticationInfo account = new SimpleAuthenticationInfo(user, credential, getName()); + oauthToken.getSession().setAttribute(org.nutz.web.Webs.ME, user); + return account; + } +} diff --git a/src/main/java/com/rekoe/shiro/realm/OAuthToken.java b/src/main/java/com/rekoe/shiro/realm/OAuthToken.java new file mode 100644 index 0000000..c71f95c --- /dev/null +++ b/src/main/java/com/rekoe/shiro/realm/OAuthToken.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package com.rekoe.shiro.realm; + +import javax.servlet.http.HttpSession; + +import org.apache.shiro.authc.AuthenticationToken; +import org.brickred.socialauth.Profile; + +/** + * This class represents a token for an OAuth authentication process (OAuth + * credential + user identifier after authentication). + * + * @author Jerome Leleu + * @since 1.0.0 + */ +public final class OAuthToken implements AuthenticationToken { + + private static final long serialVersionUID = 3376624432421737333L; + private Profile credential; + private String userId; + private String addr; + private HttpSession session; + private boolean rname; + public OAuthToken(Profile credential, String addr,HttpSession session) { + this.credential = credential; + this.addr = addr; + this.session = session; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public Object getPrincipal() { + return userId; + } + + public Profile getCredentials() { + return credential; + } + + public String getAddr() { + return addr; + } + + public HttpSession getSession() { + return session; + } + + public boolean isRname() { + return rname; + } + + public void setRname(boolean rname) { + this.rname = rname; + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/shiro/realm/RealmAuthorizationType.java b/src/main/java/com/rekoe/shiro/realm/RealmAuthorizationType.java new file mode 100644 index 0000000..8ea8532 --- /dev/null +++ b/src/main/java/com/rekoe/shiro/realm/RealmAuthorizationType.java @@ -0,0 +1,6 @@ +package com.rekoe.shiro.realm; + +public enum RealmAuthorizationType { + + USER, PROFILE; +} diff --git a/src/main/java/com/rekoe/shiro/realm/UsernamePasswordRealm.java b/src/main/java/com/rekoe/shiro/realm/UsernamePasswordRealm.java new file mode 100644 index 0000000..cebcff3 --- /dev/null +++ b/src/main/java/com/rekoe/shiro/realm/UsernamePasswordRealm.java @@ -0,0 +1,55 @@ +package com.rekoe.shiro.realm; + +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.DisabledAccountException; +import org.apache.shiro.authc.LockedAccountException; +import org.apache.shiro.authc.SimpleAuthenticationInfo; +import org.apache.shiro.authc.UnknownAccountException; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.util.ByteSource; +import org.nutz.castor.Castors; +import org.nutz.lang.Lang; +import org.nutz.lang.Strings; + +import com.rekoe.domain.User; +import com.rekoe.exception.CreateUserSaltException; + +/** + * @author 科技㊣²º¹³
+ * 2014年2月3日 下午4:48:45
+ * http://www.rekoe.com
+ * QQ:5382211 + */ +public class UsernamePasswordRealm extends AbstractNutAuthoRealm { + + public UsernamePasswordRealm() { + setAuthenticationTokenClass(UsernamePasswordToken.class); + } + + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws DisabledAccountException { + UsernamePasswordToken authcToken = Castors.me().castTo(token, UsernamePasswordToken.class); + String accountName = authcToken.getUsername(); + if (StringUtils.isBlank(accountName)) { + throw Lang.makeThrow(AuthenticationException.class, "Account is empty"); + } + User user = getUserService().fetchByName(authcToken.getUsername()); + if (Lang.isEmpty(user)) { + throw Lang.makeThrow(UnknownAccountException.class, "Account [ %s ] not found", authcToken.getUsername()); + } + if (user.isLocked()) { + throw Lang.makeThrow(LockedAccountException.class, "Account [ %s ] is locked.", authcToken.getUsername()); + } + String userSalt = user.getSalt(); + if (Strings.isBlank(userSalt)) { + throw Lang.makeThrow(CreateUserSaltException.class, "Account [ %s ] is not set PassWord", authcToken.getUsername()); + } + getUserService().loadRolePermission(user); + ByteSource salt = ByteSource.Util.bytes(user.getSalt()); + SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), getName()); + info.setCredentialsSalt(salt); + return info; + } +} diff --git a/src/main/java/com/rekoe/shiro/web/SimpleCookie.java b/src/main/java/com/rekoe/shiro/web/SimpleCookie.java new file mode 100644 index 0000000..8514d68 --- /dev/null +++ b/src/main/java/com/rekoe/shiro/web/SimpleCookie.java @@ -0,0 +1,421 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package com.rekoe.shiro.web; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.Locale; +import java.util.TimeZone; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.shiro.util.StringUtils; +import org.apache.shiro.web.servlet.Cookie; +import org.nutz.lang.Lang; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Default {@link Cookie Cookie} implementation. 'HttpOnly' is supported out of + * the box, even on Servlet {@code 2.4} and {@code 2.5} container + * implementations, using raw header writing logic and not + * {@link javax.servlet.http.Cookie javax.servlet.http.Cookie} objects (which + * only has 'HttpOnly' support in Servlet {@code 2.6} specifications and above). + * + * @since 1.0 + */ +public class SimpleCookie implements Cookie { + + /** + * {@code -1}, indicating the cookie should expire when the browser closes. + */ + public static final int DEFAULT_MAX_AGE = -1; + + /** + * {@code -1} indicating that no version property should be set on the + * cookie. + */ + public static final int DEFAULT_VERSION = -1; + + // These constants are protected on purpose so that the test case can use + // them + protected static final String NAME_VALUE_DELIMITER = "="; + protected static final String ATTRIBUTE_DELIMITER = "; "; + protected static final long DAY_MILLIS = 86400000; // 1 day = 86,400,000 + // milliseconds + protected static final String GMT_TIME_ZONE_ID = "GMT"; + protected static final String COOKIE_DATE_FORMAT_STRING = "EEE, dd-MMM-yyyy HH:mm:ss z"; + + protected static final String COOKIE_HEADER_NAME = "Set-Cookie"; + protected static final String PATH_ATTRIBUTE_NAME = "Path"; + protected static final String EXPIRES_ATTRIBUTE_NAME = "Expires"; + protected static final String MAXAGE_ATTRIBUTE_NAME = "Max-Age"; + protected static final String DOMAIN_ATTRIBUTE_NAME = "Domain"; + protected static final String VERSION_ATTRIBUTE_NAME = "Version"; + protected static final String COMMENT_ATTRIBUTE_NAME = "Comment"; + protected static final String SECURE_ATTRIBUTE_NAME = "Secure"; + protected static final String HTTP_ONLY_ATTRIBUTE_NAME = "HttpOnly"; + + private static final transient Logger log = LoggerFactory.getLogger(SimpleCookie.class); + + private String name; + private String value; + private String comment; + private String domain; + private String path; + private int maxAge; + private int version; + private boolean secure; + private boolean httpOnly; + + public SimpleCookie() { + this.maxAge = DEFAULT_MAX_AGE; + this.version = DEFAULT_VERSION; + this.httpOnly = true; // most of the cookies ever used by Shiro should + // be as secure as possible. + } + + public SimpleCookie(String name) { + this(); + this.name = name; + } + + public SimpleCookie(Cookie cookie) { + this.name = cookie.getName(); + this.value = cookie.getValue(); + this.comment = cookie.getComment(); + this.domain = cookie.getDomain(); + this.path = cookie.getPath(); + this.maxAge = Math.max(DEFAULT_MAX_AGE, cookie.getMaxAge()); + this.version = Math.max(DEFAULT_VERSION, cookie.getVersion()); + this.secure = cookie.isSecure(); + this.httpOnly = cookie.isHttpOnly(); + } + + public String getName() { + return name; + } + + public void setName(String name) { + if (!StringUtils.hasText(name)) { + throw new IllegalArgumentException("Name cannot be null/empty."); + } + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public String getDomain() { + return domain; + } + + public void setDomain(String domain) { + this.domain = domain; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public int getMaxAge() { + return maxAge; + } + + public void setMaxAge(int maxAge) { + this.maxAge = Math.max(DEFAULT_MAX_AGE, maxAge); + } + + public int getVersion() { + return version; + } + + public void setVersion(int version) { + this.version = Math.max(DEFAULT_VERSION, version); + } + + public boolean isSecure() { + return secure; + } + + public void setSecure(boolean secure) { + this.secure = secure; + } + + public boolean isHttpOnly() { + return httpOnly; + } + + public void setHttpOnly(boolean httpOnly) { + this.httpOnly = httpOnly; + } + + /** + * Returns the Cookie's calculated path setting. If the + * {@link javax.servlet.http.Cookie#getPath() path} is {@code null}, then + * the {@code request}'s + * {@link javax.servlet.http.HttpServletRequest#getContextPath() context + * path} will be returned. If getContextPath() is the empty string or null + * then the ROOT_PATH constant is returned. + * + * @param request + * the incoming HttpServletRequest + * @return the path to be used as the path when the cookie is created or + * removed + */ + private String calculatePath(HttpServletRequest request) { + String path = StringUtils.clean(getPath()); + if (!StringUtils.hasText(path)) { + if (Lang.isEmpty(request)) { + return ROOT_PATH; + } + path = StringUtils.clean(request.getContextPath()); + } + // fix for http://issues.apache.org/jira/browse/SHIRO-9: + if (path == null) { + path = ROOT_PATH; + } + log.trace("calculated path: {}", path); + return path; + } + + public void saveTo(HttpServletRequest request, HttpServletResponse response) { + + String name = getName(); + String value = getValue(); + String comment = getComment(); + String domain = getDomain(); + String path = calculatePath(request); + int maxAge = getMaxAge(); + int version = getVersion(); + boolean secure = isSecure(); + boolean httpOnly = isHttpOnly(); + + addCookieHeader(response, name, value, comment, domain, path, maxAge, version, secure, httpOnly); + } + + private void addCookieHeader(HttpServletResponse response, String name, String value, String comment, String domain, String path, int maxAge, int version, boolean secure, boolean httpOnly) { + + String headerValue = buildHeaderValue(name, value, comment, domain, path, maxAge, version, secure, httpOnly); + response.addHeader(COOKIE_HEADER_NAME, headerValue); + + if (log.isDebugEnabled()) { + log.debug("Added HttpServletResponse Cookie [{}]", headerValue); + } + } + + /* + * This implementation followed the grammar defined here for convenience: Cookie grammar. + * + * @return the 'Set-Cookie' header value for this cookie instance. + */ + + protected String buildHeaderValue(String name, String value, String comment, String domain, String path, int maxAge, int version, boolean secure, boolean httpOnly) { + + if (!StringUtils.hasText(name)) { + throw new IllegalStateException("Cookie name cannot be null/empty."); + } + + StringBuilder sb = new StringBuilder(name).append(NAME_VALUE_DELIMITER); + + if (StringUtils.hasText(value)) { + sb.append(value); + } + + appendComment(sb, comment); + appendDomain(sb, domain); + appendPath(sb, path); + appendExpires(sb, maxAge); + appendVersion(sb, version); + appendSecure(sb, secure); + appendHttpOnly(sb, httpOnly); + + return sb.toString(); + + } + + private void appendComment(StringBuilder sb, String comment) { + if (StringUtils.hasText(comment)) { + sb.append(ATTRIBUTE_DELIMITER); + sb.append(COMMENT_ATTRIBUTE_NAME).append(NAME_VALUE_DELIMITER).append(comment); + } + } + + private void appendDomain(StringBuilder sb, String domain) { + if (StringUtils.hasText(domain)) { + sb.append(ATTRIBUTE_DELIMITER); + sb.append(DOMAIN_ATTRIBUTE_NAME).append(NAME_VALUE_DELIMITER).append(domain); + } + } + + private void appendPath(StringBuilder sb, String path) { + if (StringUtils.hasText(path)) { + sb.append(ATTRIBUTE_DELIMITER); + sb.append(PATH_ATTRIBUTE_NAME).append(NAME_VALUE_DELIMITER).append(path); + } + } + + private void appendExpires(StringBuilder sb, int maxAge) { + // if maxAge is negative, cookie should should expire when browser + // closes + // Don't write the maxAge cookie value if it's negative - at least on + // Firefox it'll cause the + // cookie to be deleted immediately + // Write the expires header used by older browsers, but may be + // unnecessary + // and it is not by the spec, see http://www.faqs.org/rfcs/rfc2965.html + // TODO consider completely removing the following + if (maxAge >= 0) { + sb.append(ATTRIBUTE_DELIMITER); + sb.append(MAXAGE_ATTRIBUTE_NAME).append(NAME_VALUE_DELIMITER).append(maxAge); + sb.append(ATTRIBUTE_DELIMITER); + Date expires; + if (maxAge == 0) { + // delete the cookie by specifying a time in the past (1 day + // ago): + expires = new Date(System.currentTimeMillis() - DAY_MILLIS); + } else { + // Value is in seconds. So take 'now' and add that many seconds, + // and that's our expiration date: + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.SECOND, maxAge); + expires = cal.getTime(); + } + String formatted = toCookieDate(expires); + sb.append(EXPIRES_ATTRIBUTE_NAME).append(NAME_VALUE_DELIMITER).append(formatted); + } + } + + private void appendVersion(StringBuilder sb, int version) { + if (version > DEFAULT_VERSION) { + sb.append(ATTRIBUTE_DELIMITER); + sb.append(VERSION_ATTRIBUTE_NAME).append(NAME_VALUE_DELIMITER).append(version); + } + } + + private void appendSecure(StringBuilder sb, boolean secure) { + if (secure) { + sb.append(ATTRIBUTE_DELIMITER); + sb.append(SECURE_ATTRIBUTE_NAME); // No value for this attribute + } + } + + private void appendHttpOnly(StringBuilder sb, boolean httpOnly) { + if (httpOnly) { + sb.append(ATTRIBUTE_DELIMITER); + sb.append(HTTP_ONLY_ATTRIBUTE_NAME); // No value for this attribute + } + } + + /** + * Formats a date into a cookie date compatible string (Netscape's + * specification). + * + * @param date + * the date to format + * @return an HTTP 1.0/1.1 Cookie compatible date string (GMT-based). + */ + private static String toCookieDate(Date date) { + TimeZone tz = TimeZone.getTimeZone(GMT_TIME_ZONE_ID); + DateFormat fmt = new SimpleDateFormat(COOKIE_DATE_FORMAT_STRING, Locale.US); + fmt.setTimeZone(tz); + return fmt.format(date); + } + + public void removeFrom(HttpServletRequest request, HttpServletResponse response) { + String name = getName(); + String value = DELETED_COOKIE_VALUE; + String comment = null; // don't need to add extra size to the response - + // comments are irrelevant for deletions + String domain = getDomain(); + String path = calculatePath(request); + int maxAge = 0; // always zero for deletion + int version = getVersion(); + boolean secure = isSecure(); + boolean httpOnly = false; // no need to add the extra text, plus the + // value 'deleteMe' is not sensitive at all + + addCookieHeader(response, name, value, comment, domain, path, maxAge, version, secure, httpOnly); + + log.trace("Removed '{}' cookie by setting maxAge=0", name); + } + + public String readValue(HttpServletRequest request, HttpServletResponse ignored) { + String name = getName(); + String value = null; + javax.servlet.http.Cookie cookie = getCookie(request, name); + if (cookie != null) { + value = cookie.getValue(); + log.debug("Found '{}' cookie value [{}]", name, value); + } else { + log.trace("No '{}' cookie value", name); + } + + return value; + } + + /** + * Returns the cookie with the given name from the request or {@code null} + * if no cookie with that name could be found. + * + * @param request + * the current executing http request. + * @param cookieName + * the name of the cookie to find and return. + * @return the cookie with the given name from the request or {@code null} + * if no cookie with that name could be found. + */ + private static javax.servlet.http.Cookie getCookie(HttpServletRequest request, String cookieName) { + if (request == null) { + return null; + } + javax.servlet.http.Cookie cookies[] = request.getCookies(); + if (cookies != null) { + for (javax.servlet.http.Cookie cookie : cookies) { + if (cookie.getName().equals(cookieName)) { + return cookie; + } + } + } + return null; + } +} diff --git a/src/main/java/com/rekoe/utils/CharGenerator.java b/src/main/java/com/rekoe/utils/CharGenerator.java new file mode 100644 index 0000000..c2cf10a --- /dev/null +++ b/src/main/java/com/rekoe/utils/CharGenerator.java @@ -0,0 +1,15 @@ +package com.rekoe.utils; + +import java.util.Random; + +public class CharGenerator { + private static Random r = new Random(); + private CharGenerator() { + } + + private static final char[] src = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray(); + + public static char next() { + return src[Math.abs(r.nextInt(src.length))]; + } +} diff --git a/src/main/java/com/rekoe/utils/ClassUtls.java b/src/main/java/com/rekoe/utils/ClassUtls.java new file mode 100644 index 0000000..ae5920d --- /dev/null +++ b/src/main/java/com/rekoe/utils/ClassUtls.java @@ -0,0 +1,50 @@ +package com.rekoe.utils; + +import org.nutz.dao.Dao; +import org.nutz.dao.entity.annotation.Table; +import org.nutz.dao.util.Daos; +import org.nutz.lang.Lang; +import org.nutz.resource.Scans; + +public final class ClassUtls { + + public static void migration(Dao dao, String packageName, Object nameTable, Class... ignoreClzs) { + boolean haveIgnoreClazz = !Lang.isEmptyArray(ignoreClzs); + for (Class klass : Scans.me().scanPackage(packageName)) { + if (klass.getAnnotation(Table.class) != null) { + boolean isContinue = false; + if (haveIgnoreClazz) { + for (Class clazz : ignoreClzs) { + if (clazz == klass) { + isContinue = true; + break; + } + } + } + if (isContinue) + continue; + Daos.migration(dao, klass, true, true, nameTable); + } + } + } + + public static void createTablesInPackage(Dao dao, Class $clazz, boolean delReCreate, Class... ignoreClzs) { + boolean haveIgnoreClazz = !Lang.isEmptyArray(ignoreClzs); + for (Class klass : Scans.me().scanPackage($clazz.getPackage().getName())) { + if (klass.getAnnotation(Table.class) != null) { + boolean isContinue = false; + if (haveIgnoreClazz) { + for (Class clazz : ignoreClzs) { + if (clazz == klass) { + isContinue = true; + break; + } + } + } + if (isContinue) + continue; + dao.create(klass, delReCreate); + } + } + } +} diff --git a/src/main/java/com/rekoe/utils/CommonUtils.java b/src/main/java/com/rekoe/utils/CommonUtils.java new file mode 100644 index 0000000..bf93aae --- /dev/null +++ b/src/main/java/com/rekoe/utils/CommonUtils.java @@ -0,0 +1,156 @@ +package com.rekoe.utils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.regex.Pattern; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.lang3.StringUtils; +import org.nutz.lang.util.NutMap; + +/** + * 工具类 + */ +public class CommonUtils { + + /** + * 正则表达式:验证用户名 + */ + public static final String REGEX_USERNAME = "^[a-zA-Z0-9]{6,16}$"; + + /** + * 正则表达式:验证密码 + */ + public static final String REGEX_PASSWORD = "{6,16}$"; + + /** + * 正则表达式:验证手机号 + */ + public static final String REGEX_MOBILE = "^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$"; + + /** + * 校验手机号 + * + * @param mobile + * @return 校验通过返回true,否则返回false + */ + public static boolean isMobile(String mobile) { + return Pattern.matches(REGEX_MOBILE, mobile); + } + + /** + * 校验用户名 + * + * @param username + * @return 校验通过返回true,否则返回false + */ + public static boolean isUsername(String username) { + return Pattern.matches(REGEX_USERNAME, username); + } + + /** + * 校验密码 + * + * @param password + * @return 校验通过返回true,否则返回false + */ + public static boolean isPassword(String password) { + return Pattern.matches(REGEX_PASSWORD, password); + } + + private final static Random rand = new Random(); + + public static int nextInt(final int min, final int max) { + int tmp = Math.abs(rand.nextInt()); + return tmp % (max - min + 1) + min; + + } + + /** + * 组装全局字符串替换mao + */ + public static Map populateWordsMap(String str) { + if (StringUtils.isNotBlank(str)) { + Map wordsMap = new HashMap(); + String[] keyValueArr = str.split(","); + String[] tempArr = null; + for (String keyValue : keyValueArr) { + if (keyValue.contains("=")) { + tempArr = keyValue.split("="); + wordsMap.put(tempArr[0], tempArr[1]); + } else { + wordsMap.put(keyValue, "REKOE"); + } + } + return wordsMap; + } + return null; + } + + /** + * 组装代理服务器列表 + */ + public static List> populateProxyServer(String proxyServerStr) { + List> resultList = new ArrayList>(); + String[] proxyArr = proxyServerStr.split(","); + String[] tempArr = null; + Map proxyMap = null; + for (String proxy : proxyArr) { + tempArr = proxy.split(":"); + if (tempArr.length == 2 && !StringUtils.isBlank(tempArr[0]) && !StringUtils.isBlank(tempArr[1])) { + proxyMap = new HashMap(); + proxyMap.put(StringUtils.trim(tempArr[0]), Integer.parseInt(StringUtils.trim(tempArr[1]))); + resultList.add(proxyMap); + } + } + return resultList; + } + + public static boolean isInnerIP(String ipAddress) { + boolean isInnerIp = false; + long ipNum = getIpNum(ipAddress); + /** + * 私有IP:A类 10.0.0.0-10.255.255.255 B类 172.16.0.0-172.31.255.255 C类 + * 192.168.0.0-192.168.255.255 当然,还有127这个网段是环回地址 + **/ + long aBegin = getIpNum("10.0.0.0"); + long aEnd = getIpNum("10.255.255.255"); + long bBegin = getIpNum("172.16.0.0"); + long bEnd = getIpNum("172.31.255.255"); + long cBegin = getIpNum("192.168.0.0"); + long cEnd = getIpNum("192.168.255.255"); + isInnerIp = isInner(ipNum, aBegin, aEnd) || isInner(ipNum, bBegin, bEnd) || isInner(ipNum, cBegin, cEnd) || ipAddress.equals("127.0.0.1"); + return isInnerIp; + } + + private static long getIpNum(String ipAddress) { + String[] ip = ipAddress.split("\\."); + long a = Integer.parseInt(ip[0]); + long b = Integer.parseInt(ip[1]); + long c = Integer.parseInt(ip[2]); + long d = Integer.parseInt(ip[3]); + + long ipNum = a * 256 * 256 * 256 + b * 256 * 256 + c * 256 + d; + return ipNum; + } + + private static boolean isInner(long userIp, long begin, long end) { + return (userIp >= begin) && (userIp <= end); + } + + public static NutMap getRequestParametersMap(final HttpServletRequest request) { + @SuppressWarnings("unchecked") + Map map = request.getParameterMap(); + NutMap paramsMap = NutMap.NEW(); + for (Map.Entry entry : map.entrySet()) { + String key = entry.getKey(); + String values[] = entry.getValue(); + paramsMap.put(key, values[0].toString()); + } + return paramsMap; + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/utils/Constants.java b/src/main/java/com/rekoe/utils/Constants.java new file mode 100644 index 0000000..4804981 --- /dev/null +++ b/src/main/java/com/rekoe/utils/Constants.java @@ -0,0 +1,93 @@ +package com.rekoe.utils; + +public class Constants { + + public final static int HTTPSTATUS_UNAUTHORIZED = 401; + public final static int HTTPSTATUS_BAD_REQUEST = 400; + + public static final String RESOURCE_SERVER_NAME = "oauth-server"; + public static final String INVALID_CLIENT_ID = "客户端验证失败,如错误的client_id/client_secret。"; + public static final String INVALID_ACCESS_TOKEN = "accessToken无效或已过期。"; + public static final String INVALID_REDIRECT_URI = "缺少授权成功后的回调地址。"; + public static final String INVALID_AUTH_CODE = "错误的授权码。"; + // 验证accessToken + public static final String CHECK_ACCESS_CODE_URL = "http://localhost/checkAccessToken?accessToken="; + /** + * UTF-8 + */ + public static final String ENCODING = "UTF-8"; + + /** + * oauth_consumer_key + */ + public static final String OAUTH_CONSUMER_KEY = "oauth_consumer_key"; + + /** + * authorization url + */ + public static final String OAUTH_AUTHORIZATION_URL = "authorizationURL"; + + /** + * xiaomi + */ + public static final String XIAOMI = "xiaomi"; + + + /** + * 360 + */ + public static final String QIHU360 = "qihu360"; + + /** + * uc + */ + public static final String UC = "uc"; + + /** + * hw + */ + public static final String HW = "hw"; + + /** + * A91 baidu + */ + public static final String A91 = "a91"; + + /** + * Content Encoding Header + */ + public static final String CONTENT_ENCODING_HEADER = "Content-Encoding"; + + /** + * QQ + */ + public static final String QQ = "qq"; + + /** + * http://wiki.mg.open.qq.com/index.php?title=%E5%90%8D%E8%AF%8D%E8%A7%A3%E9 + * %87%8A + */ + public static final String MSDK = "msdk"; + + public static final String GOOGLE_PLAY = "googleP"; + + public static final String GOOGLE = "google"; + + /** + * 自己平台 + */ + public static final String SG = "sg"; + + public static final String RK = "rk"; + /** + * 游客登陆 + */ + public static final String GUEST = "guest"; + + /** + * Mac + */ + public static final String APPLE = "apple"; + + public static final String FACEBOOK = "facebook"; +} diff --git a/src/main/java/com/rekoe/utils/DateTypeEditor.java b/src/main/java/com/rekoe/utils/DateTypeEditor.java new file mode 100644 index 0000000..31e40f6 --- /dev/null +++ b/src/main/java/com/rekoe/utils/DateTypeEditor.java @@ -0,0 +1,50 @@ +package com.rekoe.utils; + +import java.beans.PropertyEditorSupport; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.apache.commons.lang3.StringUtils; + +/** + * 日期编辑器 + * 根据日期字符串长度判断是长日期还是短日期。只支持yyyy-MM-dd,yyyy-MM-dd HH:mm:ss两种格式。 + */ +public class DateTypeEditor extends PropertyEditorSupport { + public static final DateFormat DF_LONG = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + public static final DateFormat DF_SHORT = new SimpleDateFormat("yyyy-MM-dd"); + /** + * 短类型日期长度 + */ + public static final int SHORT_DATE = 10; + + public void setAsText(String text) throws IllegalArgumentException { + text = text.trim(); + if (!StringUtils.isBlank(text)) { + setValue(null); + return; + } + try { + if (text.length() <= SHORT_DATE) { + setValue(new java.sql.Date(DF_SHORT.parse(text).getTime())); + } else { + setValue(new java.sql.Timestamp(DF_LONG.parse(text).getTime())); + } + } catch (ParseException ex) { + IllegalArgumentException iae = new IllegalArgumentException( + "Could not parse date: " + ex.getMessage()); + iae.initCause(ex); + throw iae; + } + } + + /** + * Format the Date as String, using the specified DateFormat. + */ + public String getAsText() { + Date value = (Date) getValue(); + return (value != null ? DF_LONG.format(value) : ""); + } +} diff --git a/src/main/java/com/rekoe/utils/DirectiveUtils.java b/src/main/java/com/rekoe/utils/DirectiveUtils.java new file mode 100644 index 0000000..ce59ba3 --- /dev/null +++ b/src/main/java/com/rekoe/utils/DirectiveUtils.java @@ -0,0 +1,272 @@ +package com.rekoe.utils; + +import java.io.IOException; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.math.NumberUtils; +import org.nutz.mvc.NutConfigException; + +import freemarker.core.Environment; +import freemarker.template.ObjectWrapper; +import freemarker.template.TemplateBooleanModel; +import freemarker.template.TemplateDateModel; +import freemarker.template.TemplateDirectiveBody; +import freemarker.template.TemplateException; +import freemarker.template.TemplateModel; +import freemarker.template.TemplateModelException; +import freemarker.template.TemplateNumberModel; +import freemarker.template.TemplateScalarModel; +import freemarker.template.utility.DeepUnwrap; + +/** + * Freemarker标签工具类 + */ +public abstract class DirectiveUtils { + /** + * 输出参数:对象数据 + */ + public static final String OUT_BEAN = "tag_bean"; + /** + * 输出参数:列表数据 + */ + public static final String OUT_LIST = "tag_list"; + /** + * 输出参数:分页数据 + */ + public static final String OUT_PAGINATION = "tag_pagination"; + /** + * 参数:是否调用模板。 + */ + public static final String PARAM_TPL = "tpl"; + /** + * 参数:次级模板名称 + */ + public static final String PARAM_TPL_SUB = "tplSub"; + + /** + * 将params的值复制到variable中 + * + * @param env + * @param params + * @return 原Variable中的值 + * @throws TemplateException + */ + public static Map addParamsToVariable(Environment env, Map params) throws TemplateException { + Map origMap = new HashMap(); + if (params.size() <= 0) { + return origMap; + } + Set> entrySet = params.entrySet(); + String key; + TemplateModel value; + for (Map.Entry entry : entrySet) { + key = entry.getKey(); + value = env.getVariable(key); + if (value != null) { + origMap.put(key, value); + } + env.setVariable(key, entry.getValue()); + } + return origMap; + } + + /** + * 将variable中的params值移除 + * + * @param env + * @param params + * @param origMap + * @throws TemplateException + */ + public static void removeParamsFromVariable(Environment env, Map params, Map origMap) throws TemplateException { + if (params.size() <= 0) { + return; + } + for (String key : params.keySet()) { + env.setVariable(key, origMap.get(key)); + } + } + + public static String getString(String name, Map params) throws TemplateException { + TemplateModel model = params.get(name); + if (model == null) { + return null; + } + if (model instanceof TemplateScalarModel) { + return ((TemplateScalarModel) model).getAsString(); + } else if ((model instanceof TemplateNumberModel)) { + return ((TemplateNumberModel) model).getAsNumber().toString(); + } else { + throw new NutConfigException("The \"" + name + "\" parameter must be a string."); + } + } + + public static Long getLong(String name, Map params) throws TemplateException { + TemplateModel model = params.get(name); + if (model == null) { + return null; + } + if (model instanceof TemplateScalarModel) { + String s = ((TemplateScalarModel) model).getAsString(); + if (StringUtils.isBlank(s)) { + return null; + } + try { + return Long.parseLong(s); + } catch (NumberFormatException e) { + throw new NutConfigException("The \"" + name + "\" parameter must be a string."); + } + } else if (model instanceof TemplateNumberModel) { + return ((TemplateNumberModel) model).getAsNumber().longValue(); + } else { + throw new NutConfigException("The \"" + name + "\" parameter must be a string."); + } + } + + public static Integer getInt(String name, Map params) throws TemplateException { + TemplateModel model = params.get(name); + if (model == null) { + return -1; + } + if (model instanceof TemplateScalarModel) { + String s = ((TemplateScalarModel) model).getAsString(); + return NumberUtils.toInt(s, -1); + } else if (model instanceof TemplateNumberModel) { + return ((TemplateNumberModel) model).getAsNumber().intValue(); + } else { + throw new NutConfigException("The \"" + name + "\" parameter must be a string."); + } + } + + public static Integer[] getIntArray(String name, Map params) throws TemplateException { + String str = DirectiveUtils.getString(name, params); + if (StringUtils.isBlank(str)) { + return null; + } + String[] arr = StringUtils.split(str, ','); + Integer[] ids = new Integer[arr.length]; + int i = 0; + try { + for (String s : arr) { + ids[i++] = Integer.valueOf(s); + } + return ids; + } catch (NumberFormatException e) { + throw new NutConfigException("The \"" + name + "\" parameter must be a number split by ','", e); + } + } + + public static Boolean getBool(String name, Map params) throws TemplateException { + TemplateModel model = params.get(name); + if (model == null) { + return false; + } + if (model instanceof TemplateBooleanModel) { + return ((TemplateBooleanModel) model).getAsBoolean(); + } else if (model instanceof TemplateNumberModel) { + return !(((TemplateNumberModel) model).getAsNumber().intValue() == 0); + } else if (model instanceof TemplateScalarModel) { + String s = ((TemplateScalarModel) model).getAsString(); + // 空串应该返回null还是true呢? + if (!StringUtils.isBlank(s)) { + return !(s.equals("0") || s.equalsIgnoreCase("false") || s.equalsIgnoreCase("f")); + } else { + return false; + } + } else { + throw new NutConfigException("The \"" + name + "\" parameter must be a boolean."); + } + } + + public static Date getDate(String name, Map params) throws TemplateException { + TemplateModel model = params.get(name); + if (model == null) { + return null; + } + if (model instanceof TemplateDateModel) { + return ((TemplateDateModel) model).getAsDate(); + } else if (model instanceof TemplateScalarModel) { + DateTypeEditor editor = new DateTypeEditor(); + editor.setAsText(((TemplateScalarModel) model).getAsString()); + return (Date) editor.getValue(); + } else { + throw new NutConfigException("The \"" + name + "\" parameter must be a date."); + } + } + + /** + * 模板调用类型 + */ + public enum InvokeType { + body, custom, sysDefined, userDefined + }; + + /** + * 是否调用模板 + * + * 0:不调用,使用标签的body;1:调用自定义模板;2:调用系统预定义模板;3:调用用户预定义模板。默认:0。 + * + * @param params + * @return + * @throws TemplateException + */ + public static InvokeType getInvokeType(Map params) throws TemplateException { + String tpl = getString(PARAM_TPL, params); + if ("3".equals(tpl)) { + return InvokeType.userDefined; + } else if ("2".equals(tpl)) { + return InvokeType.sysDefined; + } else if ("1".equals(tpl)) { + return InvokeType.custom; + } else { + return InvokeType.body; + } + } + + public static Object getObject(String paramString, Map paramMap) throws TemplateModelException { + TemplateModel localTemplateModel = (TemplateModel) paramMap.get(paramString); + if (localTemplateModel == null) + return null; + try { + return DeepUnwrap.unwrap(localTemplateModel); + } catch (TemplateModelException localTemplateModelException) { + throw new TemplateModelException("The \"" + paramString + "\" parameter " + "must be a object."); + } + } + + public static TemplateModel getVariable(String name, Environment env) throws TemplateModelException { + return env.getVariable(name); + } + + public static void setVariables(Map variables, Environment env) throws TemplateModelException { + Iterator> localIterator = variables.entrySet().iterator(); + while (localIterator.hasNext()) { + Entry localEntry = localIterator.next(); + String str = localEntry.getKey(); + Object localObject = localEntry.getValue(); + if (localObject instanceof TemplateModel) + env.setVariable(str, (TemplateModel) localObject); + else + env.setVariable(str, ObjectWrapper.BEANS_WRAPPER.wrap(localObject)); + } + } + + public static void setVariables(Map paramMap, Environment paramEnvironment, TemplateDirectiveBody paramTemplateDirectiveBody) throws TemplateException, IOException { + Map localHashMap = new HashMap(); + Iterator localIterator = paramMap.keySet().iterator(); + while (localIterator.hasNext()) { + String str = localIterator.next(); + TemplateModel localTemplateModel = DirectiveUtils.getVariable(str, paramEnvironment); + localHashMap.put(str, localTemplateModel); + } + DirectiveUtils.setVariables(paramMap, paramEnvironment); + paramTemplateDirectiveBody.render(paramEnvironment.getOut()); + DirectiveUtils.setVariables(localHashMap, paramEnvironment); + } +} diff --git a/src/main/java/com/rekoe/utils/HmacSHA1Encryption.java b/src/main/java/com/rekoe/utils/HmacSHA1Encryption.java new file mode 100644 index 0000000..d8a382b --- /dev/null +++ b/src/main/java/com/rekoe/utils/HmacSHA1Encryption.java @@ -0,0 +1,68 @@ +package com.rekoe.utils; + +import javax.crypto.Mac; +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; + +public class HmacSHA1Encryption { + + private static final String MAC_NAME = "HmacSHA1"; + private static final String ENCODING = "UTF-8"; + + /** + * 使用 HMAC-SHA1 签名方法对对 encryptText 进行签名 + * @param encryptText + * 被签名的字符串 + * @param encryptKey + * 密钥 + * @return 返回被加密后的字符串 + * @throws Exception + */ + public static String HmacSHA1Encrypt(String encryptText, String encryptKey) throws Exception { + byte[] data = encryptKey.getBytes(ENCODING); + SecretKey secretKey = new SecretKeySpec(data, MAC_NAME); + Mac mac = Mac.getInstance(MAC_NAME); + mac.init(secretKey); + byte[] text = encryptText.getBytes(ENCODING); + byte[] digest = mac.doFinal(text); + StringBuilder sBuilder = bytesToHexString(digest); + return sBuilder.toString(); + } + + /** + * 转换成Hex + * + * @param bytesArray + */ + public static StringBuilder bytesToHexString(byte[] bytesArray) { + if (bytesArray == null) { + return null; + } + StringBuilder sBuilder = new StringBuilder(); + for (byte b : bytesArray) { + String hv = String.format("%02x", b); + sBuilder.append(hv); + } + return sBuilder; + } + + /** + * 使用 HMAC-SHA1 签名方法对对 encryptText 进行签名 + * + * @param encryptData + * 被签名的字符串 + * @param encryptKey + * 密钥 + * @return 返回被加密后的字符串 + * @throws Exception + */ + public static String HmacSHA1Encrypt(byte[] encryptData, String encryptKey) throws Exception { + byte[] data = encryptKey.getBytes(ENCODING); + SecretKey secretKey = new SecretKeySpec(data, MAC_NAME); + Mac mac = Mac.getInstance(MAC_NAME); + mac.init(secretKey); + byte[] digest = mac.doFinal(encryptData); + StringBuilder sBuilder = bytesToHexString(digest); + return sBuilder.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/utils/ParamBean.java b/src/main/java/com/rekoe/utils/ParamBean.java new file mode 100644 index 0000000..653eee9 --- /dev/null +++ b/src/main/java/com/rekoe/utils/ParamBean.java @@ -0,0 +1,48 @@ +package com.rekoe.utils; + +import java.util.HashMap; +import java.util.Map; + +public class ParamBean { + /** 待采集连接区域属性MAP */ + private Map linksetStartMap = new HashMap(); + /** 待采集连接区域过滤属性MAP */ + private Map linksetEndMap = new HashMap(); + /** 待采集内容区域属性MAP */ + private Map contentStartMap = new HashMap(); + /** 待采集内容区域过滤属性MAP */ + private Map contentEndMap = new HashMap(); + + public Map getLinksetStartMap() { + return linksetStartMap; + } + + public void setLinksetStartMap(Map linksetStartMap) { + this.linksetStartMap = linksetStartMap; + } + + public Map getLinksetEndMap() { + return linksetEndMap; + } + + public void setLinksetEndMap(Map linksetEndMap) { + this.linksetEndMap = linksetEndMap; + } + + public Map getContentStartMap() { + return contentStartMap; + } + + public void setContentStartMap(Map contentStartMap) { + this.contentStartMap = contentStartMap; + } + + public Map getContentEndMap() { + return contentEndMap; + } + + public void setContentEndMap(Map contentEndMap) { + this.contentEndMap = contentEndMap; + } + +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/utils/ParseHtmlTool.java b/src/main/java/com/rekoe/utils/ParseHtmlTool.java new file mode 100644 index 0000000..4f4a1e2 --- /dev/null +++ b/src/main/java/com/rekoe/utils/ParseHtmlTool.java @@ -0,0 +1,30 @@ +package com.rekoe.utils; + +import java.util.List; + +public interface ParseHtmlTool { + /** + * 取得连接集合 + * + * @param orginHtml + * 原始HTML + * @return 连接集合 + */ + List getUrlList(String orginHtml); + + /** + * 取得标题集合 + * + * @param orginHtml + * 原始HTML + * @return 标题集合 + */ + List getTitleList(String orginHtml); + + /** + * 取得指定区域的HTML内容 + * + * @return 指定区域的HTML内容 + */ + String getHtml(String orginHtml); +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/utils/StrUtils.java b/src/main/java/com/rekoe/utils/StrUtils.java new file mode 100644 index 0000000..d7c35eb --- /dev/null +++ b/src/main/java/com/rekoe/utils/StrUtils.java @@ -0,0 +1,155 @@ +package com.rekoe.utils; + +import java.util.regex.Pattern; + +import org.apache.commons.lang3.StringUtils; +import org.htmlparser.Node; +import org.htmlparser.lexer.Lexer; +import org.htmlparser.nodes.TextNode; +import org.htmlparser.util.ParserException; + +/** + * 字符串的帮助类,提供静态方法,不可以实例化。 + * + * @author liufang + * + */ +public class StrUtils { + + /** + * 文本转html + * + * @param txt + * @return + */ + public static String txt2htm(String txt) { + if (StringUtils.isBlank(txt)) { + return txt; + } + StringBuilder sb = new StringBuilder((int) (txt.length() * 1.2)); + char c; + boolean doub = false; + for (int i = 0; i < txt.length(); i++) { + c = txt.charAt(i); + if (c == ' ') { + if (doub) { + sb.append(' '); + doub = false; + } else { + sb.append(" "); + doub = true; + } + } else { + doub = false; + switch (c) { + case '&': + sb.append("&"); + break; + case '<': + sb.append("<"); + break; + case '>': + sb.append(">"); + break; + case '"': + sb.append("""); + break; + case '\n': + sb.append("
"); + break; + default: + sb.append(c); + break; + } + } + } + return sb.toString(); + } + + /** + * 剪切文本。如果进行了剪切,则在文本后加上"..." + * + * @param s + * 剪切对象。 + * @param len + * 编码小于256的作为一个字符,大于256的作为两个字符。 + * @return + */ + public static String textCut(String s, int len, String append) { + if (s == null) { + return null; + } + int slen = s.length(); + if (slen <= len) { + return s; + } + // 最大计数(如果全是英文) + int maxCount = len * 2; + int count = 0; + int i = 0; + for (; count < maxCount && i < slen; i++) { + if (s.codePointAt(i) < 256) { + count++; + } else { + count += 2; + } + } + if (i < slen) { + if (count > maxCount) { + i--; + } + if (!StringUtils.isBlank(append)) { + if (s.codePointAt(i - 1) < 256) { + i -= 2; + } else { + i--; + } + return s.substring(0, i) + append; + } else { + return s.substring(0, i); + } + } else { + return s; + } + } + + public static String htmlCut(String s, int len, String append) { + String text = html2Text(s, len * 2); + return textCut(text, len, append); + } + + public static String html2Text(String html, int len) { + try { + Lexer lexer = new Lexer(html); + Node node; + StringBuilder sb = new StringBuilder(html.length()); + while ((node = lexer.nextNode()) != null) { + if (node instanceof TextNode) { + sb.append(node.toHtml()); + } + if (sb.length() > len) { + break; + } + } + return sb.toString(); + } catch (ParserException e) { + throw new RuntimeException(e); + } + } + + /** + * 检查字符串中是否包含被搜索的字符串。被搜索的字符串可以使用通配符'*'。 + * + * @param str + * @param search + * @return + */ + public static boolean contains(String str, String search) { + if (StringUtils.isBlank(str) || StringUtils.isBlank(search)) { + return false; + } + String reg = StringUtils.replace(search, "*", ".*"); + Pattern p = Pattern.compile(reg); + return p.matcher(str).matches(); + } +} diff --git a/src/main/java/com/rekoe/utils/StringGenerator.java b/src/main/java/com/rekoe/utils/StringGenerator.java new file mode 100644 index 0000000..f45f58b --- /dev/null +++ b/src/main/java/com/rekoe/utils/StringGenerator.java @@ -0,0 +1,71 @@ +package com.rekoe.utils; + +import org.nutz.lang.random.R; + +/** + * @author zozohtnt + * @author wendal(wendal1985@gmail.com) + */ +public class StringGenerator { + + /** + * + * @param max + * 必须大于0 + */ + public StringGenerator(int max) { + maxLen = max; + minLen = 1; + } + + /** + * + * @param min + * 必须大于0 + * @param max + * 必须不小于min + */ + public StringGenerator(int min, int max) { + maxLen = max; + minLen = min; + } + + /** + * min length of the string + */ + private int maxLen; + + /** + * max length of the string + */ + private int minLen; + + /** + * + * @param min + * 必须大于0 + * @param max + * 必须不小于min + */ + public void setup(int min, int max) { + minLen = min; + maxLen = max; + } + + /** + * 根据设置的max和min的长度,生成随机字符串. + *

+ * 若max或min小于0,则返回null + * + * @return 生成的字符串 + */ + public String next() { + if (maxLen <= 0 || minLen <= 0 || minLen > maxLen) + return null; + char[] buf = new char[R.random(minLen, maxLen)]; + for (int i = 0; i < buf.length; i++) + buf[i] = CharGenerator.next(); + return new String(buf); + } + +} diff --git a/src/main/java/com/rekoe/utils/SystemContext.java b/src/main/java/com/rekoe/utils/SystemContext.java new file mode 100644 index 0000000..1658714 --- /dev/null +++ b/src/main/java/com/rekoe/utils/SystemContext.java @@ -0,0 +1,115 @@ +package com.rekoe.utils; + +import java.io.UnsupportedEncodingException; + +public class SystemContext { + + public static final int PAGE_SIZE = 20; + + public static void main(String[] args) throws UnsupportedEncodingException { + System.out.println(decodeUnicode("cmsVoteTopic.function=\u6295\u7968\u7ba1\u7406")); + System.out.println(decodeUnicode("cmsVoteTopic.function.add=\u6dfb\u52a0\u6295\u7968")); + System.out.println(decodeUnicode("cmsVoteTopic.title=\u6807\u9898")); + System.out.println(decodeUnicode("cmsVoteTopic.description=\u63cf\u8ff0")); + System.out.println(decodeUnicode("cmsVoteTopic.time=\u6295\u7968\u65f6\u95f4\u9650\u5236")); + System.out.println(decodeUnicode("cmsVoteTopic.startTime=\u5f00\u59cb\u65f6\u95f4")); + System.out.println(decodeUnicode("cmsVoteTopic.endTime=\u7ed3\u675f\u65f6\u95f4")); + System.out.println(decodeUnicode("cmsVoteTopic.time.help=\u7559\u7a7a\u4e0d\u9650\u5236")); + System.out.println(decodeUnicode("cmsVoteTopic.repeateHour=\u91cd\u590d\u6295\u7968\u65f6\u95f4")); + System.out.println(decodeUnicode("cmsVoteTopic.repeateHour.help=\u5355\u4f4d\uff1a\u5c0f\u65f6\u3002\u4e3a\u7a7a\u7981\u6b62\u91cd\u590d\u6295\u7968\uff1b0\u4e3a\u4e0d\u9650\u5236\u91cd\u590d\u6295\u7968\u3002")); + System.out.println(decodeUnicode("cmsVoteTopic.totalCount=\u603b\u6295\u7968\u6570")); + System.out.println(decodeUnicode("cmsVoteTopic.multiSelect=\u6700\u591a\u80fd\u9009\u51e0\u9879")); + System.out.println(decodeUnicode("cmsVoteTopic.restrictMember=\u9650\u5236\u7528\u6237")); + System.out.println(decodeUnicode("cmsVoteTopic.restrictMember.help=\uff08\u662f\uff1a\u5fc5\u987b\u767b\u5f55\u624d\u80fd\u6295\u7968\uff1b\u5426\uff1a\u5141\u8bb8\u6e38\u5ba2\u6295\u7968\uff09")); + System.out.println(decodeUnicode("cmsVoteTopic.restrictIp=\u9650\u5236IP")); + System.out.println(decodeUnicode("cmsVoteTopic.restrictCookie=\u9650\u5236COOKIE")); + System.out.println(decodeUnicode("cmsVoteTopic.restrictCookie.help=\uff08\u53ef\u4ee5\u8bc6\u522b\u540c\u4e00IP\u7684\u4e0d\u540c\u7535\u8111\uff09")); + System.out.println(decodeUnicode("cmsVoteTopic.disabled=\u6682\u505c")); + System.out.println(decodeUnicode("cmsVoteTopic.def=\u9ed8\u8ba4")); + System.out.println(decodeUnicode("cmsVoteTopic.subTopics=\u8c03\u67e5\u9898\u76ee")); + System.out.println(decodeUnicode("cmsVoteTopic.type=\u9898\u76ee\u7c7b\u578b")); + System.out.println(decodeUnicode("cmsVoteTopic.type.single=\u5355\u9009")); + System.out.println(decodeUnicode("cmsVoteTopic.type.mul=\u591a\u9009")); + System.out.println(decodeUnicode("cmsVoteTopic.type.text=\u6587\u672c")); + System.out.println(decodeUnicode("cmsVoteTopic.addSubTopic=\u589e\u52a0\u8c03\u67e5\u9898\u76ee")); + System.out.println(decodeUnicode("cmsVoteItem.splitchar=,")); + System.out.println(decodeUnicode("cmsVoteItem.hasNoOne=\u6ca1\u6709\u5b50\u9009\u9879")); + System.out.println(decodeUnicode("cmsVoteTopic.items=\u6295\u7968\u9879")); + System.out.println(decodeUnicode("cmsVoteItem.title=\u6807\u9898")); + System.out.println(decodeUnicode("cmsVoteItem.voteCount=\u7968\u6570")); + System.out.println(decodeUnicode("cmsVoteItem.priority=\u6392\u5e8f")); + System.out.println(decodeUnicode("cmsVoteItem.addLines=\u65b0\u589e\u6295\u7968\u9879")); + System.out.println(decodeUnicode("cmsVoteTopic.log.save=\u589e\u52a0\u6295\u7968")); + System.out.println(decodeUnicode("cmsVoteTopic.log.update=\u4fee\u6539\u6295\u7968")); + System.out.println(decodeUnicode("cmsVoteTopic.log.delete=\u5220\u9664\u6295\u7968")); + } + + /** + * unicode 转换成 中文 + * + * @param theString + * @return + */ + public static String decodeUnicode(String theString) { + char aChar; + int len = theString.length(); + StringBuffer outBuffer = new StringBuffer(len); + for (int x = 0; x < len;) { + aChar = theString.charAt(x++); + if (aChar == '\\') { + aChar = theString.charAt(x++); + if (aChar == 'u') { + int value = 0; + for (int i = 0; i < 4; i++) { + aChar = theString.charAt(x++); + switch (aChar) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + value = (value << 4) + aChar - '0'; + break; + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + value = (value << 4) + 10 + aChar - 'a'; + break; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + value = (value << 4) + 10 + aChar - 'A'; + break; + default: + throw new IllegalArgumentException("Malformed \\uxxxx encoding."); + } + } + outBuffer.append((char) value); + } else { + if (aChar == 't') + aChar = '\t'; + else if (aChar == 'r') + aChar = '\r'; + else if (aChar == 'n') + aChar = '\n'; + else if (aChar == 'f') + aChar = '\f'; + outBuffer.append(aChar); + } + } else + outBuffer.append(aChar); + } + return outBuffer.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/com/rekoe/valueadaptor/JsonValueAdaptor.java b/src/main/java/com/rekoe/valueadaptor/JsonValueAdaptor.java new file mode 100644 index 0000000..3f36b30 --- /dev/null +++ b/src/main/java/com/rekoe/valueadaptor/JsonValueAdaptor.java @@ -0,0 +1,30 @@ +package com.rekoe.valueadaptor; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.nutz.dao.jdbc.ValueAdaptor; +import org.nutz.json.Json; +import org.nutz.json.JsonFormat; +import org.nutz.lang.Lang; +import org.nutz.lang.Strings; + +public abstract class JsonValueAdaptor implements ValueAdaptor { + + @Override + public Object get(ResultSet rs, String colName) throws SQLException { + String data = rs.getString(colName); + if (Strings.isBlank(data) || Lang.equals("null", data) || !Strings.startsWithChar(data, '[')) { + data = "[]"; + } + return Json.fromJsonAsList(JsonClassType(), data); + } + + @Override + public void set(PreparedStatement stat, Object obj, int index) throws SQLException { + stat.setString(index, (obj == null) ? "[]" : Json.toJson(obj, JsonFormat.compact())); + } + + public abstract Class JsonClassType(); +} diff --git a/src/main/java/com/rekoe/valueadaptor/MapValueAdaptor.java b/src/main/java/com/rekoe/valueadaptor/MapValueAdaptor.java new file mode 100644 index 0000000..2d6b6bf --- /dev/null +++ b/src/main/java/com/rekoe/valueadaptor/MapValueAdaptor.java @@ -0,0 +1,31 @@ +package com.rekoe.valueadaptor; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.nutz.dao.jdbc.ValueAdaptor; +import org.nutz.json.Json; +import org.nutz.json.JsonFormat; +import org.nutz.lang.Lang; +import org.nutz.lang.Strings; + +public abstract class MapValueAdaptor implements ValueAdaptor { + + @Override + public Object get(ResultSet rs, String colName) throws SQLException { + String data = rs.getString(colName); + if (Strings.isBlank(data) || Lang.equals("null", data) || !Strings.startsWithChar(data, '{')) { + data = "{}"; + } + Object obj = Json.fromJson(JsonClassType(), data); + return obj; + } + + @Override + public void set(PreparedStatement stat, Object obj, int index) throws SQLException { + stat.setString(index, (obj == null) ? "{}" : Json.toJson(obj, JsonFormat.compact())); + } + + public abstract Class JsonClassType(); +} diff --git a/src/main/java/com/rekoe/valueadaptor/NutMapValueAdaptor.java b/src/main/java/com/rekoe/valueadaptor/NutMapValueAdaptor.java new file mode 100644 index 0000000..ab5916b --- /dev/null +++ b/src/main/java/com/rekoe/valueadaptor/NutMapValueAdaptor.java @@ -0,0 +1,10 @@ +package com.rekoe.valueadaptor; + +import org.nutz.lang.util.NutMap; + +public class NutMapValueAdaptor extends MapValueAdaptor { + + public Class JsonClassType() { + return NutMap.class; + } +} diff --git a/src/main/java/com/rekoe/valueadaptor/StringJsonAdaptor.java b/src/main/java/com/rekoe/valueadaptor/StringJsonAdaptor.java new file mode 100644 index 0000000..b62a862 --- /dev/null +++ b/src/main/java/com/rekoe/valueadaptor/StringJsonAdaptor.java @@ -0,0 +1,10 @@ +package com.rekoe.valueadaptor; + + +public class StringJsonAdaptor extends JsonValueAdaptor { + + @Override + public Class JsonClassType() { + return String.class; + } +} diff --git a/src/main/java/com/rekoe/web/freemarker/CurrentTimeDirective.java b/src/main/java/com/rekoe/web/freemarker/CurrentTimeDirective.java new file mode 100644 index 0000000..1b1bb6f --- /dev/null +++ b/src/main/java/com/rekoe/web/freemarker/CurrentTimeDirective.java @@ -0,0 +1,26 @@ +package com.rekoe.web.freemarker; + +import java.io.IOException; +import java.io.Writer; +import java.util.Map; + +import org.nutz.lang.Times; + +import freemarker.core.Environment; +import freemarker.template.TemplateDirectiveBody; +import freemarker.template.TemplateDirectiveModel; +import freemarker.template.TemplateException; +import freemarker.template.TemplateModel; + +/** + * 执行时间标签 + * + */ +public class CurrentTimeDirective implements TemplateDirectiveModel { + + @SuppressWarnings({ "rawtypes" }) + public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { + Writer out = env.getOut(); + out.append(Times.format("yyyy-MM-dd HH:mm", Times.now())); + } +} diff --git a/src/main/java/com/rekoe/web/freemarker/HtmlCutDirective.java b/src/main/java/com/rekoe/web/freemarker/HtmlCutDirective.java new file mode 100644 index 0000000..64acee5 --- /dev/null +++ b/src/main/java/com/rekoe/web/freemarker/HtmlCutDirective.java @@ -0,0 +1,42 @@ +package com.rekoe.web.freemarker; + +import java.io.IOException; +import java.io.Writer; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.nutz.lang.Lang; + +import com.rekoe.utils.DirectiveUtils; +import com.rekoe.utils.StrUtils; + +import freemarker.core.Environment; +import freemarker.template.TemplateDirectiveBody; +import freemarker.template.TemplateDirectiveModel; +import freemarker.template.TemplateException; +import freemarker.template.TemplateModel; + +/** + * HTML文本提取并截断 + */ +public class HtmlCutDirective implements TemplateDirectiveModel { + public static final String PARAM_S = "s"; + public static final String PARAM_LEN = "len"; + public static final String PARAM_APPEND = "append"; + + @SuppressWarnings({"unchecked","rawtypes"}) + public void execute(Environment env, Map params, TemplateModel[] loopVars, + TemplateDirectiveBody body) throws TemplateException, IOException { + String s = DirectiveUtils.getString(PARAM_S, params); + Integer len = DirectiveUtils.getInt(PARAM_LEN, params); + String append = DirectiveUtils.getString(PARAM_APPEND, params); + if (StringUtils.isNotBlank(s)) { + Writer out = env.getOut(); + if (!Lang.isEmpty(len)) { + out.append(StrUtils.htmlCut(s, len, append)); + } else { + out.append(s); + } + } + } +} diff --git a/src/main/java/com/rekoe/web/freemarker/PaginationDirective.java b/src/main/java/com/rekoe/web/freemarker/PaginationDirective.java new file mode 100644 index 0000000..928995b --- /dev/null +++ b/src/main/java/com/rekoe/web/freemarker/PaginationDirective.java @@ -0,0 +1,62 @@ +package com.rekoe.web.freemarker; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.rekoe.utils.DirectiveUtils; + +import freemarker.core.Environment; +import freemarker.template.TemplateDirectiveBody; +import freemarker.template.TemplateDirectiveModel; +import freemarker.template.TemplateException; +import freemarker.template.TemplateModel; + +public class PaginationDirective implements TemplateDirectiveModel { + + private static final String PATTERN = "pattern"; + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Override + public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { + String pattern = DirectiveUtils.getString(PATTERN, params); + int pageNumber = DirectiveUtils.getInt("pageNumber", params); + int totalPages = DirectiveUtils.getInt("totalPages", params); + int segmentCount = DirectiveUtils.getInt("segmentCount", params); + pageNumber = pageNumber < 1 ? 1 : pageNumber; + totalPages = totalPages < 1 ? 1 : totalPages; + segmentCount = segmentCount < 1 ? 5 : segmentCount; + boolean hasPrevious = pageNumber > 1; + boolean hasNext = pageNumber < totalPages; + boolean isFirst = pageNumber == 1; + boolean isLast = (pageNumber == totalPages); + int previousPageNumber = pageNumber - 1; + int nextPageNumber = pageNumber + 1; + int firstPageNumber = 1; + int lastPageNumber = totalPages; + int minPage = pageNumber - (int) Math.floor((segmentCount - 1) / 2.0D); + int maxPage = pageNumber + (int) Math.ceil((segmentCount - 1) / 2.0D); + minPage = minPage < 1 ? 1 : minPage; + maxPage = maxPage > totalPages ? totalPages : maxPage; + List localArrayList = new ArrayList(); + for (int i = minPage; i <= maxPage; i++) { + localArrayList.add(i); + } + Map localHashMap = new HashMap(); + localHashMap.put("pattern", pattern); + localHashMap.put("pageNumber", pageNumber); + localHashMap.put("totalPages", totalPages); + localHashMap.put("segmentCount", segmentCount); + localHashMap.put("hasPrevious", hasPrevious); + localHashMap.put("hasNext", hasNext); + localHashMap.put("isFirst", isFirst); + localHashMap.put("isLast", isLast); + localHashMap.put("previousPageNumber", previousPageNumber); + localHashMap.put("nextPageNumber", nextPageNumber); + localHashMap.put("firstPageNumber", firstPageNumber); + localHashMap.put("lastPageNumber", lastPageNumber); + localHashMap.put("segment", localArrayList); + DirectiveUtils.setVariables(localHashMap, env, body); + } +} diff --git a/src/main/java/com/rekoe/web/freemarker/PermissionDirective.java b/src/main/java/com/rekoe/web/freemarker/PermissionDirective.java new file mode 100644 index 0000000..7839af6 --- /dev/null +++ b/src/main/java/com/rekoe/web/freemarker/PermissionDirective.java @@ -0,0 +1,98 @@ +package com.rekoe.web.freemarker; + +import java.io.IOException; +import java.io.Writer; +import java.util.List; +import java.util.Map; + +import org.nutz.lang.Lang; + +import com.rekoe.domain.Permission; +import com.rekoe.domain.Role; +import com.rekoe.utils.DirectiveUtils; + +import freemarker.core.Environment; +import freemarker.template.TemplateDirectiveBody; +import freemarker.template.TemplateDirectiveModel; +import freemarker.template.TemplateException; +import freemarker.template.TemplateModel; + +public class PermissionDirective implements TemplateDirectiveModel { + + private final static String ERROR_ID = "-1"; + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { + Role role = (Role) DirectiveUtils.getObject("role", params); + String wildcardString = DirectiveUtils.getString("perm", params); + List pList = (List) DirectiveUtils.getObject("permList", params); + Writer out = env.getOut(); + Permission permission = permission(pList, wildcardString); + boolean isFalse = Lang.isEmpty(permission); + out.append(""); + out.append(isFalse ? "--" : permission.getDescription()); + } + + private Permission permission(List pList, String wildcardString) { + if (Lang.isEmpty(pList)) { + return null; + } + for (Permission p : pList) { + String name = p.getName(); + boolean isRight = Lang.equals(wildcardString, name); + if (isRight) { + return p; + } + } + return null; + } + + private boolean contain(List pList, String wildcardString) { + if (Lang.isEmpty(pList)) { + return false; + } + for (Permission p : pList) { + String name = p.getName(); + boolean isRight = Lang.equals(wildcardString, name); + if (isRight) { + return isRight; + } + } + return false; + } +} diff --git a/src/main/java/com/rekoe/web/freemarker/PermissionShiroFreemarker.java b/src/main/java/com/rekoe/web/freemarker/PermissionShiroFreemarker.java new file mode 100644 index 0000000..258ee99 --- /dev/null +++ b/src/main/java/com/rekoe/web/freemarker/PermissionShiroFreemarker.java @@ -0,0 +1,96 @@ +package com.rekoe.web.freemarker; + +import java.io.IOException; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authz.Permission; +import org.apache.shiro.authz.permission.PermissionResolver; +import org.apache.shiro.authz.permission.WildcardPermissionResolver; +import org.apache.shiro.subject.Subject; +import org.apache.shiro.util.PermissionUtils; +import org.apache.shiro.util.StringUtils; +import org.nutz.lang.Lang; + +import com.rekoe.domain.Role; +import com.rekoe.domain.User; +import com.rekoe.utils.DirectiveUtils; + +import freemarker.core.Environment; +import freemarker.template.TemplateDirectiveBody; +import freemarker.template.TemplateDirectiveModel; +import freemarker.template.TemplateException; +import freemarker.template.TemplateModel; + +public class PermissionShiroFreemarker implements TemplateDirectiveModel { + + private PermissionResolver permissionResolver; + + private final static String PERM = "perm"; + + public PermissionShiroFreemarker(PermissionResolver permissionResolver) { + this.permissionResolver = permissionResolver; + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { + Subject subject = SecurityUtils.getSubject(); + if (subject.getPrincipal() instanceof User) { + User user = (User) subject.getPrincipal(); + List roleList = user.getRoles(); + if (Lang.isEmpty(roleList)) { + return; + } + Set set = new HashSet(); + for (Role role : roleList) { + List perList = role.getPermissions(); + if (Lang.isEmpty(perList)) { + continue; + } + for (com.rekoe.domain.Permission permission : perList) { + if (Lang.isEmpty(permission)) { + continue; + } + set.add(permission.getName()); + } + } + if (Lang.isEmpty(set)) { + return; + } + boolean isRight = false; + String wildcardString = DirectiveUtils.getString(PERM, params); + String[] ps = StringUtils.split(wildcardString); + Collection systemPerms = resolvePermissions(ps); + for (Permission permission : systemPerms) { + for (String uPerm : set) { + if (permission.implies(permissionResolver.resolvePermission(uPerm)) || permissionResolver.resolvePermission(uPerm).implies(permission)) { + isRight = true; + body.render(env.getOut()); + break; + } + } + if (isRight) { + break; + } + } + + } + } + + private Collection resolvePermissions(String... stringPerms) { + Collection pe = Lang.array2list(stringPerms, String.class); + Collection perms = PermissionUtils.resolvePermissions(pe, permissionResolver); + return perms; + } + + public static void main(String[] args) { + PermissionResolver permissionResolver = new WildcardPermissionResolver(); + + System.out.println(permissionResolver.resolvePermission("*:*:*").implies(permissionResolver.resolvePermission("game.server"))); + } +} diff --git a/src/main/java/com/rekoe/web/freemarker/PlatformEditDirective.java b/src/main/java/com/rekoe/web/freemarker/PlatformEditDirective.java new file mode 100644 index 0000000..adfef12 --- /dev/null +++ b/src/main/java/com/rekoe/web/freemarker/PlatformEditDirective.java @@ -0,0 +1,61 @@ +package com.rekoe.web.freemarker; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.nutz.lang.Lang; + +import com.rekoe.common.PlatformVO; +import com.rekoe.utils.DirectiveUtils; + +import freemarker.core.Environment; +import freemarker.template.TemplateDirectiveBody; +import freemarker.template.TemplateDirectiveModel; +import freemarker.template.TemplateException; +import freemarker.template.TemplateModel; + +public class PlatformEditDirective implements TemplateDirectiveModel { + + private static final String PATTERN = "obj"; + + private final List list = new ArrayList<>(); + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Override + public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { + Object obj = DirectiveUtils.getObject(PATTERN, params); + Map localHashMap = new HashMap(); + if (!Lang.isEmpty(obj)) { + HashMap map = (HashMap) obj; + Iterator> iterator = map.entrySet().iterator(); + while (iterator.hasNext()) { + Entry entry = iterator.next(); + localHashMap.put(entry.getKey(), entry.getValue()); + } + } + localHashMap.put("plist", list); + DirectiveUtils.setVariables(localHashMap, env, body); + } + + public void init() { + list.add(new PlatformVO("0", "请选择")); + list.add(new PlatformVO("uc", "uc")); + list.add(new PlatformVO("qihoo", "奇虎360")); + list.add(new PlatformVO("sg", "上游")); + list.add(new PlatformVO("google", "谷歌")); + list.add(new PlatformVO("facebook", "脸谱")); + list.add(new PlatformVO("apple", "苹果")); + list.add(new PlatformVO("a91", "百度")); + list.add(new PlatformVO("hw", "华为")); + list.add(new PlatformVO("qq", "腾讯")); + list.add(new PlatformVO("msdk", "应用宝")); + list.add(new PlatformVO("rk", "自平台")); + list.add(new PlatformVO("guest", "游客")); + list.add(new PlatformVO("googleP", "GooglePlay")); + } +} diff --git a/src/main/java/com/rekoe/web/freemarker/PlatformPermissionDirective.java b/src/main/java/com/rekoe/web/freemarker/PlatformPermissionDirective.java new file mode 100644 index 0000000..b993056 --- /dev/null +++ b/src/main/java/com/rekoe/web/freemarker/PlatformPermissionDirective.java @@ -0,0 +1,41 @@ +package com.rekoe.web.freemarker; + +import java.io.IOException; +import java.util.Map; + +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.subject.Subject; +import org.nutz.lang.Lang; + +import com.rekoe.domain.GameServer; +import com.rekoe.domain.User; +import com.rekoe.utils.DirectiveUtils; + +import freemarker.core.Environment; +import freemarker.template.TemplateDirectiveBody; +import freemarker.template.TemplateDirectiveModel; +import freemarker.template.TemplateException; +import freemarker.template.TemplateModel; + +public class PlatformPermissionDirective implements TemplateDirectiveModel { + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { + int sid = DirectiveUtils.getInt("sid", params); + Subject subject = SecurityUtils.getSubject(); + if (subject.getPrincipal() instanceof User) { + User user = (User) subject.getPrincipal(); + if (user.isSystem()) { + body.render(env.getOut()); + } else { + Map servers = user.getServers(); + if (Lang.isEmpty(servers.get(sid))) { + env.getOut().append("无权限操作"); + }else{ + body.render(env.getOut()); + } + } + } + } +} diff --git a/src/main/java/com/rekoe/web/freemarker/ProcessTimeDirective.java b/src/main/java/com/rekoe/web/freemarker/ProcessTimeDirective.java new file mode 100644 index 0000000..0bf707b --- /dev/null +++ b/src/main/java/com/rekoe/web/freemarker/ProcessTimeDirective.java @@ -0,0 +1,53 @@ +package com.rekoe.web.freemarker; + +import static com.rekoe.mvc.ProcessTimeProcessor.START_TIME; + +import java.io.IOException; +import java.io.Writer; +import java.text.DecimalFormat; +import java.util.Map; + +import org.nutz.mvc.NutConfigException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import freemarker.core.Environment; +import freemarker.template.TemplateDirectiveBody; +import freemarker.template.TemplateDirectiveModel; +import freemarker.template.TemplateException; +import freemarker.template.TemplateModel; +import freemarker.template.TemplateModelException; +import freemarker.template.TemplateNumberModel; + +/** + * 执行时间标签 + * + */ +public class ProcessTimeDirective implements TemplateDirectiveModel { + private static final Logger log = LoggerFactory.getLogger(ProcessTimeDirective.class); + private static final DecimalFormat FORMAT = new DecimalFormat("0.000"); + + @SuppressWarnings("rawtypes") + public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { + long time = getStartTime(env); + if (time != -1) { + time = System.currentTimeMillis() - time; + Writer out = env.getOut(); + out.append("Processed in " + FORMAT.format(time / 1000F) + " second(s)"); + } + } + + private long getStartTime(Environment env) throws TemplateModelException { + TemplateModel startTime = env.getGlobalVariable(START_TIME); + if (startTime == null) { + log.warn("Variable '{}' not found in GlobalVariable", "START_TIME"); + return -1; + } + if (startTime instanceof TemplateNumberModel) { + return ((TemplateNumberModel) startTime).getAsNumber().longValue(); + } else { + throw new NutConfigException(START_TIME); + } + } + +} diff --git a/src/main/java/com/rekoe/web/freemarker/Sid2NameDirective.java b/src/main/java/com/rekoe/web/freemarker/Sid2NameDirective.java new file mode 100644 index 0000000..96fdf48 --- /dev/null +++ b/src/main/java/com/rekoe/web/freemarker/Sid2NameDirective.java @@ -0,0 +1,38 @@ +package com.rekoe.web.freemarker; + +import java.io.IOException; +import java.util.Map; + +import org.nutz.lang.Lang; + +import com.rekoe.domain.OfficialServer; +import com.rekoe.service.OfficialServerService; +import com.rekoe.utils.DirectiveUtils; + +import freemarker.core.Environment; +import freemarker.template.TemplateDirectiveBody; +import freemarker.template.TemplateDirectiveModel; +import freemarker.template.TemplateException; +import freemarker.template.TemplateModel; + +public class Sid2NameDirective implements TemplateDirectiveModel { + + private OfficialServerService officialServerService; + + public Sid2NameDirective(OfficialServerService officialServerService) { + this.officialServerService = officialServerService; + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { + int sid = DirectiveUtils.getInt("sid", params); + int pid = DirectiveUtils.getInt("pid", params); + OfficialServer officialServer = officialServerService.getOfficialServer(pid, sid); + if (Lang.isEmpty(officialServer)) { + env.getOut().append(sid + ""); + } else { + env.getOut().append(officialServer.getName()); + } + } +} diff --git a/src/main/java/com/rekoe/web/freemarker/TimeFormatDirective.java b/src/main/java/com/rekoe/web/freemarker/TimeFormatDirective.java new file mode 100644 index 0000000..9ef6945 --- /dev/null +++ b/src/main/java/com/rekoe/web/freemarker/TimeFormatDirective.java @@ -0,0 +1,38 @@ +package com.rekoe.web.freemarker; + +import java.io.IOException; +import java.io.Writer; +import java.util.Map; + +import org.apache.commons.lang3.math.NumberUtils; +import org.nutz.lang.Times; + +import com.rekoe.utils.DirectiveUtils; + +import freemarker.core.Environment; +import freemarker.template.TemplateDirectiveBody; +import freemarker.template.TemplateDirectiveModel; +import freemarker.template.TemplateException; +import freemarker.template.TemplateModel; + +/** + * 格式化date + */ +public class TimeFormatDirective implements TemplateDirectiveModel { + public static final String PARAM_TIME = "time"; + public static final String PARAM_FORMAT = "format"; + + @SuppressWarnings({ "unchecked", "rawtypes" }) + public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { + String time = DirectiveUtils.getString(PARAM_TIME, params); + String format = DirectiveUtils.getString(PARAM_FORMAT, params); + Writer out = env.getOut(); + String formatTime = Times.format(format, Times.D(NumberUtils.toLong(time))); + out.append(formatTime); + } + public static void main(String[] args) { + String formatTime = Times.format("yyyy-MM", Times.now());//Times.D("1389076676271")); + System.out.print(formatTime); + System.out.println(Times.D(1389076676271L)); + } +} diff --git a/src/main/resources/conf.properties b/src/main/resources/conf.properties new file mode 100644 index 0000000..3b0e330 --- /dev/null +++ b/src/main/resources/conf.properties @@ -0,0 +1,17 @@ +db.url=jdbc:mysql://192.168.1.223:3306/html5_login?useUnicode=true&characterEncoding=utf-8 +db.username=root +db.password=root +db.maxActive=50 +mail.HostName=smtp.exmail.qq.com +mail.SmtpPort=465 +mail.UserName=nutzbook@wendal.net +mail.Password=book@2015 +mail.SSLOnConnect=true +mail.From=nutzbook@wendal.net +mail.to=koukou890@qq.com +facebook.namespace=abc +facebook.login.url=http://xxx.shanggame.net/api/facebook/login +facebook.feed.upstream.url=http://xxx.shanggame.net/api/facebook/upstream +facebook.pid=1002 +facebook.pfid=mjfb +cdk.1001.secret=xxxxxxxxxxx \ No newline at end of file diff --git a/src/main/resources/ehcache.xml b/src/main/resources/ehcache.xml new file mode 100644 index 0000000..d0475c3 --- /dev/null +++ b/src/main/resources/ehcache.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/src/main/resources/init_system_h2.sql b/src/main/resources/init_system_h2.sql new file mode 100644 index 0000000..1964c6c --- /dev/null +++ b/src/main/resources/init_system_h2.sql @@ -0,0 +1,19 @@ +/* system_user */ +INSERT INTO system_user(ID,NAME,PASSWORD,SALT,DESCRIPTION,IS_LOCKED,CREATE_DATE,REGISTER_IP,OPENID,PROVIDERID,is_system) VALUES +(1,'admin',NULL,NULL,"超级管理员",0,'2014-02-01 00:12:40','127.0.0.1','admin','local',1); +/* .system_role */ +INSERT INTO system_role(ID,NAME,DESCRIPTION) VALUES +(1,'admin','超级管理员:拥有全部权限的角色'); +/* .system_permission */ +INSERT INTO `system_permission` VALUES (1,'*:*:*','全部权限','1',1),(2,'system.role','对用户分配角色 ','721fbbca1ae44716918fdb3921deacb1',0),(3,'system.user','添加管理员','721fbbca1ae44716918fdb3921deacb1',0),(4,'system.permission','权限管理','721fbbca1ae44716918fdb3921deacb1',0); +/* .permission_category */ +INSERT INTO `permission_category` VALUES ('1','超级权限',1),('2','临时权限',1),('721fbbca1ae44716918fdb3921deacb1','用户管理',1); +/* .system_user_role */ +INSERT INTO system_user_role(USERID,ROLEID) VALUES +(1,1); +/* .system_role_permission */ +INSERT INTO system_role_permission(ROLEID,PERMISSIONID) VALUES +(1,1), +(1,2), +(1,3), +(1,4); \ No newline at end of file diff --git a/src/main/resources/ioc/dao.js b/src/main/resources/ioc/dao.js new file mode 100644 index 0000000..1ef1388 --- /dev/null +++ b/src/main/resources/ioc/dao.js @@ -0,0 +1,74 @@ +var ioc = { + conf : { + type : "org.nutz.ioc.impl.PropertiesProxy", + fields : { + paths : "conf.properties" + } + }, + dataSource : { + type : "com.alibaba.druid.pool.DruidDataSource", + events : { + create : "init", + depose : 'close' + }, + fields : { + url : { + java : "$conf.get('db.url', 'jdbc:mysql://127.0.0.1:3306/platform?useUnicode=true&characterEncoding=utf-8')" + }, + username : { + java : "$conf.get('db.username', 'root')" + }, + password : { + java : "$conf.get('db.password', 'root')" + }, + maxActive : { + java : "$conf.getInt('db.maxActive', 20)" + }, + validationQuery : "SELECT 'x'", + testWhileIdle : true, + testOnBorrow : false, + testOnReturn : false, + filters : "mergeStat", + connectionProperties : "druid.stat.slowSqlMillis=1000" + } + }, + + dao : { + type : "org.nutz.dao.impl.NutDao", + args : [ { + refer : "dataSource" + } ], + fields : { + executor : { + refer : "cacheExecutor" + } + } + }, + cacheExecutor : { + type : "org.nutz.plugins.cache.dao.CachedNutDaoExecutor", + fields : { + cacheProvider : { + refer : "cacheProvider" + }, + cachedTableNames : [ "system_permission", "permission_category", + "system_role", "system_user", "system_server", + " system_user_server", "system_user_role", "verify_server", + "official_server", "server_history", "platform_user", + "cdkey_category" ], + enableWhenTrans : false, // 事务作用域内不启用缓存,默认也是false + db : "MYSQL" + } + }, + cacheProvider : { + type : "org.nutz.plugins.cache.dao.impl.provider.EhcacheDaoCacheProvider", + fields : { + cacheManager : { + refer : "cacheManager" + } + // 引用ehcache.js中定义的CacheManager + }, + events : { + create : "init" + } + } +}; \ No newline at end of file diff --git a/src/main/resources/ioc/ehcache.js b/src/main/resources/ioc/ehcache.js new file mode 100644 index 0000000..07402c9 --- /dev/null +++ b/src/main/resources/ioc/ehcache.js @@ -0,0 +1,14 @@ +var ioc = { + cacheManager : { + type : "net.sf.ehcache.CacheManager", + factory : "net.sf.ehcache.CacheManager#getCacheManager", + args : ["rk_platform"] // 对应shiro.ini中指定的ehcache.xml中定义的name + } + /* + // 如果不需要shiro初始化的Ehcache, 使用下面的方式配置 + cacheManager : { + type : "net.sf.ehcache.CacheManager", + factory : "net.sf.ehcache.CacheManager#create" + } + */ +}; \ No newline at end of file diff --git a/src/main/resources/ioc/freemarker_tags.js b/src/main/resources/ioc/freemarker_tags.js new file mode 100644 index 0000000..0112fdd --- /dev/null +++ b/src/main/resources/ioc/freemarker_tags.js @@ -0,0 +1,85 @@ +var ioc = { + platformEditDirective : { + type : "com.rekoe.web.freemarker.PlatformEditDirective", + events : { + create : "init", + } + }, + shiroTags : { + type : "com.rekoe.shiro.freemarker.ShiroTags" + }, + permissionResolver : { + type : "org.apache.shiro.authz.permission.WildcardPermissionResolver" + }, + sidName : { + type : "com.rekoe.web.freemarker.Sid2NameDirective", + args : [ { + refer : "officialServerService" + } ] + }, + permissionShiro : { + type : "com.rekoe.web.freemarker.PermissionShiroFreemarker", + args : [ { + refer : "permissionResolver" + } ] + }, + permission : { + type : "com.rekoe.web.freemarker.PermissionDirective" + }, + process : { + type : "com.rekoe.web.freemarker.ProcessTimeDirective" + }, + currentTime : { + type : "com.rekoe.web.freemarker.CurrentTimeDirective" + }, + htmlCut : { + type : "com.rekoe.web.freemarker.HtmlCutDirective" + }, + pagination : { + type : "com.rekoe.web.freemarker.PaginationDirective" + }, + timeFormat : { + type : "com.rekoe.web.freemarker.TimeFormatDirective" + }, + platformPermission : { + type : "com.rekoe.web.freemarker.PlatformPermissionDirective" + }, + mapTags : { + factory : "$freeMarkerConfigurer#addTags", + args : [ { + 'shiro' : { + refer : 'shiroTags' + }, + 'sid_name' : { + refer : 'sidName' + }, + 'platform_perm' : { + refer : 'platformPermission' + }, + 'perm_chow' : { + refer : 'permissionShiro' + }, + 'cms_perm' : { + refer : 'permission' + }, + 'process_time' : { + refer : 'process' + }, + 'pagination' : { + refer : 'pagination' + }, + 'htmlCut' : { + refer : 'htmlCut' + }, + 'timeFormat' : { + refer : 'timeFormat' + }, + 'currentTime' : { + refer : 'currentTime' + }, + 'platform_edit' : { + refer : 'platformEditDirective' + } + } ] + } +}; \ No newline at end of file diff --git a/src/main/resources/ioc/mail.js b/src/main/resources/ioc/mail.js new file mode 100644 index 0000000..6296a73 --- /dev/null +++ b/src/main/resources/ioc/mail.js @@ -0,0 +1,17 @@ +var ioc={ + emailAuthenticator : { + type : "org.apache.commons.mail.DefaultAuthenticator", + args : [{java:"$conf.get('mail.UserName')"}, {java:"$conf.get('mail.Password')"}] + }, + htmlEmail : { + type : "org.apache.commons.mail.ImageHtmlEmail", + singleton : false, + fields : { + hostName : {java:"$conf.get('mail.HostName')"}, + smtpPort : {java:"$conf.get('mail.SmtpPort')"}, + authenticator : {refer:"emailAuthenticator"}, + SSLOnConnect : {java:"$conf.get('mail.SSLOnConnect')"}, + from : {java:"$conf.get('mail.From')"} + } + } +}; \ No newline at end of file diff --git a/src/main/resources/ioc/upload.js b/src/main/resources/ioc/upload.js new file mode 100644 index 0000000..8e13015 --- /dev/null +++ b/src/main/resources/ioc/upload.js @@ -0,0 +1,33 @@ +var uploadIoc = { + tmpFilePool : { + type : 'org.nutz.filepool.NutFilePool', // 临时文件最大个数为 1000 个 + args : [ { + java : "$conf.get('upload.temp','~/tmp')" + }, 1000 ] + }, + uploadFileContext : { + type : 'org.nutz.mvc.upload.UploadingContext', + singleton : true, + args : [ { + refer : 'tmpFilePool' + } ], + fields : { + // 是否忽略空文件, 默认为 false + ignoreNull : true, + // 单个文件最大尺寸(大约的值,单位为字节,即 1048576 为 1M) + maxFileSize : { + java : "$conf.getInt('upload.maxFileSize',5048576)" + }, + nameFilter : { + java : "$conf.get('upload.nameFilter','^(.+[.])(doc|docx|ppt|pptx|pdf|jpg|gif)$')" + } + } + }, + upload : { + type : 'org.nutz.mvc.upload.UploadAdaptor', + singleton : true, + args : [ { + refer : 'uploadFileContext' + } ] + } +}; \ No newline at end of file diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties new file mode 100644 index 0000000..b16b2b7 --- /dev/null +++ b/src/main/resources/log4j.properties @@ -0,0 +1,24 @@ +log4j.rootLogger=ERROR,A1,file +log4j.logger.velocity_log=INFO +log4j.category.org.nutz=ERROR,A1,file +log4j.category.org.nutz.dao=DEBUG +log4j.category.org.nutz.ioc=INFO +log4j.category.org.nutz.mvc=DEBUG +log4j.category.org.apache.shiro=INFO +log4j.category.org.brickred.socialauth=INFO +log4j.category.org.apache.commons=INFO +log4j.category.org.nutz.resource=INFO +log4j.category.org.quartz=INFO +log4j.category.freemarker.cache=INFO +log4j.additivity.org.nutz = false + +log4j.appender.A1=org.apache.log4j.ConsoleAppender +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} [%p][%c] - %m%n + +log4j.appender.file=org.apache.log4j.RollingFileAppender +log4j.appender.file.File=nutz.log +log4j.appender.file.MaxFileSize=20MB +log4j.appender.file.MaxBackupIndex=1 +log4j.appender.file.layout=org.apache.log4j.PatternLayout +log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss,SSS} [%p][%c] - %m%n \ No newline at end of file diff --git a/src/main/resources/msg/zh_CN/MessageResources.properties b/src/main/resources/msg/zh_CN/MessageResources.properties new file mode 100644 index 0000000..f1a0db9 --- /dev/null +++ b/src/main/resources/msg/zh_CN/MessageResources.properties @@ -0,0 +1,423 @@ +login.username=??? +login.password=?? +login.input.request.password=?????? +login.input.request.password.len=??????{0}??? +login.input.request.password.same=?????????? +login.input.old.password=????? +login.input.new.password=????? +login.input.re.password=???? +user.lastlogintime=?????? +user.lastloginip=????IP +user.lock=?? +user.reg.number=???? +user.all.presion.number=?? +user.unlock=?? +user.change.pwd=???? +global.confirm.logout=?? +global.confirm.send.thesame=???? +global.admin.welcome=?? +global.admin.viewFrontIndex=?? +global.admin.index=??? +global.position=???? +global.platform=???? +global.platform.all=???? +global.add=?? +global.admin.home=?? +global.admin.logout=?? +cms.function.channel=?? +cms.function.user=?? +cms.function.add.user=???? +common.error.lock.account.empty=????? +common.error.lock.account.system=????????? +cmsMember.function=???? +cmsGroup.function=????? +cmsAdminGlobal.function=????? +cmsRole.function=???? +cmsRole.function.open=? +cmsRole.function.forbit=?? +cmsRole.name=???? +cmsRole.forfirst=????? +cmsRole.group=??? +cms.server.set=????? +cms.server.select=????? +cms.server.list=(?????) +cmsRole.setrole.err.function=?????? +cmsLog.function.operating=?????? +cmsLog.function.loginSuccess=?????? +cmsLog.function.loginFailure=?????? +cmsMessage.function=????? +global.edit=?? +global.server=??? +global.rate=?? +global.name=?? +global.status=?? +global.type=?? +global.operator.type=???? +global.number=?? +global.date=?? +global.happen.date=???? +global.list=?? +global.delete=?? +global.reset=?? +global.beginTime=???? +global.endTime=???? +global.coin.type=???? +cmsRole.perms=?? +global.true=? +global.false=? +global.help.douhao=?????????? +global.select=??? +cmsRole.priority=??? +cmsRole.priority.help=????????????,????,?????????????? +cmsRole.super=?????? +cmsPersonal.function=???? +global.submit=?? +global.author=?? +global.link=?? +global.error=?? +global.operator.time=???? +global.submit.true=??????? +global.backToList=???? +global.sendedList=????? +global.templateList=???? +global.edit.role.permission=?????? +global.edit.role=???? +global.operate=???? +global.param=?? +global.param2=??2 +global.message.same=???? +error.usernameExist=??????? +cmsUser.username=??? +cmsUser.password=?? +cmsUser.level=?? +cmsUser.status=????? +cmsUser.reg.date=???? +cmsUser.status.help=????? ?? +global.role.edit=???? +global.confirm.delete=??????? +art.title=???? +article.function=?? +art.keywords=??? +help.art.keywords=?????? ?? +art.source=???? +help.art.source=???????,???????? +art.author=??? +help.art.author=??????????? +art.createDate=???? +help.art.createDate=?????????? +art.click=??? +help.art.click=???????? +help.style.help=????????????? +help.module.navid=??????????????,?????????????Shift???? +channel.top=???? +login_error=???????? +top.frame.server=??? +top.frame.announcement=?? +top.frame.gmlog=GMLog +top.frame.system=?? +top.frame.letter=?? +top.frame.query=?? +top.frame.game=?? +top.frame.gameConfig=???? +left.date.now=?? +left.gameConfig.sysLetter=???? +top.frame.gmlog.guid=?????? +top.frame.gmlog.useItem=???? +top.frame.gmlog.coinstat=???? +top.frame.gmlog.roleRelate=???? +top.frame.gmlog.reg=???? +top.frame.gmlog.newUserStatics=??????? +top.frame.gmlog.userStatics=?????? +top.frame.gmlog.coinDetail=?????? +top.frame.gmlog.orderDetail=???? +top.frame.gmlog.vipInfo=vip????? +top.frame.gmlog.heroStat=???? +top.frame.gmlog.turnStat=???? +button.submit.operator=???? +button.submit.success=?? +button.submit.error.duplicated=?? +button.submit=?? +button.submit.cancel=?? +button.submit.opt=?? +system.isopen=???? +system.context=?? +system.alarm.email=???? +system.open=?? +system.close=?? +system.whiteopen=????? +system.time.open=???? +system.time.end=???? +system.character.length=?? +system.reward=?? +system.add=?? +system.delete=?? +system.download=?? +system.view=?? +system.desc=?? +system.public=?? +system.sql.select=???? +system.sql.sh=????? +system.sql.database=??? +system.server.select=????? +system.server.list=????? +system.server=??????? +system.server.name=????? +system.server.name.help=???????? +system.server.other.server=????? +system.server.logic=????? +system.server.log=????? +system.server.index=????? +active.announce=???? +active.buss.name=???? +active.id=??ID +active.buss.help=???? +active.name=?? +active.image.id=??ID +active.desc=???? +active.type=???? +active.take.num.everyday=?????? +active.take.num.total=?????? +active.manager=???? +item.type=???? +item.name=???? +item.id=??ID +item.number=???? +create.number=???? +letter.list=???? +letter.index=?????? +letter.system=???? +letter.system.set=???? +game.user.id=??ID +game.user.level.on=???? +game.user.add.resource=???? +game.user.set=???? +game.user.set.equip=???? +game.user.set.pve=??pve +global.start=? +global.wave=?? +game.user.equip=?? +game.user.equip.suipian=???? +game.user.set.black=????? +game.user.set.unblack=???? +game.user.set.black.expired.time=?????? +game.user.set.black.time=?N?? +game.user.set.black.time.help=?N?? +game.user.black.list=????? +game.user.add.exp=???? +game.user.exp=?? +game.user.add.money=??? +game.user.glod=?? +game.user.sliver=?? +game.user.gongxun=?? +game.user.junling=?? +game.user.tiaozhan.ling=??? +game.user.zhengshou=?? +game.user.qiangzheng=?? +game.user.wave.max=???? +game.user.add.power=??? +game.user.add.item=???? +game.user.guide=???? +game.user.pay.numbers=???? +game.user.curr.map=???? +game.user.last.map=???? +game.user.curr.wave=???? +game.user.last.wave=???? +game.user.level=???? +game.user.vip.money=VIP?? +game.user.friends=?? +game.user.invited.friends=???? +game.user.cost.moneys=???? +game.user.get.gold=????? +game.user.pvp.number=pvp?? +game.user.item.gift.take.day.7=??7??? +game.user.item.gift.take.day.3.1=??3?1??? +game.user.item.gift.take.day.3.2=??3?2??? +game.user.item.gift.take.day.3.3=??3?3??? +game.user.item.gift.take.day.3.4=??3?4??? +game.user.item.gift.take.day.3.5=??3?5??? +game.user.item.gift.take.day.3.6=??3?6??? +game.user.item.junling.used.number=????? +game.system.resource.id=??id +game.system.resource.name=???? +game.system.resource.number=???? +game.system.resource.buy.users=??? +game.system.resource.source=?? +game.system.glod.set=???? +game.system.glod.number=???? +game.system.glod.last=???? +game.system.glod.type=???? +game.system.item.sell.num=?????? +game.system.item=?? +game.system.item.sell.money=???? +game.system.pay.users=????? +game.system.pay.moneys=????? +game.system.pay.day=???? +game.system.pay.day.rate=????? +game.system.pay.first.day.total=????? +game.system.pay.first.day.users=??????? +game.system.pay.first.day.rate=????? +game.system.pay.total=???? +game.system.pay.users.total=?????? +game.system.pay.users.total.rate=????? +game.system.pay.arpu.total.rate=??Arpu +game.system.pay.day.total=????? +game.system.glod.change.total=?????? +game.system.item.buy.persion.num=????? +game.user.vip.level=VIP?? +global.game.user.index=???????? +game.system.guid.step.number=??????? +game.system.guid.step.last.number=??????? +game.system.guid.step.last.number.rate=???? +game.system.new.guid.step.last.number.rate=????????? +game.system.hero.code=??code +game.system.hero=?? +game.system.hero.suipian=???? +game.system.hero.name=???? +game.system.hero.level=???? +game.system.hero.quality=???? +game.system.pay.order.id=??? +game.system.pay.number=???? +game.system.pay.date=???? +game.system.task=?? +game.system.gift=?? +game.system.junqi=?? +game.system.curr.data.reg.number=?????? +game.system.all.pass.numbers=?????? +game.system.all.numbers=???? +game.system.zonghe.total=??????? +game.system.platform.turkey=??? +game.system.platform=?? +game.letter.publish.type=???? +game.letter.publish.type.user=???? +game.letter.publish.type.system=???? +game.letter.title=?? +game.letter.title.help=????40?? +game.letter.overview=?? +game.letter.overview.help=????50?? +game.letter.content=?? +game.letter.content.help=????140?? +game.letter.add.goods=???? +game.letter.goods=?? +game.letter.reward=?? +game.letter.time.select=???? +game.letter.time.begin=???? +game.letter.time.end=???? +game.letter.user.list=???? +game.letter.user.list.help=?????? "??" "," ?? +game.letter.limit.actid=???? +game.letter.limit.recharge=???? +game.letter.limit.add=???? +game.letter.limit.scope=???? +game.letter.limit.type=???? +game.letter.limit.begin=???? +game.letter.limit.end=???? +game.letter.type.act=????????? +game.letter.type.newact=????? +game.letter.type.standard=????????????? +game.letter.type.relogin=????????? +game.letter.type.limitbylv=?????? +game.letter.type.limitbywave=?????? +game.letter.type.recharge=????? +game.letter.type.special=???????? +game.letter.sender=??? +game.letter.isopen=???? +game.letter.creatTime=???? +game.letter.lastUpdateTime=?????? +game.letter.send=?? +game.letter.sended=??? +game.letter.publish=?? +game.letter.published=??? +game.letter.preview=?? +game.position=???? +game.position.id=??id +game.position.status=?? +game.position.platform=?? +permission.permissionCategory=???? +permission.permissionCategoryId=???? +admin.main.permissionCategory=???? +admin.common.edit=?? +admin.common.delete=?? +admin.common.view=?? +admin.permissionCategory.list=???? +permissionCategory.name=?? +permission.description=???? +cmsUser.name=??? +admin.validate.illegal=???? +admin.validate.exist=??? +admin.validate.not.exist=???? +admin.common.ok=?? +admin.path.index=?? +admin.member.reg=????? +Member.username=??? +Member.password=?? +admin.member.rePassword=???? +admin.common.submit=?  ? +admin.common.back=?  ? +admin.common.error=????? +admin.common.error.connect=????? +admin.common.error.no.server=???????? +admin.error.title=???? +admin.error.message=????????????? +admin.error.message.forbit=??????????? +admin.error.back=????? +admin.message.error=????? +admin.dialog.deleteConfirm=?????? +admin.dialog.ok=OK +admin.dialog.cancel=Cancel +admin.common.error.act.exist=?????? +admin.dialog.updateConfirm=?????????? +admin.dialog.publishConfirm=?????????? +admin.common.resopnse.error=?????? +top.frame.gmlog.online=???? +top.frame.gmlog.payhighcharts=????? +top.frame.gmlog.wavecount=???? +admin.common.error.notexits=????? +admin.common.error.not.change=????? +cmsAdmin.log.function=???? +admin.dialog.addConfirm=??????? +admin.common.error.letter.send=?????????? +admin.common.error.close=????? +common.error.pay.null=????? +common.error.pay.isflag=????? +game.salvage.data.register=???? +admin.main.activityCategory=???? +admin.common.error.connect.net=???????? +game.system.upload.record=???? +admin.validate.notexist=?????? +content.title=?? +content.user=??? +payment.uid=UID +payment.sid=???ID +common.error.login.account=??????? +global.refresh=?? +system.log.isopen=?????? +admin.common.down=?? +Article.title=?? +Article.author=?? +Article.content=?? +Article.seoTitle=???? +Article.seoKeywords=????? +Article.seoDescription=???? +Article.isPublication=???? +Article.isTop=???? +Article.hits=??? +Article.pageNumber=?? +Article.articleCategory=???? +Article.tags=?? +Article.path=???? +Article.text=???? +Article.pageContents=???? +Article.totalPages=??? + +ArticleCategory.name=?? +ArticleCategory.seoTitle=???? +ArticleCategory.seoKeywords=????? +ArticleCategory.seoDescription=???? +path.home=?? +ArticleCategory.treePath=??? +ArticleCategory.grade=?? +ArticleCategory.parent=???? +ArticleCategory.children=???? +ArticleCategory.articles=?? +ArticleCategory.treePaths=??? +ArticleCategory.path=???? \ No newline at end of file diff --git a/src/main/resources/oauth_consumer.properties b/src/main/resources/oauth_consumer.properties new file mode 100644 index 0000000..0fe96dc --- /dev/null +++ b/src/main/resources/oauth_consumer.properties @@ -0,0 +1,7 @@ +#facebook +graph.facebook.com.consumer_key = 1440728696165353 +graph.facebook.com.consumer_secret =3a4e87ac4f8ea6eb4d0bfcc266cd618c + +socialauth.qq=com.rekoe.cms.socialauth.qq.QQAuthProvider +qq.consumer_key=101258436 +qq.consumer_secret=e922dba70d65f92ff267840b6982e44d \ No newline at end of file diff --git a/src/main/resources/quartz.properties b/src/main/resources/quartz.properties new file mode 100644 index 0000000..489a5ba --- /dev/null +++ b/src/main/resources/quartz.properties @@ -0,0 +1,4 @@ +org.quartz.scheduler.instanceName = NutzbookScheduler +org.quartz.threadPool.threadCount = 3 +org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore +org.quartz.scheduler.skipUpdateCheck=true \ No newline at end of file diff --git a/src/main/resources/shiro.ini b/src/main/resources/shiro.ini new file mode 100644 index 0000000..2d825da --- /dev/null +++ b/src/main/resources/shiro.ini @@ -0,0 +1,41 @@ +[main] + +#Session +sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager + +# Session Cache +sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO +sessionManager.sessionDAO = $sessionDAO +securityManager.sessionManager = $sessionManager + +authenticator=com.rekoe.shiro.ModularRealmAuthenticator2 +securityManager.authenticator=$authenticator + +# use R.UU32() +sessionIdGenerator = com.rekoe.shiro.RKSessionIdGenerator +securityManager.sessionManager.sessionDAO.sessionIdGenerator = $sessionIdGenerator + +cacheManager = org.apache.shiro.cache.ehcache.EhCacheManager +cacheManager.cacheManagerConfigFile=classpath:ehcache.xml +securityManager.cacheManager = $cacheManager + +# cookie +sessionIdCookie=com.rekoe.shiro.web.SimpleCookie +sessionIdCookie.name=rk_cms +sessionIdCookie.maxAge=946080000 +sessionIdCookie.httpOnly=true +sessionManager.sessionIdCookie=$sessionIdCookie +sessionManager.sessionIdCookieEnabled=true +sessionManager.globalSessionTimeout=946080000 + +sha256Matcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher +sha256Matcher.storedCredentialsHexEncoded = false +sha256Matcher.hashIterations = 1024 +sha256Matcher.hashSalted = true +nutzAuthoRealm = com.rekoe.shiro.realm.NutAuthoDaoRealm +authTokenRealm = com.rekoe.shiro.realm.AuthTokenRealm +shiroDbRealm = com.rekoe.shiro.realm.UsernamePasswordRealm +shiroDbRealm.credentialsMatcher = $sha256Matcher +securityManager.realms = $shiroDbRealm,$nutzAuthoRealm,$authTokenRealm +authcStrategy = com.rekoe.shiro.authc.pam.AnySuccessfulStrategy +securityManager.authenticator.authenticationStrategy = $authcStrategy \ No newline at end of file