blob: c956285aaa9b5ca97e205b9664018c0ba4b46514 [file] [log] [blame]
/****************************************************************
* 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.james.jmap.draft.methods.integration.cucumber;
import static org.apache.james.jmap.HttpJmapAuthentication.authenticateJamesUser;
import static org.apache.james.jmap.JmapURIBuilder.baseUri;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import com.google.common.base.Splitter;
import jakarta.inject.Inject;
import org.apache.james.core.Username;
import org.apache.james.jmap.AccessToken;
import com.github.fge.lambdas.Throwing;
import com.github.fge.lambdas.runnable.ThrowingRunnable;
import com.google.common.base.Preconditions;
import com.google.common.hash.Hashing;
import io.cucumber.guice.ScenarioScoped;
import io.cucumber.java.en.Given;
@ScenarioScoped
public class UserStepdefs {
private final MainStepdefs mainStepdefs;
private Map<String, String> passwordByUser;
private Set<String> domains;
private Map<String, AccessToken> tokenByUser;
private Optional<String> lastConnectedUser;
@Inject
private UserStepdefs(MainStepdefs mainStepdefs) {
this.mainStepdefs = mainStepdefs;
this.domains = new HashSet<>();
this.passwordByUser = new HashMap<>();
this.tokenByUser = new HashMap<>();
this.lastConnectedUser = Optional.empty();
}
public void execWithUser(String user, ThrowingRunnable sideEffect) {
Optional<String> previousConnectedUser = lastConnectedUser;
connectUser(user);
try {
sideEffect.run();
} finally {
previousConnectedUser.ifPresent(Throwing.consumer(this::connectUser));
}
}
public String getConnectedUser() {
Preconditions.checkArgument(lastConnectedUser.isPresent(), "No user is connected");
return lastConnectedUser.get();
}
public String getUserPassword(String user) {
Preconditions.checkArgument(passwordByUser.containsKey(user), "User has no password created yet");
return passwordByUser.get(user);
}
@Given("^a domain named \"([^\"]*)\"$")
public void createDomain(String domain) throws Exception {
mainStepdefs.dataProbe.addDomain(domain);
domains.add(domain);
}
@Given("^some users \"(.*)\"$")
public void createUsers(String users) {
Splitter.on(',').trimResults()
.splitToStream(users)
.forEach(Throwing.consumer(this::createUser));
}
private String unquote(String quotedString) {
return quotedString.substring(1, quotedString.length() - 1);
}
@Given("^a user \"([^\"]*)\"$")
public void createUser(String username) throws Exception {
String password = generatePassword(username);
mainStepdefs.dataProbe.addUser(username, password);
passwordByUser.put(username, password);
}
@Given("^a connected user \"([^\"]*)\"$")
public void createConnectedUser(String username) throws Exception {
createUser(username);
connectUser(username);
}
@Given("^\"([^\"]*)\" is connected$")
public void connectUser(String username) {
AccessToken accessToken = authenticate(username);
tokenByUser.put(username, accessToken);
lastConnectedUser = Optional.of(username);
}
public AccessToken authenticate(String username) {
return tokenByUser.computeIfAbsent(username, (user) -> {
String password = passwordByUser.get(user);
Preconditions.checkState(password != null, "unknown user %s", user);
return authenticateJamesUser(baseUri(mainStepdefs.jmapServer), Username.of(user), password);
});
}
private String generatePassword(String username) {
return Hashing.murmur3_128().hashString(username, StandardCharsets.UTF_8).toString();
}
}