summaryrefslogtreecommitdiffstats
path: root/sparkybe-onap-service/src/main/java/org/onap/aai/sparky/security/portal/UserManager.java
blob: 0a217ffa48f8c26709d841a422708b9fded0ace3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
/**
 * ============LICENSE_START=======================================================
 * org.onap.aai
 * ================================================================================
 * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
 * Copyright © 2017-2018 Amdocs
 * ================================================================================
 * 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.
 * ============LICENSE_END=========================================================
 */
package org.onap.aai.sparky.security.portal;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Type;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.stream.Collectors;

import org.onap.aai.sparky.security.portal.config.RolesConfig;
import org.onap.portalsdk.core.restful.domain.EcompRole;
import org.onap.portalsdk.core.restful.domain.EcompUser;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;

/**
 * Basic file based user storage.
 */
public class UserManager {

  private File usersFile;

  private static final ReadWriteLock LOCK = new ReentrantReadWriteLock(true);
  private static final Lock READ_LOCK = LOCK.readLock();
  private static final Lock WRITE_LOCK = LOCK.writeLock();

  private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();

  /**
   *
   * @param usersFile a file to store the users
   */
  public UserManager(File usersFile) {
    this.usersFile = usersFile;
  }

  /**
   * Returns all users stored.
   *
   * @return a list of users.
   */
  public List<EcompUser> getUsers() {
    Type collectionType = new TypeToken<List<EcompUser>>() {
    }.getType();

    Optional<String> users = read(usersFile);
    if (users.isPresent()) {
      return GSON.fromJson(users.get(), collectionType);
    }

    return new ArrayList<>();
  }

  /**
   * Returns a stored user.
   *
   * @param loginId the identifier of the user
   * @return an optional user.
   */
  public Optional<EcompUser> getUser(String loginId) {
    if (!getUsers().isEmpty()) {
      return getUsers().stream().filter(u -> loginId.equals(u.getLoginId())).findFirst();
    }
    return Optional.empty();
  }

  /**
   * Stores a user if not already stored.
   *
   * @param user the user to be stored
   * @throws IOException
   */
  public void pushUser(EcompUser user) throws IOException {
    WRITE_LOCK.lock();
    try {
      if (!getUser(user.getLoginId()).isPresent()) {
        addUser(getUsers(), user);
      }
    } finally {
      WRITE_LOCK.unlock();
    }
  }

  /**
   * Replaces an existing user.
   *
   * @param loginId the id of the user
   * @param user the new user details
   * @throws IOException
   */
  public void editUser(String loginId, EcompUser user) throws IOException {
    WRITE_LOCK.lock();
    try {
      if (getUser(loginId).isPresent()) {
        List<EcompUser> users = getUsers().stream().filter(u -> !u.getLoginId().equals(loginId))
            .collect(Collectors.toList());
        addUser(users, user);
      }
    } finally {
      WRITE_LOCK.unlock();
    }
  }

  /**
   * Gets the roles assigned to a user.
   *
   * @param loginId the id of the user
   * @return the assigned roles
   */
  public List<EcompRole> getUserRoles(String loginId) {
    List<EcompRole> roles = new ArrayList<>();
    roles.addAll(getUser(loginId).orElseGet(EcompUser::new).getRoles());
    return roles;
  }

  public static List<EcompRole> getRoles() {
    return RolesConfig.getInstance().getRoles();
  }

  private void addUser(List<EcompUser> users, EcompUser user) throws IOException {
    users.add(user);
    write(users);
  }

  private void write(List<EcompUser> users) throws IOException {
    Files.write(usersFile.toPath(), GSON.toJson(users).getBytes());
  }

  private Optional<String> read(File file) {
    READ_LOCK.lock();
    try {
      return Optional.of(new String(Files.readAllBytes(file.toPath())));
    } catch (IOException e) { // NOSONAR
      return Optional.empty();
    } finally {
      READ_LOCK.unlock();
    }
  }
}