blob: 446b4f602625ea5d551ac025dfc76f7bf908ed4d [file] [log] [blame]
/*
* Copyright 2012 gitblit.com.
*
* 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.gitblit.authority;
import java.math.BigInteger;
import java.security.cert.X509Certificate;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.eclipse.jgit.lib.Config;
import com.gitblit.Constants;
import com.gitblit.models.UserModel;
import com.gitblit.utils.ArrayUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.utils.TimeUtils;
import com.gitblit.utils.X509Utils.RevocationReason;
public class UserCertificateModel implements Comparable<UserCertificateModel> {
public UserModel user;
public Date expires;
public List<X509Certificate> certs;
public List<String> revoked;
public String notes;
public UserCertificateModel(UserModel user) {
this.user = user;
}
public void update(Config config) {
if (expires == null) {
config.unset("user", user.username, "expires");
} else {
SimpleDateFormat df = new SimpleDateFormat(Constants.ISO8601);
config.setString("user", user.username, "expires", df.format(expires));
}
if (StringUtils.isEmpty(notes)) {
config.unset("user", user.username, "notes");
} else {
config.setString("user", user.username, "notes", notes);
}
if (ArrayUtils.isEmpty(revoked)) {
config.unset("user", user.username, "revoked");
} else {
config.setStringList("user", user.username, "revoked", revoked);
}
}
@Override
public int compareTo(UserCertificateModel o) {
return user.compareTo(o.user);
}
public void revoke(BigInteger serial, RevocationReason reason) {
if (revoked == null) {
revoked = new ArrayList<String>();
}
revoked.add(serial.toString() + ":" + reason.ordinal());
expires = null;
for (X509Certificate cert : certs) {
if (!isRevoked(cert.getSerialNumber())) {
if (!isExpired(cert.getNotAfter())) {
if (expires == null || cert.getNotAfter().after(expires)) {
expires = cert.getNotAfter();
}
}
}
}
}
public boolean isRevoked(BigInteger serial) {
return isRevoked(serial.toString());
}
public boolean isRevoked(String serial) {
if (ArrayUtils.isEmpty(revoked)) {
return false;
}
String sn = serial + ":";
for (String s : revoked) {
if (s.startsWith(sn)) {
return true;
}
}
return false;
}
public RevocationReason getRevocationReason(BigInteger serial) {
try {
String sn = serial + ":";
for (String s : revoked) {
if (s.startsWith(sn)) {
String r = s.substring(sn.length());
int i = Integer.parseInt(r);
return RevocationReason.values()[i];
}
}
} catch (Exception e) {
}
return RevocationReason.unspecified;
}
public CertificateStatus getStatus() {
if (expires == null) {
return CertificateStatus.unknown;
} else if (isExpired(expires)) {
return CertificateStatus.expired;
} else if (isExpiring(expires)) {
return CertificateStatus.expiring;
}
return CertificateStatus.ok;
}
public boolean hasExpired() {
return expires != null && isExpiring(expires);
}
public CertificateStatus getStatus(X509Certificate cert) {
if (isRevoked(cert.getSerialNumber())) {
return CertificateStatus.revoked;
} else if (isExpired(cert.getNotAfter())) {
return CertificateStatus.expired;
} else if (isExpiring(cert.getNotAfter())) {
return CertificateStatus.expiring;
}
return CertificateStatus.ok;
}
private boolean isExpiring(Date date) {
return (date.getTime() - System.currentTimeMillis()) <= TimeUtils.ONEDAY * 30;
}
private boolean isExpired(Date date) {
return date.getTime() < System.currentTimeMillis();
}
}