mirror of
https://github.com/traccar/traccar.git
synced 2026-02-01 19:23:51 -05:00
Add user expiration and device limit
This commit is contained in:
@@ -107,5 +107,15 @@
|
||||
<column name="category" type="VARCHAR(128)" />
|
||||
</addColumn>
|
||||
|
||||
<addColumn tableName="users">
|
||||
<column name="disabled" type="BOOLEAN" defaultValueBoolean="false" />
|
||||
</addColumn>
|
||||
<addColumn tableName="users">
|
||||
<column name="expirationtime" type="TIMESTAMP" />
|
||||
</addColumn>
|
||||
<addColumn tableName="users">
|
||||
<column name="devicelimit" type="INT" defaultValueNumeric="0" />
|
||||
</addColumn>
|
||||
|
||||
</changeSet>
|
||||
</databaseChangeLog>
|
||||
|
||||
@@ -62,8 +62,8 @@
|
||||
</entry>
|
||||
|
||||
<entry key='database.insertUser'>
|
||||
INSERT INTO users (name, email, hashedPassword, salt, admin, map, distanceUnit, speedUnit, latitude, longitude, zoom, twelveHourFormat, attributes)
|
||||
VALUES (:name, :email, :hashedPassword, :salt, :admin, :map, :distanceUnit, :speedUnit, :latitude, :longitude, :zoom, :twelveHourFormat, :attributes)
|
||||
INSERT INTO users (name, email, hashedPassword, salt, admin, map, distanceUnit, speedUnit, latitude, longitude, zoom, twelveHourFormat, coordinateFormat, disabled, expirationTime, deviceLimit, attributes)
|
||||
VALUES (:name, :email, :hashedPassword, :salt, :admin, :map, :distanceUnit, :speedUnit, :latitude, :longitude, :zoom, :twelveHourFormat, :coordinateFormat, :disabled, :expirationTime, :deviceLimit, :attributes)
|
||||
</entry>
|
||||
|
||||
<entry key='database.updateUser'>
|
||||
@@ -78,6 +78,10 @@
|
||||
longitude = :longitude,
|
||||
zoom = :zoom,
|
||||
twelveHourFormat = :twelveHourFormat,
|
||||
coordinateFormat = :coordinateFormat,
|
||||
disabled = :disabled,
|
||||
expirationTime = :expirationTime,
|
||||
deviceLimit = :deviceLimit,
|
||||
attributes = :attributes
|
||||
WHERE id = :id
|
||||
</entry>
|
||||
|
||||
@@ -67,7 +67,7 @@ public class SecurityRequestFilter implements ContainerRequestFilter {
|
||||
|
||||
try {
|
||||
String[] auth = decodeBasicAuth(authHeader);
|
||||
User user = Context.getDataManager().login(auth[0], auth[1]);
|
||||
User user = Context.getPermissionsManager().login(auth[0], auth[1]);
|
||||
if (user != null) {
|
||||
Context.getStatisticsManager().registerRequest(user.getId());
|
||||
securityContext = new UserSecurityContext(new UserPrincipal(user.getId()));
|
||||
|
||||
@@ -58,6 +58,13 @@ public class DeviceResource extends BaseResource {
|
||||
@POST
|
||||
public Response add(Device entity) throws SQLException {
|
||||
Context.getPermissionsManager().checkReadonly(getUserId());
|
||||
int deviceLimit = Context.getPermissionsManager().getUser(getUserId()).getDeviceLimit();
|
||||
if (deviceLimit != 0) {
|
||||
int deviceCount = Context.getPermissionsManager().getDevicePermissions(getUserId()).size();
|
||||
if (deviceCount >= deviceLimit) {
|
||||
throw new SecurityException("User device limit reached");
|
||||
}
|
||||
}
|
||||
Context.getDeviceManager().addDevice(entity);
|
||||
Context.getDataManager().linkDevice(getUserId(), entity.getId());
|
||||
Context.getPermissionsManager().refreshPermissions();
|
||||
|
||||
@@ -64,7 +64,7 @@ public class SessionResource extends BaseResource {
|
||||
}
|
||||
}
|
||||
if (email != null && password != null) {
|
||||
User user = Context.getDataManager().login(email, password);
|
||||
User user = Context.getPermissionsManager().login(email, password);
|
||||
if (user != null) {
|
||||
userId = user.getId();
|
||||
request.getSession().setAttribute(USER_ID_KEY, userId);
|
||||
|
||||
@@ -60,13 +60,16 @@ public class UserResource extends BaseResource {
|
||||
@Path("{id}")
|
||||
@PUT
|
||||
public Response update(@PathParam("id") long id, User entity) throws SQLException {
|
||||
if (entity.getAdmin()) {
|
||||
User old = Context.getPermissionsManager().getUser(entity.getId());
|
||||
if (old.getExpirationTime() == null && entity.getExpirationTime() != null
|
||||
|| old.getExpirationTime() != null && !old.getExpirationTime().equals(entity.getExpirationTime())
|
||||
|| old.getAdmin() != entity.getAdmin()
|
||||
|| old.getReadonly() != entity.getReadonly()
|
||||
|| old.getDisabled() != entity.getDisabled()
|
||||
|| old.getDeviceLimit() != entity.getDeviceLimit()) {
|
||||
Context.getPermissionsManager().checkAdmin(getUserId());
|
||||
} else {
|
||||
Context.getPermissionsManager().checkUser(getUserId(), entity.getId());
|
||||
if (!entity.getReadonly()) {
|
||||
Context.getPermissionsManager().checkReadonly(entity.getId());
|
||||
}
|
||||
}
|
||||
Context.getPermissionsManager().updateUser(entity);
|
||||
if (Context.getNotificationManager() != null) {
|
||||
|
||||
@@ -217,11 +217,11 @@ public class PermissionsManager {
|
||||
|
||||
public User login(String email, String password) throws SQLException {
|
||||
User user = dataManager.login(email, password);
|
||||
if (user != null && users.get(user.getId()) != null) {
|
||||
if (user != null && !user.getDisabled() && (user.getExpirationTime() == null
|
||||
|| user.getExpirationTime().getTime() > System.currentTimeMillis())) {
|
||||
return users.get(user.getId());
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -18,6 +18,8 @@ package org.traccar.model;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import org.traccar.helper.Hashing;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
public class User extends Extensible {
|
||||
|
||||
private String name;
|
||||
@@ -140,6 +142,44 @@ public class User extends Extensible {
|
||||
this.coordinateFormat = coordinateFormat;
|
||||
}
|
||||
|
||||
private boolean disabled;
|
||||
|
||||
public boolean getDisabled() {
|
||||
return disabled;
|
||||
}
|
||||
|
||||
public void setDisabled(boolean disabled) {
|
||||
this.disabled = disabled;
|
||||
}
|
||||
|
||||
private Date expirationTime;
|
||||
|
||||
public Date getExpirationTime() {
|
||||
if (expirationTime != null) {
|
||||
return new Date(expirationTime.getTime());
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void setExpirationTime(Date expirationTime) {
|
||||
if (expirationTime != null) {
|
||||
this.expirationTime = new Date(expirationTime.getTime());
|
||||
} else {
|
||||
this.expirationTime = null;
|
||||
}
|
||||
}
|
||||
|
||||
private int deviceLimit;
|
||||
|
||||
public int getDeviceLimit() {
|
||||
return deviceLimit;
|
||||
}
|
||||
|
||||
public void setDeviceLimit(int deviceLimit) {
|
||||
this.deviceLimit = deviceLimit;
|
||||
}
|
||||
|
||||
public String getPassword() {
|
||||
return null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user