Create the EncyptedContactStore during servlet startup
Rather than lazily creating it, we always initialize it when the service needs one. Signed-off-by: Shawn O. Pearce <sop@google.com>
This commit is contained in:
@@ -60,9 +60,11 @@ import javax.servlet.http.HttpServletRequest;
|
||||
class AccountSecurityImpl extends BaseServiceImplementation implements
|
||||
AccountSecurity {
|
||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||
private final ContactStore contactStore;
|
||||
|
||||
AccountSecurityImpl(final GerritServer gs) {
|
||||
AccountSecurityImpl(final GerritServer gs, final ContactStore cs) {
|
||||
super(gs);
|
||||
contactStore = cs;
|
||||
}
|
||||
|
||||
public void mySshKeys(final AsyncCallback<List<AccountSshKey>> callback) {
|
||||
@@ -226,7 +228,7 @@ class AccountSecurityImpl extends BaseServiceImplementation implements
|
||||
}
|
||||
if (ContactInformation.hasData(info)) {
|
||||
try {
|
||||
EncryptedContactStore.store(me, info);
|
||||
contactStore.store(me, info);
|
||||
} catch (ContactInformationStoreException e) {
|
||||
throw new Failure(e);
|
||||
}
|
||||
|
@@ -22,13 +22,16 @@ import com.google.inject.Singleton;
|
||||
@SuppressWarnings("serial")
|
||||
@Singleton
|
||||
class AccountSecuritySrv extends GerritJsonServlet {
|
||||
private final ContactStore contactStore;
|
||||
|
||||
@Inject
|
||||
AccountSecuritySrv(final GerritServer gs) {
|
||||
AccountSecuritySrv(final GerritServer gs, final ContactStore cs) {
|
||||
super(gs);
|
||||
contactStore = cs;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Object createServiceHandle() throws Exception {
|
||||
return new AccountSecurityImpl(server);
|
||||
return new AccountSecurityImpl(server, contactStore);
|
||||
}
|
||||
}
|
||||
|
24
src/main/java/com/google/gerrit/server/ContactStore.java
Normal file
24
src/main/java/com/google/gerrit/server/ContactStore.java
Normal file
@@ -0,0 +1,24 @@
|
||||
// Copyright (C) 2009 The Android Open Source Project
|
||||
//
|
||||
// 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 com.google.gerrit.server;
|
||||
|
||||
import com.google.gerrit.client.reviewdb.Account;
|
||||
import com.google.gerrit.client.reviewdb.ContactInformation;
|
||||
import com.google.gerrit.client.rpc.ContactInformationStoreException;
|
||||
|
||||
public interface ContactStore {
|
||||
void store(Account account, ContactInformation info)
|
||||
throws ContactInformationStoreException;
|
||||
}
|
@@ -20,7 +20,6 @@ import com.google.gerrit.client.reviewdb.ContactInformation;
|
||||
import com.google.gerrit.client.reviewdb.ReviewDb;
|
||||
import com.google.gerrit.client.rpc.Common;
|
||||
import com.google.gerrit.client.rpc.ContactInformationStoreException;
|
||||
import com.google.gwtjsonrpc.server.XsrfException;
|
||||
import com.google.gwtorm.client.OrmException;
|
||||
|
||||
import org.apache.sshd.common.util.SecurityUtils;
|
||||
@@ -57,26 +56,21 @@ import java.util.Iterator;
|
||||
import java.util.TimeZone;
|
||||
|
||||
/** Encrypts {@link ContactInformation} instances and saves them. */
|
||||
public class EncryptedContactStore {
|
||||
public class EncryptedContactStore implements ContactStore {
|
||||
private static final TimeZone UTC = TimeZone.getTimeZone("UTC");
|
||||
private static boolean inited;
|
||||
private static EncryptedContactStore self;
|
||||
|
||||
private static synchronized EncryptedContactStore getInstance()
|
||||
throws ContactInformationStoreException {
|
||||
if (!inited) {
|
||||
inited = true;
|
||||
self = new EncryptedContactStore();
|
||||
public static ContactStore create(final GerritServer gs) {
|
||||
try {
|
||||
return new EncryptedContactStore(gs);
|
||||
} catch (final ContactInformationStoreException initError) {
|
||||
return new ContactStore() {
|
||||
@Override
|
||||
public void store(Account account, ContactInformation info)
|
||||
throws ContactInformationStoreException {
|
||||
throw initError;
|
||||
}
|
||||
};
|
||||
}
|
||||
if (self == null) {
|
||||
throw new ContactInformationStoreException();
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
public static void store(final Account account, final ContactInformation info)
|
||||
throws ContactInformationStoreException {
|
||||
getInstance().storeImpl(account, info);
|
||||
}
|
||||
|
||||
private PGPPublicKey dest;
|
||||
@@ -84,16 +78,8 @@ public class EncryptedContactStore {
|
||||
private URL storeUrl;
|
||||
private String storeAPPSEC;
|
||||
|
||||
private EncryptedContactStore() throws ContactInformationStoreException {
|
||||
final GerritServer gs;
|
||||
try {
|
||||
gs = GerritServer.getInstance();
|
||||
} catch (OrmException e) {
|
||||
throw new ContactInformationStoreException(e);
|
||||
} catch (XsrfException e) {
|
||||
throw new ContactInformationStoreException(e);
|
||||
}
|
||||
|
||||
private EncryptedContactStore(final GerritServer gs)
|
||||
throws ContactInformationStoreException {
|
||||
if (gs.getContactStoreURL() == null) {
|
||||
throw new ContactInformationStoreException(new IllegalStateException(
|
||||
"No contactStoreURL configured"));
|
||||
@@ -150,7 +136,7 @@ public class EncryptedContactStore {
|
||||
return null;
|
||||
}
|
||||
|
||||
private void storeImpl(final Account account, final ContactInformation info)
|
||||
public void store(final Account account, final ContactInformation info)
|
||||
throws ContactInformationStoreException {
|
||||
try {
|
||||
final byte[] plainText = format(account, info).getBytes("UTF-8");
|
||||
|
@@ -84,7 +84,9 @@ public class GerritServletConfig extends GuiceServletContextListener {
|
||||
@Override
|
||||
protected void configure() {
|
||||
try {
|
||||
bind(GerritServer.class).toInstance(GerritServer.getInstance(true));
|
||||
final GerritServer gs = GerritServer.getInstance(true);
|
||||
bind(GerritServer.class).toInstance(gs);
|
||||
bind(ContactStore.class).toInstance(EncryptedContactStore.create(gs));
|
||||
} catch (OrmException e) {
|
||||
addError(e);
|
||||
} catch (XsrfException e) {
|
||||
|
Reference in New Issue
Block a user