-
-
Notifications
You must be signed in to change notification settings - Fork 266
/
Grant.java
98 lines (87 loc) · 2.53 KB
/
Grant.java
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
package org.basex.core.cmd;
import static org.basex.core.Text.*;
import java.io.IOException;
import org.basex.core.CommandBuilder;
import org.basex.core.User;
import org.basex.core.Commands.CmdPerm;
import org.basex.data.Data;
import org.basex.util.Util;
/**
* Evaluates the 'grant' command and grants permissions to users.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class Grant extends AUser {
/** Permission. */
private int prm = -1;
/**
* Default constructor.
* @param perm permission
* @param user user name
*/
public Grant(final Object perm, final String user) {
this(perm, user, null);
}
/**
* Constructor, specifying a certain database.
* @param perm permission
* @param user user name
* @param db database
*/
public Grant(final Object perm, final String user, final String db) {
super(perm.toString(), user, db);
}
@Override
protected boolean run() {
// find permission
final CmdPerm cmd = getOption(CmdPerm.class);
if(cmd == CmdPerm.NONE) {
prm = User.NONE;
} else if(cmd == CmdPerm.READ) {
prm = User.READ;
} else if(cmd == CmdPerm.WRITE) {
prm = User.WRITE;
} else if(cmd == CmdPerm.CREATE && args[2] == null) {
prm = User.CREATE;
} else if(cmd == CmdPerm.ADMIN && args[2] == null) {
prm = User.ADMIN;
}
if(prm == -1) return error(PERMINV, args[0]);
return run(1, false);
}
@Override
protected boolean run(final String user, final String db) {
// admin cannot be modified
if(user.equals(ADMIN)) return !info(USERADMIN);
// set global permissions
if(db == null) {
context.users.get(user).perm = prm;
context.users.write();
return info(GRANT, args[0], user);
}
// set local permissions
try {
final Data data = Open.open(db, context);
User u = data.meta.users.get(user);
// add local user reference
if(u == null) {
u = context.users.get(user).copy();
data.meta.users.create(u);
}
u.perm = prm;
data.meta.dirty = true;
data.flush();
Close.close(data, context);
return info(GRANTON, args[0], user, db);
} catch(final IOException ex) {
Util.debug(ex);
final String msg = ex.getMessage();
return !info(msg.isEmpty() ? DBOPENERR : msg, db);
}
}
@Override
public void build(final CommandBuilder cb) {
cb.init().arg(0).arg(ON, 2).arg(TO, 1);
}
}