From cdcbed9af813b2a02cdc01eefa24db8bec6b51a9 Mon Sep 17 00:00:00 2001 From: yujian <yujian> Date: 星期三, 27 三月 2019 12:17:33 +0800 Subject: [PATCH] 主分类 + 子分类 DAO改造 --- fanli/src/main/java/com/yeshi/fanli/controller/client/UserAccountController.java | 239 +++++++++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 181 insertions(+), 58 deletions(-) diff --git a/fanli/src/main/java/com/yeshi/fanli/controller/client/UserAccountController.java b/fanli/src/main/java/com/yeshi/fanli/controller/client/UserAccountController.java index c89f6a9..6f34566 100644 --- a/fanli/src/main/java/com/yeshi/fanli/controller/client/UserAccountController.java +++ b/fanli/src/main/java/com/yeshi/fanli/controller/client/UserAccountController.java @@ -10,15 +10,18 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.yeshi.utils.JsonUtil; +import org.yeshi.utils.encrypt.DESUtil; import com.alipay.api.AlipayApiException; import com.yeshi.fanli.entity.accept.AcceptData; import com.yeshi.fanli.entity.bus.user.BindingAccount; +import com.yeshi.fanli.entity.bus.user.ForbiddenUserIdentifyCode; +import com.yeshi.fanli.entity.bus.user.ForbiddenUserIdentifyCode.ForbiddenUserIdentifyCodeTypeEnum; import com.yeshi.fanli.entity.bus.user.LoginResult; import com.yeshi.fanli.entity.bus.user.SMSHistory; import com.yeshi.fanli.entity.bus.user.UserInfo; import com.yeshi.fanli.entity.bus.user.WeiXinUser; -import com.yeshi.fanli.entity.system.System; +import com.yeshi.fanli.entity.system.BusinessSystem; import com.yeshi.fanli.entity.taobao.ClientTBPid; import com.yeshi.fanli.entity.taobao.PidUser; import com.yeshi.fanli.entity.taobao.TBPid; @@ -27,32 +30,31 @@ import com.yeshi.fanli.exception.AlipayTransferException; import com.yeshi.fanli.exception.UserAccountException; import com.yeshi.fanli.log.LogHelper; +import com.yeshi.fanli.service.inter.config.BusinessSystemService; import com.yeshi.fanli.service.inter.config.ConfigService; -import com.yeshi.fanli.service.inter.config.InviteGetMoneyService; -import com.yeshi.fanli.service.inter.config.SystemService; import com.yeshi.fanli.service.inter.hongbao.HongBaoManageService; -import com.yeshi.fanli.service.inter.hongbao.HongBaoService; import com.yeshi.fanli.service.inter.hongbao.HongBaoV2Service; import com.yeshi.fanli.service.inter.hongbao.ThreeSaleSerivce; import com.yeshi.fanli.service.inter.order.LostOrderService; -import com.yeshi.fanli.service.inter.order.OrderItemServcie; import com.yeshi.fanli.service.inter.order.OrderService; import com.yeshi.fanli.service.inter.push.DeviceTokenHWService; import com.yeshi.fanli.service.inter.taobao.TaoBaoUnionConfigService; -import com.yeshi.fanli.service.inter.user.AccountDetailsService; -import com.yeshi.fanli.service.inter.user.AccountMessageService; import com.yeshi.fanli.service.inter.user.BindingAccountService; import com.yeshi.fanli.service.inter.user.ExtractService; +import com.yeshi.fanli.service.inter.user.ForbiddenUserIdentifyCodeService; import com.yeshi.fanli.service.inter.user.ShamUserService; import com.yeshi.fanli.service.inter.user.SpreadUserImgService; import com.yeshi.fanli.service.inter.user.TBPidService; import com.yeshi.fanli.service.inter.user.UserAccountService; import com.yeshi.fanli.service.inter.user.UserInfoService; +import com.yeshi.fanli.service.inter.user.UserMoneyService; import com.yeshi.fanli.service.inter.user.UserShareGoodsRecordService; +import com.yeshi.fanli.service.inter.user.UserSystemCouponService; import com.yeshi.fanli.util.Constant; import com.yeshi.fanli.util.GsonUtil; import com.yeshi.fanli.util.RedisManager; import com.yeshi.fanli.util.StringUtil; +import com.yeshi.fanli.util.ThreadUtil; import com.yeshi.fanli.util.account.UserUtil; import com.yeshi.fanli.util.wx.WXLoginUtil; @@ -75,9 +77,6 @@ private OrderService orderService; @Resource - private HongBaoService hongBaoService; - - @Resource private HongBaoV2Service hongBaoV2Service; @Resource @@ -90,7 +89,7 @@ private ConfigService configService; @Resource - private SystemService systemService; + private BusinessSystemService businessSystemService; @Resource private ShamUserService shamUserService; @@ -102,15 +101,6 @@ private LostOrderService lostOrderService; @Resource - private OrderItemServcie orderItemServcie; - - @Resource - private AccountDetailsService accountDetailsService; - - @Resource - private AccountMessageService accountMessageService; - - @Resource private HongBaoManageService hongBaoManageService; @Resource @@ -118,9 +108,6 @@ @Resource private RedisManager redisManager; - - @Resource - private InviteGetMoneyService inviteGetMoneyService; @Resource private TBPidService tbPidService; @@ -136,6 +123,15 @@ @Resource private UserShareGoodsRecordService userShareGoodsRecordService; + + @Resource + private ForbiddenUserIdentifyCodeService forbiddenUserIdentifyCodeService; + + @Resource + private UserSystemCouponService userSystemCouponService; + + @Resource + private UserMoneyService userMoneyService; private static final String PASSWORD_MAX_ERROR = "password_max_error"; private static final String EXTRACT_MIN_MONEY = "extract_min_money"; @@ -158,7 +154,8 @@ public void login(AcceptData acceptData, String code, String vcode, String phone, boolean wxinstall, String tbOpenid, String tbNickName, String tbPortrait, String tbSession, int loginType, Boolean first, HttpSession session, HttpServletRequest request, PrintWriter out) { - System system = systemService.getSystemCache(acceptData.getPlatform(), acceptData.getPackages()); + BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(), + acceptData.getPackages()); if (system == null) { out.print(JsonUtil.loadFalseResult("绯荤粺涓嶅瓨鍦�")); return; @@ -166,19 +163,40 @@ if (loginType == 3 && !Constant.IS_TEST)// 楠岃瘉鐭俊楠岃瘉鐮� { - String oldVcode = redisManager.getSMSVCode(phone, SMSHistory.TYPE_LOGIN); - if (StringUtil.isNullOrEmpty(oldVcode) || !oldVcode.equalsIgnoreCase(vcode)) { - out.print(JsonUtil.loadFalseResult(90001, "楠岃瘉鐮侀敊璇�")); - return; + // 鑻规灉搴旂敤鍟嗗簵涓婄嚎娴嬭瘯鍙风爜 + if ("17316780233".equalsIgnoreCase(phone) && "258168".equalsIgnoreCase(vcode)) { + ; + } else { + String oldVcode = redisManager.getSMSVCode(phone, SMSHistory.TYPE_LOGIN); + if (StringUtil.isNullOrEmpty(oldVcode) || !oldVcode.equalsIgnoreCase(vcode)) { + out.print(JsonUtil.loadFalseResult(90001, "楠岃瘉鐮侀敊璇�")); + return; + } } redisManager.clearSMSFrequencyLimit(phone, SMSHistory.TYPE_LOGIN); } UserInfo tbUserInfo = new UserInfo(); + if (!StringUtil.isNullOrEmpty(tbSession)) { + try { + tbSession = DESUtil.decode(tbSession.replace("\n", ""), StringUtil.getBase64String("YeShiFANLI889*+"), + StringUtil.getBase64String("*M#34f?,")); + } catch (Exception e) { + e.printStackTrace(); + } + JSONObject tbs = JSONObject.fromObject(tbSession); + tbOpenid = tbs.optString("openId"); + tbNickName = tbs.optString("nick"); + tbPortrait = tbs.optString("avatarUrl"); + // 娣樺疂ID + tbUserInfo.setTaoBaoUid(tbs.optString("taobao_user_id")); + } + tbUserInfo.setOpenid(tbOpenid); tbUserInfo.setTbName(tbNickName); tbUserInfo.setTbPic(tbPortrait); + try { LoginResult result = userAccountService.login(request, first, system.getAppid(), code, phone, tbUserInfo, wxinstall, loginType); @@ -198,6 +216,25 @@ root.put("type", result.getType()); root.put("data", data); out.print(JsonUtil.loadTrueResult(root)); + + final UserInfo uuser = result.getUser(); + ThreadUtil.run(new Runnable() { + public void run() { + try { + int platformType = 0; + String platform = acceptData.getPlatform(); + if ("android".equals(platform)) { + platformType = 1; + } else if ("ios".equals(platform)) { + platformType = 2; + } + userSystemCouponService.copyLotteryPrize(uuser.getId(), platformType, acceptData.getDevice()); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } catch (UserAccountException e) { try { LogHelper.cookieLog("鐧诲綍鍑洪敊:" + e.getCode() + "-" + e.getMessage()); @@ -206,6 +243,7 @@ } out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMsg())); } + } /** @@ -223,7 +261,8 @@ @RequestMapping(value = "register") public void register(AcceptData acceptData, String tbOpenid, String tbNickName, String tbPortrait, String vcode, String phone, HttpServletRequest request, HttpSession session, PrintWriter out) { - System system = systemService.getSystemCache(acceptData.getPlatform(), acceptData.getPackages()); + BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(), + acceptData.getPackages()); if (system == null) { out.print(JsonUtil.loadFalseResult("绯荤粺涓嶅瓨鍦�")); return; @@ -283,7 +322,8 @@ */ @RequestMapping(value = "connect") public void connect(AcceptData acceptData, long mainUid, long lessUid, HttpSession session, PrintWriter out) { - System system = systemService.getSystemCache(acceptData.getPlatform(), acceptData.getPackages()); + BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(), + acceptData.getPackages()); if (system == null) { out.print(JsonUtil.loadFalseResult("绯荤粺涓嶅瓨鍦�")); return; @@ -316,7 +356,8 @@ */ @RequestMapping(value = "getuid") public void getUid(AcceptData acceptData, String code, String tbOpenid, String phone, PrintWriter out) { - System system = systemService.getSystemCache(acceptData.getPlatform(), acceptData.getPackages()); + BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(), + acceptData.getPackages()); if (system == null) { out.print(JsonUtil.loadFalseResult("绯荤粺涓嶅瓨鍦�")); return; @@ -380,7 +421,8 @@ */ @RequestMapping(value = "bindPhone") public void bindPhone(AcceptData acceptData, Long uid, String vcode, String phone, PrintWriter out) { - System system = systemService.getSystemCache(acceptData.getPlatform(), acceptData.getPackages()); + BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(), + acceptData.getPackages()); if (system == null) { out.print(JsonUtil.loadFalseResult("绯荤粺涓嶅瓨鍦�")); return; @@ -398,15 +440,32 @@ String oldVCode = redisManager.getSMSVCode(phone, SMSHistory.TYPE_LOGIN); - if (!vcode.equalsIgnoreCase(oldVCode)) { - out.print(JsonUtil.loadFalseResult(90001, "楠岃瘉鐮侀敊璇�")); - return; + if (Constant.IS_OUTNET) { + if (!vcode.equalsIgnoreCase(oldVCode)) { + out.print(JsonUtil.loadFalseResult(90001, "楠岃瘉鐮侀敊璇�")); + return; + } + redisManager.clearSMSFrequencyLimit(phone, SMSHistory.TYPE_LOGIN); } - redisManager.clearSMSFrequencyLimit(phone, SMSHistory.TYPE_LOGIN); - try { userAccountService.bindPhone(uid, phone); UserInfo user = userInfoService.getUserByIdWithMybatis(uid); + // 鍒ゆ柇鐢佃瘽鍙风爜鏄惁宸茬粡灏佺 + ForbiddenUserIdentifyCode ic = forbiddenUserIdentifyCodeService + .listByTypeAndIdentifyCode(ForbiddenUserIdentifyCodeTypeEnum.phone, phone); + if (ic != null && ic.getEffective() != null && ic.getEffective()) { + out.print(JsonUtil.loadFalseResult(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC)); + // 灏佺鐢ㄦ埛 + // 灏佺缁戝畾鐨勬甯哥敤鎴� + if (user != null && user.getState() != null && user.getState() == UserInfo.STATE_NORMAL) { + UserInfo update = new UserInfo(uid); + update.setState(UserInfo.STATE_FORBIDDEN); + update.setStateDesc("缁戝畾琚皝绂佺殑鐢佃瘽鍙风爜琚皝绂�"); + userInfoService.updateByPrimaryKeySelective(update); + } + return; + } + JSONObject data = new JSONObject(); data.put("user", UserUtil.filterForClientUser(user)); out.print(JsonUtil.loadTrueResult(data)); @@ -426,7 +485,8 @@ */ @RequestMapping(value = "unBindPhone") public void unBindPhone(AcceptData acceptData, Long uid, String phone, PrintWriter out) { - System system = systemService.getSystemCache(acceptData.getPlatform(), acceptData.getPackages()); + BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(), + acceptData.getPackages()); if (system == null) { out.print(JsonUtil.loadFalseResult("绯荤粺涓嶅瓨鍦�")); return; @@ -462,22 +522,52 @@ @RequestMapping(value = "bindTaoBao") public void bindTaoBao(AcceptData acceptData, Long uid, String tbOpenid, String tbNickName, String tbPortrait, String tbSession, PrintWriter out) { - System system = systemService.getSystemCache(acceptData.getPlatform(), acceptData.getPackages()); + BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(), + acceptData.getPackages()); if (system == null) { out.print(JsonUtil.loadFalseResult("绯荤粺涓嶅瓨鍦�")); return; } + String taoBaoUid = ""; + if (!StringUtil.isNullOrEmpty(tbSession)) { + try { + tbSession = DESUtil.decode(tbSession.replace("\n", ""), StringUtil.getBase64String("YeShiFANLI889*+"), + StringUtil.getBase64String("*M#34f?,")); + } catch (Exception e) { + e.printStackTrace(); + } JSONObject session = JSONObject.fromObject(tbSession); tbOpenid = session.optString("openId"); tbNickName = session.optString("nick"); tbPortrait = session.optString("avatarUrl"); + taoBaoUid = session.optString("taobao_user_id"); } try { userAccountService.bindTaoBao(uid, tbOpenid, tbNickName, tbPortrait); UserInfo user = userInfoService.getUserByIdWithMybatis(uid); + + // 鍒ゆ柇taoBaoUid鏄惁宸茬粡灏佺 + if (!StringUtil.isNullOrEmpty(taoBaoUid)) { + ForbiddenUserIdentifyCode ic = forbiddenUserIdentifyCodeService + .listByTypeAndIdentifyCode(ForbiddenUserIdentifyCodeTypeEnum.taobaoUid, taoBaoUid); + if (ic != null && ic.getEffective() != null && ic.getEffective()) { + out.print(JsonUtil.loadFalseResult(Constant.CODE_FORBIDDEN_USER, + Constant.FORBIDDEN_USER_REASON_DESC)); + // 灏佺鐢ㄦ埛 + // 灏佺缁戝畾鐨勬甯哥敤鎴� + if (user != null && user.getState() != null && user.getState() == UserInfo.STATE_NORMAL) { + UserInfo update = new UserInfo(uid); + update.setState(UserInfo.STATE_FORBIDDEN); + update.setStateDesc("缁戝畾琚皝绂佺殑娣樺疂鍙疯灏佺"); + userInfoService.updateByPrimaryKeySelective(update); + } + return; + } + } + JSONObject data = new JSONObject(); data.put("user", UserUtil.filterForClientUser(user)); out.print(JsonUtil.loadTrueResult(data)); @@ -495,7 +585,8 @@ */ @RequestMapping(value = "unBindTaoBao") public void unBindTaoBao(AcceptData acceptData, Long uid, PrintWriter out) { - System system = systemService.getSystemCache(acceptData.getPlatform(), acceptData.getPackages()); + BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(), + acceptData.getPackages()); if (system == null) { out.print(JsonUtil.loadFalseResult("绯荤粺涓嶅瓨鍦�")); return; @@ -519,7 +610,8 @@ */ @RequestMapping(value = "changeWX") public void changeWX(AcceptData acceptData, Long uid, String code, PrintWriter out) { - System system = systemService.getSystemCache(acceptData.getPlatform(), acceptData.getPackages()); + BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(), + acceptData.getPackages()); if (system == null) { out.print(JsonUtil.loadFalseResult("绯荤粺涓嶅瓨鍦�")); return; @@ -533,6 +625,22 @@ try { userAccountService.changeWXBind(uid, code); UserInfo user = userInfoService.getUserByIdWithMybatis(uid); + // 鍒ゆ柇taoBaoUid鏄惁宸茬粡灏佺 + ForbiddenUserIdentifyCode ic = forbiddenUserIdentifyCodeService + .listByTypeAndIdentifyCode(ForbiddenUserIdentifyCodeTypeEnum.wxUnionId, user.getWxUnionId()); + if (ic != null && ic.getEffective() != null && ic.getEffective()) { + out.print(JsonUtil.loadFalseResult(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC)); + // 灏佺鐢ㄦ埛 + // 灏佺缁戝畾鐨勬甯哥敤鎴� + if (user != null && user.getState() != null && user.getState() == UserInfo.STATE_NORMAL) { + UserInfo update = new UserInfo(uid); + update.setState(UserInfo.STATE_FORBIDDEN); + update.setStateDesc("缁戝畾琚皝绂佺殑寰俊鍙疯灏佺"); + userInfoService.updateByPrimaryKeySelective(update); + } + return; + } + JSONObject data = new JSONObject(); data.put("user", UserUtil.filterForClientUser(user)); out.print(JsonUtil.loadTrueResult(data)); @@ -550,7 +658,8 @@ */ @RequestMapping(value = "getphone") public void getPhone(AcceptData acceptData, Long uid, PrintWriter out) { - System system = systemService.getSystemCache(acceptData.getPlatform(), acceptData.getPackages()); + BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(), + acceptData.getPackages()); if (system == null) { out.print(JsonUtil.loadFalseResult("绯荤粺涓嶅瓨鍦�")); return; @@ -570,7 +679,8 @@ @RequestMapping(value = "verifyvcodeforbind") public void verifyVcodeForbind(AcceptData acceptData, Long uid, String vcode, PrintWriter out) { - System system = systemService.getSystemCache(acceptData.getPlatform(), acceptData.getPackages()); + BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(), + acceptData.getPackages()); if (system == null) { out.print(JsonUtil.loadFalseResult("绯荤粺涓嶅瓨鍦�")); return; @@ -615,7 +725,8 @@ */ @RequestMapping(value = "bindalipay") public void bindAlipay(AcceptData acceptData, Long uid, String name, String account, PrintWriter out) { - System system = systemService.getSystemCache(acceptData.getPlatform(), acceptData.getPackages()); + BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(), + acceptData.getPackages()); if (system == null) { out.print(JsonUtil.loadFalseResult("绯荤粺涓嶅瓨鍦�")); return; @@ -670,7 +781,8 @@ @RequestMapping(value = "bindalipaywithverify") public void bindAlipayWithVerify(AcceptData acceptData, Long uid, String name, String account, PrintWriter out) { - System system = systemService.getSystemCache(acceptData.getPlatform(), acceptData.getPackages()); + BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(), + acceptData.getPackages()); if (system == null) { out.print(JsonUtil.loadFalseResult("绯荤粺涓嶅瓨鍦�")); return; @@ -760,7 +872,8 @@ @RequestMapping(value = "bindalipaywithverifynew") public void bindAlipayWithVerifyNew(AcceptData acceptData, Long uid, String name, String account, PrintWriter out) { - System system = systemService.getSystemCache(acceptData.getPlatform(), acceptData.getPackages()); + BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(), + acceptData.getPackages()); if (system == null) { out.print(JsonUtil.loadFalseResult("绯荤粺涓嶅瓨鍦�")); return; @@ -796,6 +909,23 @@ return; } redisManager.cacheCommonString(key, "1", 120); + + // 鏀粯瀹濈粦瀹� + ForbiddenUserIdentifyCode ic = forbiddenUserIdentifyCodeService + .listByTypeAndIdentifyCode(ForbiddenUserIdentifyCodeTypeEnum.alipayAccount, account); + if (ic != null && ic.getEffective() != null && ic.getEffective()) { + out.print(JsonUtil.loadFalseResult(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC)); + // 灏佺鐢ㄦ埛 + // 灏佺缁戝畾鐨勬甯哥敤鎴� + if (user != null && user.getState() != null && user.getState() == UserInfo.STATE_NORMAL) { + UserInfo update = new UserInfo(uid); + update.setState(UserInfo.STATE_FORBIDDEN); + update.setStateDesc("缁戝畾琚皝绂佺殑鏀粯瀹濊灏佺"); + userInfoService.updateByPrimaryKeySelective(update); + } + return; + } + // 鍙互灞曠ず缁欑敤鎴风湅鐨勯敊璇爜 String[] ALIPAY_CODES = new String[] { "SYSTEM_ERROR", "PERMIT_CHECK_PERM_LIMITED", "PERM_AML_NOT_REALNAME_REV", "PERM_AML_NOT_REALNAME_REV", "PAYEE_USER_INFO_ERROR", "PAYEE_ACC_OCUPIED", @@ -863,16 +993,16 @@ out.print(JsonUtil.loadFalseResult(2, "鐢ㄦ埛涓嶅瓨鍦�")); return; } - BigDecimal moneyToday = inviteGetMoneyService.getMoneyToday(uid + ""); + BigDecimal moneyToday = userMoneyService.getMoneyToday(uid); if (moneyToday == null) { moneyToday = new BigDecimal(0); } - BigDecimal moneyMonth = inviteGetMoneyService.getMoneyMonth(uid + ""); + BigDecimal moneyMonth = userMoneyService.getMoneyMonth(uid); if (moneyMonth == null) { moneyMonth = new BigDecimal(0); } - BigDecimal moneyLastMonth = inviteGetMoneyService.getMoneyLastMonth(uid + ""); + BigDecimal moneyLastMonth = userMoneyService.getMoneyLastMonth(uid); BigDecimal unOpenmoney = hongBaoV2Service.getUnRecievedFanLiMoney(uid); BigDecimal totalFanMoney = hongBaoV2Service.getTotalFanLiMoney(uid); JSONObject data = new JSONObject(); @@ -941,15 +1071,8 @@ } else { - tbPid = tbPidService.getTBPid(Long.parseLong(uid), PidUser.TYPE_FANLI_IOS); - if (tbPid != null) { - String siteId = tbPid.getPid().split("_")[2]; - String adzoneId = tbPid.getPid().split("_")[3]; - TaoBaoUnionConfig config = taoBaoUnionConfigService.getConfigByAppIdCache(siteId); - clientTBPid = new ClientTBPid(config.getAppKey(), tbPid.getPid(), siteId, adzoneId); - } else { - clientTBPid = tbPidService.getIOSDefault(); - } + clientTBPid = tbPidService.getIOSDefault(); + } } else { -- Gitblit v1.8.0