Skip to content

Commit 75d8596

Browse files
author
j.bebendorf
committed
Added grouping for the Accessible in order to improve security.
1 parent a798304 commit 75d8596

File tree

4 files changed

+45
-8
lines changed

4 files changed

+45
-8
lines changed
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package org.javawebstack.orm;
22

33
import org.javawebstack.orm.query.Query;
4+
import org.javawebstack.orm.query.QueryGroup;
45

56
public interface Accessible {
6-
<T extends Model> Query<T> access(Query<T> query, Object accessor);
7+
<T extends Model> QueryGroup<T> access(Query<T> query, QueryGroup<T> accessChecks, Object accessor);
78
}

src/main/java/org/javawebstack/orm/Repo.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,11 @@ public Query<T> whereId(Object right) {
7373
}
7474

7575
public Query<T> accessible(Object accessor) {
76-
return accessible(query(), accessor);
76+
return query().accessible(accessor);
7777
}
7878

79-
public Query<T> accessible(Query<T> query, Object accessor) {
80-
return accessible == null ? query : accessible.access(query, accessor);
79+
public Accessible getAccessible() {
80+
return accessible;
8181
}
8282

8383
public void save(T entry) {

src/main/java/org/javawebstack/orm/query/Query.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ public class Query<T extends Model> {
3030
private boolean withDeleted = false;
3131
private final List<QueryColumn> groupBy = new ArrayList<>();
3232
private QueryGroup<T> having;
33+
private boolean applyAccessible = false;
34+
private Object accessor;
3335

3436
public Query(Class<T> model) {
3537
this(Repo.get(model), model);
@@ -53,6 +55,14 @@ public boolean isWithDeleted() {
5355
return withDeleted;
5456
}
5557

58+
public boolean shouldApplyAccessible() {
59+
return applyAccessible;
60+
}
61+
62+
public Object getAccessor() {
63+
return accessor;
64+
}
65+
5666
public QueryGroup<T> getWhereGroup() {
5767
return where;
5868
}
@@ -318,7 +328,9 @@ public Query<T> has(Query<?> relation) {
318328
}
319329

320330
public Query<T> accessible(Object accessor) {
321-
return repo.accessible(this, accessor);
331+
this.applyAccessible = true;
332+
this.accessor = accessor;
333+
return this;
322334
}
323335

324336
public Query<T> filter(Map<String, String> filter) {

src/main/java/org/javawebstack/orm/wrapper/builder/MySQLQueryStringBuilder.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package org.javawebstack.orm.wrapper.builder;
22

3-
import org.javawebstack.orm.Repo;
4-
import org.javawebstack.orm.SQLMapper;
5-
import org.javawebstack.orm.TableInfo;
3+
import org.javawebstack.orm.*;
4+
import org.javawebstack.orm.exception.ORMQueryException;
65
import org.javawebstack.orm.query.*;
76

7+
import java.lang.reflect.Field;
8+
import java.lang.reflect.InvocationTargetException;
9+
import java.lang.reflect.Method;
810
import java.sql.Timestamp;
911
import java.time.Instant;
1012
import java.util.*;
@@ -15,6 +17,16 @@ public class MySQLQueryStringBuilder implements QueryStringBuilder {
1517

1618
public static final MySQLQueryStringBuilder INSTANCE = new MySQLQueryStringBuilder();
1719

20+
private static Method accessibleAccessMethod;
21+
22+
static {
23+
try {
24+
accessibleAccessMethod = Accessible.class.getDeclaredMethod("access", Query.class, QueryGroup.class, Object.class);
25+
} catch (NoSuchMethodException e) {
26+
e.printStackTrace();
27+
}
28+
}
29+
1830
public SQLQueryString buildInsert(TableInfo info, Map<String, Object> values) {
1931
List<Object> params = new ArrayList<>();
2032
StringBuilder sb = new StringBuilder("INSERT INTO `");
@@ -48,6 +60,18 @@ public SQLQueryString buildQuery(Query<?> query) {
4860
.append('`');
4961
QueryGroup<?> where = query.getWhereGroup();
5062
checkWithDeleted(repo, query.isWithDeleted(), where);
63+
if(query.shouldApplyAccessible()) {
64+
QueryGroup<?> actualWhere = where;
65+
where = new QueryGroup<>()
66+
.and(q -> (QueryGroup<Model>) actualWhere)
67+
.and(q -> {
68+
try {
69+
return (QueryGroup<Model>) accessibleAccessMethod.invoke(repo.getAccessible(), query, q, query.getAccessor());
70+
} catch (IllegalAccessException | InvocationTargetException e) {
71+
throw new ORMQueryException(e);
72+
}
73+
});
74+
}
5175
if (!where.getQueryElements().isEmpty()) {
5276
SQLQueryString qs = convertGroup(repo.getInfo(), where);
5377
sb.append(" WHERE ").append(qs.getQuery());

0 commit comments

Comments
 (0)