1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.codelibs.fess.app.service;
17
18 import static org.codelibs.core.stream.StreamUtil.stream;
19
20 import java.util.HashSet;
21 import java.util.List;
22 import java.util.Set;
23
24 import javax.annotation.Resource;
25 import javax.servlet.http.HttpServletRequest;
26
27 import org.codelibs.core.beans.util.BeanUtil;
28 import org.codelibs.core.lang.StringUtil;
29 import org.codelibs.fess.Constants;
30 import org.codelibs.fess.app.pager.AccessTokenPager;
31 import org.codelibs.fess.es.config.cbean.AccessTokenCB;
32 import org.codelibs.fess.es.config.exbhv.AccessTokenBhv;
33 import org.codelibs.fess.es.config.exentity.AccessToken;
34 import org.codelibs.fess.exception.InvalidAccessTokenException;
35 import org.codelibs.fess.mylasta.direction.FessConfig;
36 import org.codelibs.fess.taglib.FessFunctions;
37 import org.codelibs.fess.util.ComponentUtil;
38 import org.dbflute.cbean.result.PagingResultBean;
39 import org.dbflute.optional.OptionalEntity;
40
41 public class AccessTokenService {
42
43 @Resource
44 protected AccessTokenBhv accessTokenBhv;
45
46 @Resource
47 protected FessConfig fessConfig;
48
49 public List<AccessToken> getAccessTokenList(final AccessTokenPager accessTokenPager) {
50
51 final PagingResultBean<AccessToken> accessTokenList = accessTokenBhv.selectPage(cb -> {
52 cb.paging(accessTokenPager.getPageSize(), accessTokenPager.getCurrentPageNumber());
53 setupListCondition(cb, accessTokenPager);
54 });
55
56
57 BeanUtil.copyBeanToBean(accessTokenList, accessTokenPager, option -> option.include(Constants.PAGER_CONVERSION_RULE));
58 accessTokenPager.setPageNumberList(
59 accessTokenList.pageRange(op -> op.rangeSize(fessConfig.getPagingPageRangeSizeAsInteger())).createPageNumberList());
60
61 return accessTokenList;
62 }
63
64 public OptionalEntity<AccessToken> getAccessToken(final String id) {
65 return accessTokenBhv.selectByPK(id);
66 }
67
68 public void store(final AccessToken accessToken) {
69
70 accessTokenBhv.insertOrUpdate(accessToken, op -> op.setRefreshPolicy(Constants.TRUE));
71
72 }
73
74 public void delete(final AccessToken accessToken) {
75
76 accessTokenBhv.delete(accessToken, op -> op.setRefreshPolicy(Constants.TRUE));
77
78 }
79
80 protected void setupListCondition(final AccessTokenCB cb, final AccessTokenPager accessTokenPager) {
81 if (accessTokenPager.id != null) {
82 cb.query().docMeta().setId_Equal(accessTokenPager.id);
83 }
84
85
86
87 cb.query().addOrderBy_Name_Asc();
88 cb.query().addOrderBy_CreatedTime_Asc();
89
90
91
92 }
93
94 public OptionalEntity<Set<String>> getPermissions(final HttpServletRequest request) {
95 final String token = ComponentUtil.getAccessTokenHelper().getAccessTokenFromRequest(request);
96 if (StringUtil.isNotBlank(token)) {
97 return accessTokenBhv.selectEntity(cb -> {
98 cb.query().setToken_Term(token);
99 }).map(accessToken -> {
100 final Set<String> permissionSet = new HashSet<>();
101 final Long expiredTime = accessToken.getExpiredTime();
102 if (expiredTime != null && expiredTime.longValue() > 0
103 && expiredTime.longValue() < ComponentUtil.getSystemHelper().getCurrentTimeAsLong()) {
104 throw new InvalidAccessTokenException("invalid_token",
105 "The token is expired(" + FessFunctions.formatDate(FessFunctions.date(expiredTime)) + ").");
106 }
107 stream(accessToken.getPermissions()).of(stream -> stream.forEach(permissionSet::add));
108 final String name = accessToken.getParameterName();
109 stream(request.getParameterValues(name)).of(stream -> stream.filter(StringUtil::isNotBlank).forEach(permissionSet::add));
110 return OptionalEntity.of(permissionSet);
111 }).orElseThrow(() -> new InvalidAccessTokenException("invalid_token", "Invalid token: " + token));
112 }
113 return OptionalEntity.empty();
114 }
115 }