forked from Acode-Foundation/Acode
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTee.java
More file actions
136 lines (103 loc) · 3.96 KB
/
Tee.java
File metadata and controls
136 lines (103 loc) · 3.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package com.foxdebug.acode.rk.plugin;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.UUID;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.HashSet;
public class Tee extends CordovaPlugin {
// pluginId : token
private /*static*/ final Map<String, String> tokenStore = new HashMap<>();
//assigned tokens
private /*static*/ final HashSet<String> disclosed = new HashSet<>();
// token : list of permissions
private /*static*/ final Map<String, List<String>> permissionStore = new HashMap<>();
@Override
public boolean execute(String action, JSONArray args, CallbackContext callback)
throws JSONException {
if ("requestToken".equals(action)) {
String pluginId = args.getString(0);
String pluginJson = args.getString(1);
handleTokenRequest(pluginId, pluginJson, callback);
return true;
}
if ("grantedPermission".equals(action)) {
String token = args.getString(0);
String permission = args.getString(1);
if (!permissionStore.containsKey(token)) {
callback.error("INVALID_TOKEN");
return true;
}
boolean granted = grantedPermission(token, permission);
callback.success(granted ? 1 : 0);
return true;
}
if ("listAllPermissions".equals(action)) {
String token = args.getString(0);
if (!permissionStore.containsKey(token)) {
callback.error("INVALID_TOKEN");
return true;
}
List<String> permissions = listAllPermissions(token);
JSONArray result = new JSONArray(permissions);
callback.success(result);
return true;
}
return false;
}
//============================================================
//do not change function signatures
public boolean isTokenValid(String token, String pluginId) {
String storedToken = tokenStore.get(pluginId);
return storedToken != null && token.equals(storedToken);
}
public boolean grantedPermission(String token, String permission) {
List<String> permissions = permissionStore.get(token);
return permissions != null && permissions.contains(permission);
}
public List<String> listAllPermissions(String token) {
List<String> permissions = permissionStore.get(token);
if (permissions == null) {
return new ArrayList<>();
}
return new ArrayList<>(permissions); // return copy (safe)
}
//============================================================
private synchronized void handleTokenRequest(
String pluginId,
String pluginJson,
CallbackContext callback
) {
if (disclosed.contains(pluginId)) {
callback.error("TOKEN_ALREADY_ISSUED");
return;
}
String token = tokenStore.get(pluginId);
if (token == null) {
token = UUID.randomUUID().toString();
tokenStore.put(pluginId, token);
}
try {
JSONObject json = new JSONObject(pluginJson);
JSONArray permissions = json.optJSONArray("permissions");
List<String> permissionList = new ArrayList<>();
if (permissions != null) {
for (int i = 0; i < permissions.length(); i++) {
permissionList.add(permissions.getString(i));
}
}
// Bind permissions to token
permissionStore.put(token, permissionList);
} catch (JSONException e) {
callback.error("INVALID_PLUGIN_JSON");
return;
}
disclosed.add(pluginId);
callback.success(token);
}
}