当前位置: 首页>>代码示例>>Java>>正文


Java DistributionPoint.getDistributionPoint方法代码示例

本文整理汇总了Java中org.bouncycastle.asn1.x509.DistributionPoint.getDistributionPoint方法的典型用法代码示例。如果您正苦于以下问题:Java DistributionPoint.getDistributionPoint方法的具体用法?Java DistributionPoint.getDistributionPoint怎么用?Java DistributionPoint.getDistributionPoint使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在org.bouncycastle.asn1.x509.DistributionPoint的用法示例。


在下文中一共展示了DistributionPoint.getDistributionPoint方法的12个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Java代码示例。

示例1: getCRLDistributionPoint

import org.bouncycastle.asn1.x509.DistributionPoint; //导入方法依赖的package包/类
/**
 * 
 * @return A list of ulrs that inform the location of the certificate revocation lists
 * @throws IOException exception
 */
public List<String> getCRLDistributionPoint() throws IOException {

    List<String> crlUrls = new ArrayList<>();
    ASN1Primitive primitive = getExtensionValue(Extension.cRLDistributionPoints.getId());
    if (primitive == null) {
        return null;
    }
    CRLDistPoint crlDistPoint = CRLDistPoint.getInstance(primitive);
    DistributionPoint[] distributionPoints = crlDistPoint.getDistributionPoints();

    for (DistributionPoint distributionPoint : distributionPoints) {
        DistributionPointName dpn = distributionPoint.getDistributionPoint();
        // Look for URIs in fullName
        if (dpn != null) {
            if (dpn.getType() == DistributionPointName.FULL_NAME) {
                GeneralName[] genNames = GeneralNames.getInstance(dpn.getName()).getNames();
                for (GeneralName genName : genNames) {
                    if (genName.getTagNo() == GeneralName.uniformResourceIdentifier) {
                        String url = DERIA5String.getInstance(genName.getName()).getString();
                        crlUrls.add(url);
                        logger.info("Adicionando a url {}", url);
                    }
                }
            }
        }
    }
    return crlUrls;
}
 
开发者ID:demoiselle,项目名称:signer,代码行数:34,代码来源:BasicCertificate.java

示例2: getCrlDistributionPoints

import org.bouncycastle.asn1.x509.DistributionPoint; //导入方法依赖的package包/类
public static List<String> getCrlDistributionPoints(byte[] crldpExt)
		throws CertificateParsingException, IOException {
	if (crldpExt == null) {
		return new ArrayList<String>();
	}
	ASN1InputStream oAsnInStream = new ASN1InputStream(
			new ByteArrayInputStream(crldpExt));
	DERObject derObjCrlDP = oAsnInStream.readObject();
	DEROctetString dosCrlDP = (DEROctetString) derObjCrlDP;
	byte[] crldpExtOctets = dosCrlDP.getOctets();
	ASN1InputStream oAsnInStream2 = new ASN1InputStream(
			new ByteArrayInputStream(crldpExtOctets));
	DERObject derObj2 = oAsnInStream2.readObject();
	CRLDistPoint distPoint = CRLDistPoint.getInstance(derObj2);
	List<String> crlUrls = new ArrayList<String>();
	for (DistributionPoint dp : distPoint.getDistributionPoints()) {
		DistributionPointName dpn = dp.getDistributionPoint();
		// Look for URIs in fullName
		if (dpn != null && dpn.getType() == DistributionPointName.FULL_NAME) {
			GeneralName[] genNames = GeneralNames
					.getInstance(dpn.getName()).getNames();
			// Look for an URI
			for (int j = 0; j < genNames.length; j++) {
				if (genNames[j].getTagNo() == GeneralName.uniformResourceIdentifier) {
					String url = DERIA5String.getInstance(
							genNames[j].getName()).getString();
					crlUrls.add(url);
				}
			}
		}
	}
	return crlUrls;
}
 
开发者ID:bluecrystalsign,项目名称:signer-source,代码行数:34,代码来源:DerEncoder.java

示例3: getCrlDistributionPoints

import org.bouncycastle.asn1.x509.DistributionPoint; //导入方法依赖的package包/类
public static List<String> getCrlDistributionPoints(byte[] crldpExt)
		throws CertificateParsingException, IOException {
	if (crldpExt == null) {
		return new ArrayList<String>();
	}
	ASN1InputStream oAsnInStream = new ASN1InputStream(
			new ByteArrayInputStream(crldpExt));
	ASN1Primitive derObjCrlDP = oAsnInStream.readObject();
	DEROctetString dosCrlDP = (DEROctetString) derObjCrlDP;
	byte[] crldpExtOctets = dosCrlDP.getOctets();
	ASN1InputStream oAsnInStream2 = new ASN1InputStream(
			new ByteArrayInputStream(crldpExtOctets));
	ASN1Primitive derObj2 = oAsnInStream2.readObject();
	CRLDistPoint distPoint = CRLDistPoint.getInstance(derObj2);
	List<String> crlUrls = new ArrayList<String>();
	for (DistributionPoint dp : distPoint.getDistributionPoints()) {
		DistributionPointName dpn = dp.getDistributionPoint();
		// Look for URIs in fullName
		if (dpn != null && dpn.getType() == DistributionPointName.FULL_NAME) {
			GeneralName[] genNames = GeneralNames
					.getInstance(dpn.getName()).getNames();
			// Look for an URI
			for (int j = 0; j < genNames.length; j++) {
				if (genNames[j].getTagNo() == GeneralName.uniformResourceIdentifier) {
					String url = DERIA5String.getInstance(
							genNames[j].getName()).getString();
					crlUrls.add(url);
				}
			}
		}
	}
	return crlUrls;
}
 
开发者ID:bluecrystalsign,项目名称:signer-source,代码行数:34,代码来源:DerEncoder.java

示例4: getCrlUrls

import org.bouncycastle.asn1.x509.DistributionPoint; //导入方法依赖的package包/类
/**
 * Gives back the {@code List} of CRL URI meta-data found within the given X509 certificate.
 *
 * @param certificateToken
 *            the cert token certificate
 * @param checkInTrustAnchors
 *            if true, the method will search in the ServiceSupplyPoint urls
 * @return the {@code List} of CRL URI, or empty list if the extension is not present
 */
public static List<String> getCrlUrls(final CertificateToken certificateToken, boolean checkInTrustAnchors) {
	final List<String> urls = new ArrayList<String>();

	final byte[] crlDistributionPointsBytes = certificateToken.getCertificate().getExtensionValue(Extension.cRLDistributionPoints.getId());
	if (crlDistributionPointsBytes != null) {
		try {
			final ASN1Sequence asn1Sequence = DSSASN1Utils.getAsn1SequenceFromDerOctetString(crlDistributionPointsBytes);
			final CRLDistPoint distPoint = CRLDistPoint.getInstance(asn1Sequence);
			final DistributionPoint[] distributionPoints = distPoint.getDistributionPoints();
			for (final DistributionPoint distributionPoint : distributionPoints) {

				final DistributionPointName distributionPointName = distributionPoint.getDistributionPoint();
				if (DistributionPointName.FULL_NAME != distributionPointName.getType()) {
					continue;
				}
				final GeneralNames generalNames = (GeneralNames) distributionPointName.getName();
				final GeneralName[] names = generalNames.getNames();
				for (final GeneralName name : names) {
					String location = parseGn(name);
					if (location != null) {
						urls.add(location);
					}
				}
			}
		} catch (Exception e) {
			LOG.error("Unable to parse cRLDistributionPoints", e);
		}
	}

	if (Utils.isCollectionEmpty(urls) && checkInTrustAnchors) {
		return getServiceSupplyPoints(certificateToken, "crl", "certificateRevocationList");
	}
	return urls;
}
 
开发者ID:esig,项目名称:dss,代码行数:44,代码来源:DSSASN1Utils.java

示例5: getCrlUri

import org.bouncycastle.asn1.x509.DistributionPoint; //导入方法依赖的package包/类
public String getCrlUri(X509Certificate certificate) throws IOException {
	ASN1Primitive obj;
	try {
		obj = getExtensionValue(certificate, Extension.cRLDistributionPoints.getId());
	} catch (IOException ex) {
		log.error("Failed to get CRL URL", ex);
		return null;
	}

	if (obj == null) {
		return null;
	}

	CRLDistPoint distPoint = CRLDistPoint.getInstance(obj);

	DistributionPoint[] distributionPoints = distPoint.getDistributionPoints();
	for (DistributionPoint distributionPoint : distributionPoints) {
		DistributionPointName distributionPointName = distributionPoint.getDistributionPoint();
		if (DistributionPointName.FULL_NAME != distributionPointName.getType()) {
			continue;
		}

		GeneralNames generalNames = (GeneralNames) distributionPointName.getName();
		GeneralName[] names = generalNames.getNames();
		for (GeneralName name : names) {
			if (name.getTagNo() != GeneralName.uniformResourceIdentifier) {
				continue;
			}

			DERIA5String derStr = DERIA5String.getInstance((ASN1TaggedObject) name.toASN1Primitive(), false);
			return derStr.getString();
		}
	}

	return null;
}
 
开发者ID:GluuFederation,项目名称:oxAuth,代码行数:37,代码来源:CRLCertificateVerifier.java

示例6: getCrlDistributionPoints

import org.bouncycastle.asn1.x509.DistributionPoint; //导入方法依赖的package包/类
/**
 * Extracts all CRL distribution point URLs from the "CRL Distribution Point"
 * extension in a X.509 certificate. If CRL distribution point extension is
 * unavailable, returns an empty list. 
 */
public static List<String> getCrlDistributionPoints(
		X509Certificate cert) throws CertificateParsingException, IOException {
	byte[] crldpExt = cert.getExtensionValue(
			X509Extensions.CRLDistributionPoints.getId());
	ASN1InputStream oAsnInStream = new ASN1InputStream(
			new ByteArrayInputStream(crldpExt));
	
	ASN1Primitive derObjCrlDP = oAsnInStream.readObject();
	DEROctetString dosCrlDP = (DEROctetString) derObjCrlDP;
	byte[] crldpExtOctets = dosCrlDP.getOctets();
	
	ASN1InputStream oAsnInStream2 = new ASN1InputStream(
			new ByteArrayInputStream(crldpExtOctets));
	
	ASN1Primitive derObj2 = oAsnInStream2.readObject();
	CRLDistPoint distPoint = CRLDistPoint.getInstance(derObj2);
	List<String> crlUrls = new ArrayList<String>();
	for (DistributionPoint dp : distPoint.getDistributionPoints()) {
		System.out.println(dp);
           DistributionPointName dpn = dp.getDistributionPoint();
           // Look for URIs in fullName
           if (dpn != null) {
               if (dpn.getType() == DistributionPointName.FULL_NAME) {
                   GeneralName[] genNames = GeneralNames.getInstance(
                       dpn.getName()).getNames();
                   // Look for an URI
                   for (int j = 0; j < genNames.length; j++) {
                       if (genNames[j].getTagNo() == GeneralName.uniformResourceIdentifier) {
                           String url = DERIA5String.getInstance(
                               genNames[j].getName()).getString();
                           crlUrls.add(url);
                       }
                   }
               }
           }
	}
	return crlUrls;
}
 
开发者ID:tornabene,项目名称:jopenpec,代码行数:44,代码来源:CRLVerifier.java

示例7: getCrlDistributionPointsStringValue

import org.bouncycastle.asn1.x509.DistributionPoint; //导入方法依赖的package包/类
/**
 * Get extension value for CRL Distribution Points as a string.
 * 
 * @param bValue The octet string value
 * @return Extension value as a string
 * @throws IOException If an I/O problem occurs
 */
private String getCrlDistributionPointsStringValue(byte[] bValue)
    throws IOException
{
	CRLDistPoint dps = CRLDistPoint.getInstance(bValue);
	DistributionPoint[] points = dps.getDistributionPoints();

	StringBuilder sb = new StringBuilder();
	sb.append("<ul>");

	for (DistributionPoint point : points)
	{
		DistributionPointName dpn;
		if ((dpn = point.getDistributionPoint()) != null)
		{
			sb.append("<li>");
			switch (dpn.getType())
			{
				case DistributionPointName.FULL_NAME:
					sb.append(RB.getString("CrlDistributionPoint.0.0"));
					sb.append(": ");
					sb.append(getGeneralNamesString((GeneralNames) dpn.getName(), LinkClass.CRL));
					break;
				case DistributionPointName.NAME_RELATIVE_TO_CRL_ISSUER:
					sb.append(RB.getString("CrlDistributionPoint.0.1"));
					sb.append(": ");
					// TODO: need better decode?
					sb.append(stringify(dpn.getName()));
					break;
				default:
					sb.append(RB.getString("UnknownCrlDistributionPointName"));
					sb.append(": ");
					sb.append(stringify(dpn.getName()));
					break;
			}
			sb.append("</li>");
		}

		ReasonFlags flags;
		if ((flags = point.getReasons()) != null)
		{
			sb.append("<li>");
			sb.append(RB.getString("CrlDistributionPoint.1"));
			sb.append(": ");
			// TODO: decode
			sb.append(stringify(flags));
			sb.append("</li>");
		}

		GeneralNames issuer;
		if ((issuer = point.getCRLIssuer()) != null)
		{
			sb.append("<li>");
			sb.append(RB.getString("CrlDistributionPoint.2"));
			sb.append(": ");
			sb.append(getGeneralNamesString(issuer, LinkClass.CRL));
			sb.append("</li>");
		}
	}

	sb.append("</ul>");
	return sb.toString();
}
 
开发者ID:gavioto,项目名称:portecle,代码行数:70,代码来源:X509Ext.java

示例8: getCrlDistributionPoints

import org.bouncycastle.asn1.x509.DistributionPoint; //导入方法依赖的package包/类
/**
 * Extracts all CRL distribution point URLs from the
 * "CRL Distribution Point" extension in a X.509 certificate. If CRL
 * distribution point extension is unavailable, returns an empty list.
 */
public static List<String> getCrlDistributionPoints(X509Certificate cert) throws CertificateParsingException,
		IOException {
	byte[] crldpExt = cert.getExtensionValue(X509Extension.cRLDistributionPoints.getId());
	if (crldpExt == null) {
		return new ArrayList<String>();
	}
	ASN1InputStream oAsnInStream = null;
	ASN1InputStream oAsnInStream2 = null;
	try {
		oAsnInStream = new ASN1InputStream(new ByteArrayInputStream(crldpExt));
		DERObject derObjCrlDP = oAsnInStream.readObject();
		DEROctetString dosCrlDP = (DEROctetString) derObjCrlDP;
		byte[] crldpExtOctets = dosCrlDP.getOctets();
		oAsnInStream2 = new ASN1InputStream(new ByteArrayInputStream(crldpExtOctets));
		DERObject derObj2 = oAsnInStream2.readObject();
		CRLDistPoint distPoint = CRLDistPoint.getInstance(derObj2);
		List<String> crlUrls = new ArrayList<String>();
		for (DistributionPoint dp : distPoint.getDistributionPoints()) {
			DistributionPointName dpn = dp.getDistributionPoint();
			// Look for URIs in fullName
			if (dpn != null && dpn.getType() == DistributionPointName.FULL_NAME) {
				GeneralName[] genNames = GeneralNames.getInstance(dpn.getName()).getNames();
				// Look for an URI
				for (int j = 0; j < genNames.length; j++) {
					if (genNames[j].getTagNo() == GeneralName.uniformResourceIdentifier) {
						String url = DERIA5String.getInstance(genNames[j].getName()).getString();
						crlUrls.add(url);
					}
				}
			}
		}
		return crlUrls;
	} finally {
		if (oAsnInStream != null) {
			oAsnInStream.close();
		}

		if (oAsnInStream2 != null) {
			oAsnInStream2.close();
		}
	}
}
 
开发者ID:infinitiessoft,项目名称:keystone4j,代码行数:48,代码来源:CRLVerifier.java

示例9: getDistributionPointString

import org.bouncycastle.asn1.x509.DistributionPoint; //导入方法依赖的package包/类
private String getDistributionPointString(DistributionPoint distributionPoint, String baseIndent)
		throws IOException {
	// @formatter:off

	/*
	 * DistributionPoint ::= ASN1Sequence {
	 * 		distributionPoint [0] DistributionPointName OPTIONAL,
	 * 		reasons [1] ReasonFlags OPTIONAL,
	 * 		cRLIssuer [2] GeneralNames OPTIONAL
	 * }
	 *
	 * GeneralNames ::= ASN1Sequence SIZE (1..MAX) OF GeneralName
	 */

	// @formatter:on

	StringBuilder sb = new StringBuilder();

	DistributionPointName distributionPointName = distributionPoint.getDistributionPoint();
	ReasonFlags reasons = distributionPoint.getReasons();
	GeneralNames crlIssuer = distributionPoint.getCRLIssuer();

	if (distributionPointName != null) { // Optional
		sb.append(getDistributionPointNameString(distributionPointName, baseIndent));
	}

	if (reasons != null) { // Optional
		sb.append(baseIndent);
		sb.append(res.getString("DistributionPointReasons"));
		sb.append(NEWLINE);

		String[] reasonFlags = getReasonFlagsStrings(reasons);

		for (String reasonFlag : reasonFlags) {
			sb.append(baseIndent);
			sb.append(INDENT);
			sb.append(reasonFlag);
			sb.append(NEWLINE);
		}
	}

	if (crlIssuer != null) { // Optional
		sb.append(baseIndent);
		sb.append(res.getString("DistributionPointCrlIssuer"));
		sb.append(NEWLINE);

		for (GeneralName generalName : crlIssuer.getNames()) {
			sb.append(baseIndent);
			sb.append(INDENT);
			sb.append(GeneralNameUtil.toString(generalName));
			sb.append(NEWLINE);
		}
	}

	return sb.toString();
}
 
开发者ID:kaikramer,项目名称:keystore-explorer,代码行数:57,代码来源:X509Ext.java

示例10: getCrlDistributionPoints

import org.bouncycastle.asn1.x509.DistributionPoint; //导入方法依赖的package包/类
/**
 * Extracts all CRL distribution point URLs from the
 * "CRL Distribution Point" extension in a X.509 certificate. If CRL
 * distribution point extension is unavailable, returns an empty list.
 */
public static List<String> getCrlDistributionPoints(X509Certificate cert) {

	ASN1InputStream oAsnInStream = null;
	ASN1InputStream oAsnInStream2 = null;
	try {
		byte[] crldpExt = cert.getExtensionValue(Extension.cRLDistributionPoints.getId());
		if (crldpExt == null) {
			List<String> emptyList = new ArrayList<String>();
			return emptyList;
		}
		oAsnInStream = new ASN1InputStream(new ByteArrayInputStream(crldpExt));
		ASN1Primitive derObjCrlDP = oAsnInStream.readObject();
		DEROctetString dosCrlDP = (DEROctetString) derObjCrlDP;
		byte[] crldpExtOctets = dosCrlDP.getOctets();
		oAsnInStream2 = new ASN1InputStream(new ByteArrayInputStream(crldpExtOctets));
		ASN1Primitive derObj2 = oAsnInStream2.readObject();
		CRLDistPoint distPoint = CRLDistPoint.getInstance(derObj2);
		List<String> crlUrls = new ArrayList<String>();
		for (DistributionPoint dp : distPoint.getDistributionPoints()) {
			DistributionPointName dpn = dp.getDistributionPoint();
			// Look for URIs in fullName
			if (dpn != null) {
				if (dpn.getType() == DistributionPointName.FULL_NAME) {
					GeneralName[] genNames = GeneralNames.getInstance(dpn.getName()).getNames();
					// Look for an URI
					for (int j = 0; j < genNames.length; j++) {
						if (genNames[j].getTagNo() == GeneralName.uniformResourceIdentifier) {
							String url = DERIA5String.getInstance(genNames[j].getName()).getString();
							crlUrls.add(url);
						}
					}
				}
			}
		}
		return crlUrls;
	} catch (IOException ex) {
		throw new RuntimeException(ex);
	} finally {
		org.apache.commons.io.IOUtils.closeQuietly(oAsnInStream);
		org.apache.commons.io.IOUtils.closeQuietly(oAsnInStream2);
	}
}
 
开发者ID:beat2,项目名称:pdfbox-signer,代码行数:48,代码来源:CRLDistributionPointsExtractor.java

示例11: getCrlUri

import org.bouncycastle.asn1.x509.DistributionPoint; //导入方法依赖的package包/类
/**
 * Gives back the CRL URI meta-data found within the given X509 certificate.
 * 
 * @param certificate
 *            the X509 certificate.
 * @return the CRL URI, or <code>null</code> if the extension is not
 *         present.
 */
public static URI getCrlUri(X509Certificate certificate) {
	byte[] crlDistributionPointsValue = certificate
			.getExtensionValue(Extension.cRLDistributionPoints.getId());
	if (null == crlDistributionPointsValue) {
		return null;
	}
	ASN1Sequence seq;
	try {
		DEROctetString oct;
		oct = (DEROctetString) (new ASN1InputStream(
				new ByteArrayInputStream(crlDistributionPointsValue))
				.readObject());
		seq = (ASN1Sequence) new ASN1InputStream(oct.getOctets())
				.readObject();
	} catch (IOException e) {
		throw new RuntimeException("IO error: " + e.getMessage(), e);
	}
	CRLDistPoint distPoint = CRLDistPoint.getInstance(seq);
	DistributionPoint[] distributionPoints = distPoint
			.getDistributionPoints();
	for (DistributionPoint distributionPoint : distributionPoints) {
		DistributionPointName distributionPointName = distributionPoint
				.getDistributionPoint();
		if (DistributionPointName.FULL_NAME != distributionPointName
				.getType()) {
			continue;
		}
		GeneralNames generalNames = (GeneralNames) distributionPointName
				.getName();
		GeneralName[] names = generalNames.getNames();
		for (GeneralName name : names) {
			if (name.getTagNo() != GeneralName.uniformResourceIdentifier) {
				LOG.debug("not a uniform resource identifier");
				continue;
			}
			DERIA5String derStr = DERIA5String.getInstance(name.getName());
			String str = derStr.getString();
			if (false == str.startsWith("http")) {
				/*
				 * skip ldap:// protocols
				 */
				LOG.debug("not HTTP/HTTPS: " + str);
				continue;
			}
			URI uri = toURI(str);
			return uri;
		}
	}
	return null;
}
 
开发者ID:e-Contract,项目名称:jtrust,代码行数:59,代码来源:CrlTrustLinker.java

示例12: getCrlDistPoints

import org.bouncycastle.asn1.x509.DistributionPoint; //导入方法依赖的package包/类
private static List<String> getCrlDistPoints(X509Certificate cert) throws Exception {
	
	byte[] crlDistPointExt =
		cert.getExtensionValue(X509Extension.cRLDistributionPoints.getId());
	
	if (crlDistPointExt == null) {
		List<String> emptyList = new ArrayList<String>();
		return emptyList;
	}
	
	ASN1InputStream asnInStream =
		new ASN1InputStream(new ByteArrayInputStream(crlDistPointExt));
	
	ASN1Primitive derObjCrlDistPoint = asnInStream.readObject();
	DEROctetString derOctStrCrlDistPoint = (DEROctetString) derObjCrlDistPoint;
	byte[] crlDistPointBytes = derOctStrCrlDistPoint.getOctets();
	
	ASN1InputStream asnInStream2 =
		new ASN1InputStream(new ByteArrayInputStream(crlDistPointBytes));
	
	ASN1Primitive derObjCrlDistPoint2 = asnInStream2.readObject();
	CRLDistPoint crlDistPoints = CRLDistPoint.getInstance(derObjCrlDistPoint2);
	
	List<String> crlUrls = new ArrayList<String>();
	
	for (DistributionPoint dPoint: crlDistPoints.getDistributionPoints()) {
           DistributionPointName dPointName = dPoint.getDistributionPoint();
           if (dPointName != null) {
               if (dPointName.getType() == DistributionPointName.FULL_NAME) {
                   
               	GeneralName[] genNames =
                   	GeneralNames.getInstance(dPointName.getName()).getNames();
                   for (int j = 0; j < genNames.length; j++) {
                       if (genNames[j].getTagNo() == GeneralName.uniformResourceIdentifier) {
                           String url =
                           	DERIA5String.getInstance(genNames[j].getName()).getString();
                           crlUrls.add(url);
                       }
                   }
                   
               }
           }
	}
	asnInStream.close();
	asnInStream2.close();
	return crlUrls;
}
 
开发者ID:robsonsmartins,项目名称:fiap-mba-java-projects,代码行数:48,代码来源:CertificadoValidador.java


注:本文中的org.bouncycastle.asn1.x509.DistributionPoint.getDistributionPoint方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。