/** * Copyright © 2016-2017 The Thingsboard Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.thingsboard.server.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.page.TextPageData; import org.thingsboard.server.common.data.page.TextPageLink; import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.security.UserCredentials; import org.thingsboard.server.exception.ThingsboardErrorCode; import org.thingsboard.server.exception.ThingsboardException; import org.thingsboard.server.service.mail.MailService; import org.thingsboard.server.service.security.model.SecurityUser; import javax.servlet.http.HttpServletRequest; @RestController @RequestMapping("/api") public class UserController extends BaseController { @Autowired private MailService mailService; @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") @RequestMapping(value = "/user/{userId}", method = RequestMethod.GET) @ResponseBody public User getUserById(@PathVariable("userId") String strUserId) throws ThingsboardException { checkParameter("userId", strUserId); try { UserId userId = new UserId(toUUID(strUserId)); SecurityUser authUser = getCurrentUser(); if (authUser.getAuthority() == Authority.CUSTOMER_USER && !authUser.getId().equals(userId)) { throw new ThingsboardException("You don't have permission to perform this operation!", ThingsboardErrorCode.PERMISSION_DENIED); } return checkUserId(userId); } catch (Exception e) { throw handleException(e); } } @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')") @RequestMapping(value = "/user", method = RequestMethod.POST) @ResponseBody public User saveUser(@RequestBody User user, HttpServletRequest request) throws ThingsboardException { try { SecurityUser authUser = getCurrentUser(); if (authUser.getAuthority() == Authority.CUSTOMER_USER && !authUser.getId().equals(user.getId())) { throw new ThingsboardException("You don't have permission to perform this operation!", ThingsboardErrorCode.PERMISSION_DENIED); } boolean sendEmail = user.getId() == null; if (getCurrentUser().getAuthority() == Authority.TENANT_ADMIN) { user.setTenantId(getCurrentUser().getTenantId()); } User savedUser = checkNotNull(userService.saveUser(user)); if (sendEmail) { UserCredentials userCredentials = userService.findUserCredentialsByUserId(savedUser.getId()); String baseUrl = constructBaseUrl(request); String activateUrl = String.format("%s/api/noauth/activate?activateToken=%s", baseUrl, userCredentials.getActivateToken()); String email = savedUser.getEmail(); try { mailService.sendActivationEmail(activateUrl, email); } catch (ThingsboardException e) { userService.deleteUser(savedUser.getId()); throw e; } } return savedUser; } catch (Exception e) { throw handleException(e); } } @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") @RequestMapping(value = "/user/sendActivationMail", method = RequestMethod.POST) @ResponseStatus(value = HttpStatus.OK) public void sendActivationEmail( @RequestParam(value = "email") String email, HttpServletRequest request) throws ThingsboardException { try { User user = checkNotNull(userService.findUserByEmail(email)); UserCredentials userCredentials = userService.findUserCredentialsByUserId(user.getId()); if (!userCredentials.isEnabled()) { String baseUrl = constructBaseUrl(request); String activateUrl = String.format("%s/api/noauth/activate?activateToken=%s", baseUrl, userCredentials.getActivateToken()); mailService.sendActivationEmail(activateUrl, email); } else { throw new ThingsboardException("User is already active!", ThingsboardErrorCode.BAD_REQUEST_PARAMS); } } catch (Exception e) { throw handleException(e); } } @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") @RequestMapping(value = "/user/{userId}", method = RequestMethod.DELETE) @ResponseStatus(value = HttpStatus.OK) public void deleteUser(@PathVariable("userId") String strUserId) throws ThingsboardException { checkParameter("userId", strUserId); try { UserId userId = new UserId(toUUID(strUserId)); checkUserId(userId); userService.deleteUser(userId); } catch (Exception e) { throw handleException(e); } } @PreAuthorize("hasAuthority('SYS_ADMIN')") @RequestMapping(value = "/tenant/{tenantId}/users", params = { "limit" }, method = RequestMethod.GET) @ResponseBody public TextPageData<User> getTenantAdmins( @PathVariable("tenantId") String strTenantId, @RequestParam int limit, @RequestParam(required = false) String textSearch, @RequestParam(required = false) String idOffset, @RequestParam(required = false) String textOffset) throws ThingsboardException { checkParameter("tenantId", strTenantId); try { TenantId tenantId = new TenantId(toUUID(strTenantId)); TextPageLink pageLink = createPageLink(limit, textSearch, idOffset, textOffset); return checkNotNull(userService.findTenantAdmins(tenantId, pageLink)); } catch (Exception e) { throw handleException(e); } } @PreAuthorize("hasAuthority('TENANT_ADMIN')") @RequestMapping(value = "/customer/{customerId}/users", params = { "limit" }, method = RequestMethod.GET) @ResponseBody public TextPageData<User> getCustomerUsers( @PathVariable("customerId") String strCustomerId, @RequestParam int limit, @RequestParam(required = false) String textSearch, @RequestParam(required = false) String idOffset, @RequestParam(required = false) String textOffset) throws ThingsboardException { checkParameter("customerId", strCustomerId); try { CustomerId customerId = new CustomerId(toUUID(strCustomerId)); checkCustomerId(customerId); TextPageLink pageLink = createPageLink(limit, textSearch, idOffset, textOffset); TenantId tenantId = getCurrentUser().getTenantId(); return checkNotNull(userService.findCustomerUsers(tenantId, customerId, pageLink)); } catch (Exception e) { throw handleException(e); } } }