| /* | |
| * 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(); | |
| } | |
| } |