/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.apache.usergrid.chop.webapp.view.user; import java.io.IOException; import java.util.HashMap; import java.util.Map; import com.vaadin.shared.ui.label.ContentMode; import com.vaadin.ui.Label; import com.vaadin.ui.TabSheet; import org.apache.usergrid.chop.webapp.view.util.UIUtil; import org.junit.Assert; import org.apache.commons.lang.StringUtils; import org.apache.usergrid.chop.api.ProviderParams; import org.apache.usergrid.chop.stack.User; import org.apache.usergrid.chop.webapp.dao.ProviderParamsDao; import org.apache.usergrid.chop.webapp.dao.UserDao; import org.apache.usergrid.chop.webapp.dao.model.BasicProviderParams; import org.apache.usergrid.chop.webapp.service.InjectorFactory; import org.apache.usergrid.chop.webapp.service.shiro.ShiroRealm; import org.apache.usergrid.chop.webapp.view.main.TabSheetManager; import com.vaadin.ui.AbsoluteLayout; import com.vaadin.ui.Button; import com.vaadin.ui.FormLayout; import com.vaadin.ui.Notification; import com.vaadin.ui.PasswordField; import com.vaadin.ui.TextField; public class UserLayout extends AbsoluteLayout { private final UserDao userDao = InjectorFactory.getInstance( UserDao.class ); private final ProviderParamsDao providerParamsDao = InjectorFactory.getInstance( ProviderParamsDao.class ); private final TextField usernameField = new TextField( "Username:" ); private final PasswordField passwordField = new PasswordField( "Password:" ); private final TextField accessKeyField = new TextField( "Access Key:" ); private final TextField imageField = new TextField( "Image ID:" ); private final TextField instanceTypeField = new TextField( "Instance Type:" ); private final TextField secretKeyField = new TextField( "Secret Key:" ); private final TextField keyPairNameField = new TextField( "Key Pair Name:" ); private final Label formTitle = new Label( "<b>User Information</b>", ContentMode.HTML ); private final Button saveButton = new Button( "Save" ); private final Button deleteButton = new Button( "Delete" ); private final KeyListLayout keyListLayout = new KeyListLayout(); private final TabSheetManager tabSheetManager; private final String username; UserLayout( String username, TabSheetManager tabSheetManager ) { this.username = username; this.tabSheetManager = tabSheetManager; addItems(); loadData( username ); } UserLayout( String username, TabSheetManager tabSheetManager, boolean hasAuthority ){ this.username = username; this.tabSheetManager = tabSheetManager; addItems( hasAuthority ); loadData( username, hasAuthority ); } private void loadData( String username ) { if ( StringUtils.isEmpty( username ) ) { deleteButton.setVisible( false ); keyListLayout.setVisible( false ); return; } keyListLayout.loadKeys( username ); User user = userDao.get( username ); ProviderParams providerParams = providerParamsDao.getByUser( username ); usernameField.setValue( user.getUsername() ); passwordField.setValue( user.getPassword() ); accessKeyField.setValue( providerParams.getAccessKey() ); imageField.setValue( providerParams.getImageId() ); instanceTypeField.setValue( providerParams.getInstanceType() ); secretKeyField.setValue( providerParams.getSecretKey() ); keyPairNameField.setValue( providerParams.getKeyName() ); } private void loadData( String username, boolean hasAuthority ) { if ( StringUtils.isEmpty( username ) ) { deleteButton.setVisible( false ); keyListLayout.setVisible( false ); return; } User user = userDao.get( username ); ProviderParams providerParams = providerParamsDao.getByUser( username ); usernameField.setValue( user.getUsername( ) ); passwordField.setValue( user.getPassword( ) ); // if user does not have authority, do not allow credential information to be viewed. if ( ! hasAuthority ){ disableCredentialInformationView( ); } else { keyListLayout.loadKeys( username ); accessKeyField.setValue( providerParams.getAccessKey( ) ); imageField.setValue( providerParams.getImageId() ); instanceTypeField.setValue( providerParams.getInstanceType() ); secretKeyField.setValue( providerParams.getSecretKey() ); keyPairNameField.setValue( providerParams.getKeyName() ); } } private void addItems() { FormLayout formLayout = addFormLayout( 300, 350); formLayout.addComponent( formTitle ); formLayout.addComponent( usernameField ); formLayout.addComponent( passwordField ); formLayout.addComponent( accessKeyField ); formLayout.addComponent( imageField ); formLayout.addComponent( instanceTypeField ); formLayout.addComponent( secretKeyField ); formLayout.addComponent( keyPairNameField ); formLayout.addComponent( addButtonLayout() ); addComponent( keyListLayout, "left: 650px; top: 50px;" ); } private void addItems( boolean hasAuthority ) { if ( ! hasAuthority ){ FormLayout formLayout = addFormLayout( 300, 150 ); formLayout.addComponent( formTitle ); formLayout.addComponent( usernameField ); formLayout.addComponent( passwordField ); formLayout.addComponent( addButtonLayout() ); } else { FormLayout formLayout = addFormLayout( 300, 350 ); formLayout.addComponent( formTitle ); formLayout.addComponent( usernameField ); formLayout.addComponent( passwordField ); formLayout.addComponent( accessKeyField ); formLayout.addComponent( imageField ); formLayout.addComponent( instanceTypeField ); formLayout.addComponent( secretKeyField ); formLayout.addComponent( keyPairNameField ); formLayout.addComponent( addButtonLayout() ); } addComponent( keyListLayout, "left: 650px; top: 50px;" ); } private FormLayout addFormLayout( int x, int y ) { FormLayout formLayout = new FormLayout(); formLayout.setWidth( String.format( "%spx", x ) ); formLayout.setHeight( String.format( "%spx", y ) ); formLayout.addStyleName( "outlined" ); formLayout.setSpacing( true ); addComponent( formLayout, "left: 350px; top: 50px;" ); return formLayout; } private AbsoluteLayout addButtonLayout() { AbsoluteLayout layout = new AbsoluteLayout(); layout.setWidth( "100%" ); layout.setHeight( "50px" ); layout.addComponent( saveButton, "left: 0px; top: 20px;" ); saveButton.addClickListener( new Button.ClickListener() { public void buttonClick( Button.ClickEvent event ) { saveButtonClicked(); } } ); layout.addComponent( deleteButton, "left: 70px; top: 20px;" ); deleteButton.addClickListener( new Button.ClickListener() { public void buttonClick( Button.ClickEvent event ) { deleteButtonClicked(); } } ); return layout; } private void deleteButtonClicked() { // Check if the selected user is the default user and it is tried to be deleted if ( UserListWindow.getSelectedUser().equals( ShiroRealm.getDefaultUser() ) ) { Notification.show( "Error", "Default admin user cannot be deleted", Notification.Type.ERROR_MESSAGE ); return; } if ( ! ShiroRealm.isAuthenticatedUserAdmin() ) { Notification.show( "Error", "Only an admin can delete a user", Notification.Type.ERROR_MESSAGE ); return; } userDao.delete( username ); close(); Notification.show( "Success", "User deleted successfully", Notification.Type.HUMANIZED_MESSAGE ); } private void saveButtonClicked() { String username = usernameField.getValue(); String password = passwordField.getValue(); // Check if the selected user is the default user and it's username is tried to be changed if ( UserListWindow.getSelectedUser() != null && UserListWindow.getSelectedUser().equals( ShiroRealm.getDefaultUser() ) && isUserNameChanged( username ) ) { Notification.show( "Error", "Username of the default user cannot be changed", Notification.Type.ERROR_MESSAGE ); return; } if ( StringUtils.isEmpty( username ) || StringUtils.isEmpty( password ) ) { Notification.show( "Error", "Please enter username and password", Notification.Type.ERROR_MESSAGE ); return; } try { // Update the information of an existing user if ( UserListWindow.getSelectedUser() != null ){ userDao.delete( UserListWindow.getSelectedUser() ); userDao.save( new User( username, password ) ); UserListWindow.setSelectedUser( username ); ShiroRealm.setAuthenticatedUser( username ); BasicProviderParams newProviderParams = new BasicProviderParams( username, instanceTypeField.getValue(), accessKeyField.getValue(), secretKeyField.getValue(), imageField.getValue(), keyPairNameField.getValue() ); ProviderParams oldProviderParams = providerParamsDao.getByUser( UserListWindow.getSelectedUser() ); Map<String, String> keys = oldProviderParams != null ? oldProviderParams.getKeys() : new HashMap<String, String>(); newProviderParams.setKeys( keys ); providerParamsDao.delete( UserListWindow.getSelectedUser() ); providerParamsDao.save( newProviderParams ); close(); Notification.show( "Success", "User information updated successfully", Notification.Type.HUMANIZED_MESSAGE ); } // Create a new user else{ // Check if the new user exists in the system if ( userDao.get( username ) != null ) { Notification.show( "Error", "The username " + username +" already exists!", Notification.Type.ERROR_MESSAGE ); return; } doSaveUser( username, password ); } } catch ( Exception e ) { Notification.show( "Error", "Error to save user: " + e.getMessage(), Notification.Type.ERROR_MESSAGE ); } } public void disableCredentialInformationView(){ usernameField.setEnabled( false ); passwordField.setEnabled( false ); saveButton.setEnabled( false ); keyListLayout.setEnabled( false ); keyListLayout.disableKeyLabels(); keyPairNameField.setVisible( false ); accessKeyField.setVisible( false ); imageField.setVisible( false ); instanceTypeField.setVisible( false ); secretKeyField.setVisible( false ); } private boolean isUserNameChanged( final String username ) { if ( UserListWindow.getSelectedUser() == null ) { return false; } return ! username.equals( UserListWindow.getSelectedUser() ); } private void doSaveUser( String username, String password ) throws IOException { Assert.assertTrue( userDao.get( username ) == null ); userDao.save( new User( username, password ) ); BasicProviderParams newProviderParams = new BasicProviderParams( username, instanceTypeField.getValue(), accessKeyField.getValue(), secretKeyField.getValue(), imageField.getValue(), keyPairNameField.getValue() ); ProviderParams oldProviderParams = providerParamsDao.getByUser( username ); Map<String, String> keys = oldProviderParams != null ? oldProviderParams.getKeys() : new HashMap<String, String>(); newProviderParams.setKeys( keys ); providerParamsDao.save( newProviderParams ); close(); Notification.show( "Success", "User saved successfully", Notification.Type.HUMANIZED_MESSAGE ); } private void close() { tabSheetManager.removeAll(); } }