private final String password;
+ private final boolean unifios;
+
+ private String csrfToken;
+
private final Gson gson;
- public UniFiController(HttpClient httpClient, String host, int port, String username, String password) {
+ public UniFiController(HttpClient httpClient, String host, int port, String username, String password,
+ boolean unifios) {
this.httpClient = httpClient;
this.host = host;
this.port = port;
this.username = username;
this.password = password;
+ this.unifios = unifios;
+ this.csrfToken = "";
UniFiSiteInstanceCreator siteInstanceCreator = new UniFiSiteInstanceCreator(this);
UniFiDeviceInstanceCreator deviceInstanceCreator = new UniFiDeviceInstanceCreator(this);
UniFiClientInstanceCreator clientInstanceCreator = new UniFiClientInstanceCreator(this);
}
public void login() throws UniFiException {
+ csrfToken = "";
+
UniFiControllerRequest<Void> req = newRequest(Void.class);
- req.setPath("/api/login");
+ req.setPath(unifios ? "/api/auth/login" : "/api/login");
req.setBodyParameter("username", username);
req.setBodyParameter("password", password);
// scurb: Changed strict = false to make blocking feature work
}
public void logout() throws UniFiException {
+ csrfToken = "";
UniFiControllerRequest<Void> req = newRequest(Void.class);
- req.setPath("/logout");
+ req.setPath(unifios ? "/api/auth/logout" : "/logout");
executeRequest(req);
}
protected void block(UniFiClient client, boolean blocked) throws UniFiException {
UniFiControllerRequest<Void> req = newRequest(Void.class);
- req.setPath("/api/s/" + client.getSite().getName() + "/cmd/stamgr");
+ req.setAPIPath("/api/s/" + client.getSite().getName() + "/cmd/stamgr");
req.setBodyParameter("cmd", blocked ? "block-sta" : "unblock-sta");
req.setBodyParameter("mac", client.getMac());
executeRequest(req);
protected void reconnect(UniFiClient client) throws UniFiException {
UniFiControllerRequest<Void> req = newRequest(Void.class);
- req.setPath("/api/s/" + client.getSite().getName() + "/cmd/stamgr");
+ req.setAPIPath("/api/s/" + client.getSite().getName() + "/cmd/stamgr");
req.setBodyParameter("cmd", "kick-sta");
req.setBodyParameter("mac", client.getMac());
executeRequest(req);
// Internal API
private <T> UniFiControllerRequest<T> newRequest(Class<T> responseType) {
- return new UniFiControllerRequest<>(responseType, gson, httpClient, host, port);
+ return new UniFiControllerRequest<>(responseType, gson, httpClient, host, port, csrfToken, unifios);
}
private <T> @Nullable T executeRequest(UniFiControllerRequest<T> request) throws UniFiException {
T result;
try {
result = request.execute();
+ csrfToken = request.getCsrfToken();
} catch (UniFiExpiredSessionException e) {
login();
result = executeRequest(request);
private UniFiSiteCache getSites() throws UniFiException {
UniFiControllerRequest<UniFiSite[]> req = newRequest(UniFiSite[].class);
- req.setPath("/api/self/sites");
+ req.setAPIPath("/api/self/sites");
UniFiSite[] sites = executeRequest(req);
UniFiSiteCache cache = new UniFiSiteCache();
if (sites != null) {
private UniFiDeviceCache getDevices(UniFiSite site) throws UniFiException {
UniFiControllerRequest<UniFiDevice[]> req = newRequest(UniFiDevice[].class);
- req.setPath("/api/s/" + site.getName() + "/stat/device");
+ req.setAPIPath("/api/s/" + site.getName() + "/stat/device");
UniFiDevice[] devices = executeRequest(req);
UniFiDeviceCache cache = new UniFiDeviceCache();
if (devices != null) {
private UniFiClientCache getClients(UniFiSite site) throws UniFiException {
UniFiControllerRequest<UniFiClient[]> req = newRequest(UniFiClient[].class);
- req.setPath("/api/s/" + site.getName() + "/stat/sta");
+ req.setAPIPath("/api/s/" + site.getName() + "/stat/sta");
UniFiClient[] clients = executeRequest(req);
UniFiClientCache cache = new UniFiClientCache();
if (clients != null) {
private UniFiClientCache getInsights(UniFiSite site) throws UniFiException {
UniFiControllerRequest<UniFiClient[]> req = newRequest(UniFiClient[].class);
- req.setPath("/api/s/" + site.getName() + "/stat/alluser");
+ req.setAPIPath("/api/s/" + site.getName() + "/stat/alluser");
req.setQueryParameter("within", 168); // scurb: Changed to 7 days.
UniFiClient[] clients = executeRequest(req);
UniFiClientCache cache = new UniFiClientCache();
private String path = "/";
+ private final boolean unifios;
+
+ private String csrfToken;
+
private Map<String, String> queryParameters = new HashMap<>();
private Map<String, String> bodyParameters = new HashMap<>();
// Public API
- public UniFiControllerRequest(Class<T> resultType, Gson gson, HttpClient httpClient, String host, int port) {
+ public UniFiControllerRequest(Class<T> resultType, Gson gson, HttpClient httpClient, String host, int port,
+ String csrfToken, boolean unifios) {
this.resultType = resultType;
this.gson = gson;
this.httpClient = httpClient;
this.host = host;
this.port = port;
+ this.csrfToken = csrfToken;
+ this.unifios = unifios;
+ }
+
+ public void setAPIPath(String relativePath) {
+ if (unifios) {
+ this.path = "/proxy/network" + relativePath;
+ } else {
+ this.path = relativePath;
+ }
}
public void setPath(String path) {
if (logger.isTraceEnabled()) {
logger.trace("<< {} {} \n{}", status, HttpStatus.getMessage(status), prettyPrintJson(content));
}
+
+ String csrfToken = response.getHeaders().get("X-CSRF-Token");
+ if (csrfToken != null && !csrfToken.isEmpty()) {
+ this.csrfToken = csrfToken;
+ }
break;
case HttpStatus.BAD_REQUEST_400:
throw new UniFiInvalidCredentialsException("Invalid Credentials");
return response;
}
+ public String getCsrfToken() {
+ return csrfToken;
+ }
+
private Request newRequest() {
HttpMethod method = bodyParameters.isEmpty() ? HttpMethod.GET : HttpMethod.POST;
HttpURI uri = new HttpURI(HttpScheme.HTTPS.asString(), host, port, path);
StandardCharsets.UTF_8);
request = request.content(content);
}
+
+ if (!csrfToken.isEmpty())
+ request.header("x-csrf-token", this.csrfToken);
+
return request;
}