mirror of
https://github.com/casdoor/casdoor.git
synced 2025-05-23 02:35:49 +08:00
feat: rename all publicKey occurrences to certificate (#894)
* fix:The certs page is displayed incorrectly * Translations for each language are added * Replace the variables certificat with Certificat with certificate and Certificate * Replace the variables certificat with Certificat with certificate and Certificate * Variable names are more accurate * Variable names are more accurate * Modify the variable name
This commit is contained in:
parent
6f6159be07
commit
8e98fc5a9f
@ -139,7 +139,7 @@
|
|||||||
"cryptoAlgorithm": "RS256",
|
"cryptoAlgorithm": "RS256",
|
||||||
"bitSize": 4096,
|
"bitSize": 4096,
|
||||||
"expireInYears": 20,
|
"expireInYears": 20,
|
||||||
"publicKey": "",
|
"certificate": "",
|
||||||
"privateKey": ""
|
"privateKey": ""
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -33,7 +33,7 @@ type Cert struct {
|
|||||||
BitSize int `json:"bitSize"`
|
BitSize int `json:"bitSize"`
|
||||||
ExpireInYears int `json:"expireInYears"`
|
ExpireInYears int `json:"expireInYears"`
|
||||||
|
|
||||||
PublicKey string `xorm:"mediumtext" json:"publicKey"`
|
Certificate string `xorm:"mediumtext" json:"certificate"`
|
||||||
PrivateKey string `xorm:"mediumtext" json:"privateKey"`
|
PrivateKey string `xorm:"mediumtext" json:"privateKey"`
|
||||||
AuthorityPublicKey string `xorm:"mediumtext" json:"authorityPublicKey"`
|
AuthorityPublicKey string `xorm:"mediumtext" json:"authorityPublicKey"`
|
||||||
AuthorityRootPublicKey string `xorm:"mediumtext" json:"authorityRootPublicKey"`
|
AuthorityRootPublicKey string `xorm:"mediumtext" json:"authorityRootPublicKey"`
|
||||||
@ -123,9 +123,9 @@ func UpdateCert(id string, cert *Cert) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func AddCert(cert *Cert) bool {
|
func AddCert(cert *Cert) bool {
|
||||||
if cert.PublicKey == "" || cert.PrivateKey == "" {
|
if cert.Certificate == "" || cert.PrivateKey == "" {
|
||||||
publicKey, privateKey := generateRsaKeys(cert.BitSize, cert.ExpireInYears, cert.Name, cert.Owner)
|
certificate, privateKey := generateRsaKeys(cert.BitSize, cert.ExpireInYears, cert.Name, cert.Owner)
|
||||||
cert.PublicKey = publicKey
|
cert.Certificate = certificate
|
||||||
cert.PrivateKey = privateKey
|
cert.PrivateKey = privateKey
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,7 +167,7 @@ func readTokenFromFile() (string, string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func initBuiltInCert() {
|
func initBuiltInCert() {
|
||||||
tokenJwtPublicKey, tokenJwtPrivateKey := readTokenFromFile()
|
tokenJwtCertificate, tokenJwtPrivateKey := readTokenFromFile()
|
||||||
cert := getCert("admin", "cert-built-in")
|
cert := getCert("admin", "cert-built-in")
|
||||||
if cert != nil {
|
if cert != nil {
|
||||||
return
|
return
|
||||||
@ -183,7 +183,7 @@ func initBuiltInCert() {
|
|||||||
CryptoAlgorithm: "RS256",
|
CryptoAlgorithm: "RS256",
|
||||||
BitSize: 4096,
|
BitSize: 4096,
|
||||||
ExpireInYears: 20,
|
ExpireInYears: 20,
|
||||||
PublicKey: tokenJwtPublicKey,
|
Certificate: tokenJwtCertificate,
|
||||||
PrivateKey: tokenJwtPrivateKey,
|
PrivateKey: tokenJwtPrivateKey,
|
||||||
}
|
}
|
||||||
AddCert(cert)
|
AddCert(cert)
|
||||||
|
@ -97,7 +97,7 @@ func GetJsonWebKeySet() (jose.JSONWebKeySet, error) {
|
|||||||
//link here: https://self-issued.info/docs/draft-ietf-jose-json-web-key.html
|
//link here: https://self-issued.info/docs/draft-ietf-jose-json-web-key.html
|
||||||
//or https://datatracker.ietf.org/doc/html/draft-ietf-jose-json-web-key
|
//or https://datatracker.ietf.org/doc/html/draft-ietf-jose-json-web-key
|
||||||
for _, cert := range certs {
|
for _, cert := range certs {
|
||||||
certPemBlock := []byte(cert.PublicKey)
|
certPemBlock := []byte(cert.Certificate)
|
||||||
certDerBlock, _ := pem.Decode(certPemBlock)
|
certDerBlock, _ := pem.Decode(certPemBlock)
|
||||||
x509Cert, _ := x509.ParseCertificate(certDerBlock.Bytes)
|
x509Cert, _ := x509.ParseCertificate(certDerBlock.Bytes)
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ func TestProduct(t *testing.T) {
|
|||||||
product := GetProduct("admin/product_123")
|
product := GetProduct("admin/product_123")
|
||||||
provider := getProvider(product.Owner, "provider_pay_alipay")
|
provider := getProvider(product.Owner, "provider_pay_alipay")
|
||||||
cert := getCert(product.Owner, "cert-pay-alipay")
|
cert := getCert(product.Owner, "cert-pay-alipay")
|
||||||
pProvider := pp.GetPaymentProvider(provider.Type, provider.ClientId, provider.ClientSecret, provider.Host, cert.PublicKey, cert.PrivateKey, cert.AuthorityPublicKey, cert.AuthorityRootPublicKey)
|
pProvider := pp.GetPaymentProvider(provider.Type, provider.ClientId, provider.ClientSecret, provider.Host, cert.Certificate, cert.PrivateKey, cert.AuthorityPublicKey, cert.AuthorityRootPublicKey)
|
||||||
|
|
||||||
paymentName := util.GenerateTimeId()
|
paymentName := util.GenerateTimeId()
|
||||||
returnUrl := ""
|
returnUrl := ""
|
||||||
|
@ -214,7 +214,7 @@ func (p *Provider) getPaymentProvider() (pp.PaymentProvider, *Cert, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pProvider := pp.GetPaymentProvider(p.Type, p.ClientId, p.ClientSecret, p.Host, cert.PublicKey, cert.PrivateKey, cert.AuthorityPublicKey, cert.AuthorityRootPublicKey)
|
pProvider := pp.GetPaymentProvider(p.Type, p.ClientId, p.ClientSecret, p.Host, cert.Certificate, cert.PrivateKey, cert.AuthorityPublicKey, cert.AuthorityRootPublicKey)
|
||||||
if pProvider == nil {
|
if pProvider == nil {
|
||||||
return nil, cert, fmt.Errorf("the payment provider type: %s is not supported", p.Type)
|
return nil, cert, fmt.Errorf("the payment provider type: %s is not supported", p.Type)
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
//returns a saml2 response
|
//returns a saml2 response
|
||||||
func NewSamlResponse(user *User, host string, publicKey string, destination string, iss string, requestId string, redirectUri []string) (*etree.Element, error) {
|
func NewSamlResponse(user *User, host string, certificate string, destination string, iss string, requestId string, redirectUri []string) (*etree.Element, error) {
|
||||||
samlResponse := &etree.Element{
|
samlResponse := &etree.Element{
|
||||||
Space: "samlp",
|
Space: "samlp",
|
||||||
Tag: "Response",
|
Tag: "Response",
|
||||||
@ -177,8 +177,8 @@ type Attribute struct {
|
|||||||
func GetSamlMeta(application *Application, host string) (*IdpEntityDescriptor, error) {
|
func GetSamlMeta(application *Application, host string) (*IdpEntityDescriptor, error) {
|
||||||
//_, originBackend := getOriginFromHost(host)
|
//_, originBackend := getOriginFromHost(host)
|
||||||
cert := getCertByApplication(application)
|
cert := getCertByApplication(application)
|
||||||
block, _ := pem.Decode([]byte(cert.PublicKey))
|
block, _ := pem.Decode([]byte(cert.Certificate))
|
||||||
publicKey := base64.StdEncoding.EncodeToString(block.Bytes)
|
certificate := base64.StdEncoding.EncodeToString(block.Bytes)
|
||||||
|
|
||||||
origin := beego.AppConfig.String("origin")
|
origin := beego.AppConfig.String("origin")
|
||||||
originFrontend, originBackend := getOriginFromHost(host)
|
originFrontend, originBackend := getOriginFromHost(host)
|
||||||
@ -199,7 +199,7 @@ func GetSamlMeta(application *Application, host string) (*IdpEntityDescriptor, e
|
|||||||
KeyInfo: KeyInfo{
|
KeyInfo: KeyInfo{
|
||||||
X509Data: X509Data{
|
X509Data: X509Data{
|
||||||
X509Certificate: X509Certificate{
|
X509Certificate: X509Certificate{
|
||||||
Cert: publicKey,
|
Cert: certificate,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -248,18 +248,18 @@ func GetSamlResponse(application *Application, user *User, samlRequest string, h
|
|||||||
return "", "", fmt.Errorf("err: invalid issuer url")
|
return "", "", fmt.Errorf("err: invalid issuer url")
|
||||||
}
|
}
|
||||||
|
|
||||||
// get public key string
|
// get certificate string
|
||||||
cert := getCertByApplication(application)
|
cert := getCertByApplication(application)
|
||||||
block, _ := pem.Decode([]byte(cert.PublicKey))
|
block, _ := pem.Decode([]byte(cert.Certificate))
|
||||||
publicKey := base64.StdEncoding.EncodeToString(block.Bytes)
|
certificate := base64.StdEncoding.EncodeToString(block.Bytes)
|
||||||
|
|
||||||
_, originBackend := getOriginFromHost(host)
|
_, originBackend := getOriginFromHost(host)
|
||||||
|
|
||||||
// build signedResponse
|
// build signedResponse
|
||||||
samlResponse, _ := NewSamlResponse(user, originBackend, publicKey, authnRequest.AssertionConsumerServiceURL, authnRequest.Issuer.Url, authnRequest.ID, application.RedirectUris)
|
samlResponse, _ := NewSamlResponse(user, originBackend, certificate, authnRequest.AssertionConsumerServiceURL, authnRequest.Issuer.Url, authnRequest.ID, application.RedirectUris)
|
||||||
randomKeyStore := &X509Key{
|
randomKeyStore := &X509Key{
|
||||||
PrivateKey: cert.PrivateKey,
|
PrivateKey: cert.PrivateKey,
|
||||||
X509Certificate: publicKey,
|
X509Certificate: certificate,
|
||||||
}
|
}
|
||||||
ctx := dsig.NewDefaultSigningContext(randomKeyStore)
|
ctx := dsig.NewDefaultSigningContext(randomKeyStore)
|
||||||
ctx.Hash = crypto.SHA1
|
ctx.Hash = crypto.SHA1
|
||||||
|
@ -241,11 +241,11 @@ func GetValidationBySaml(samlRequest string, host string) (string, string, error
|
|||||||
samlResponse := NewSamlResponse11(user, request.RequestID, host)
|
samlResponse := NewSamlResponse11(user, request.RequestID, host)
|
||||||
|
|
||||||
cert := getCertByApplication(application)
|
cert := getCertByApplication(application)
|
||||||
block, _ := pem.Decode([]byte(cert.PublicKey))
|
block, _ := pem.Decode([]byte(cert.Certificate))
|
||||||
publicKey := base64.StdEncoding.EncodeToString(block.Bytes)
|
certificate := base64.StdEncoding.EncodeToString(block.Bytes)
|
||||||
randomKeyStore := &X509Key{
|
randomKeyStore := &X509Key{
|
||||||
PrivateKey: cert.PrivateKey,
|
PrivateKey: cert.PrivateKey,
|
||||||
X509Certificate: publicKey,
|
X509Certificate: certificate,
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := dsig.NewDefaultSigningContext(randomKeyStore)
|
ctx := dsig.NewDefaultSigningContext(randomKeyStore)
|
||||||
|
@ -129,13 +129,13 @@ func ParseJwtToken(token string, cert *Cert) (*Claims, error) {
|
|||||||
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
|
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
|
||||||
}
|
}
|
||||||
|
|
||||||
// RSA public key
|
// RSA certificate
|
||||||
publicKey, err := jwt.ParseRSAPublicKeyFromPEM([]byte(cert.PublicKey))
|
certificate, err := jwt.ParseRSAPublicKeyFromPEM([]byte(cert.Certificate))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return publicKey, nil
|
return certificate, nil
|
||||||
})
|
})
|
||||||
|
|
||||||
if t != nil {
|
if t != nil {
|
||||||
|
@ -23,10 +23,10 @@ import (
|
|||||||
|
|
||||||
func TestGenerateRsaKeys(t *testing.T) {
|
func TestGenerateRsaKeys(t *testing.T) {
|
||||||
fileId := "token_jwt_key"
|
fileId := "token_jwt_key"
|
||||||
publicKey, privateKey := generateRsaKeys(4096, 20, "Casdoor Cert", "Casdoor Organization")
|
certificate, privateKey := generateRsaKeys(4096, 20, "Casdoor Cert", "Casdoor Organization")
|
||||||
|
|
||||||
// Write certificate (aka public key) to file.
|
// Write certificate (aka certificate) to file.
|
||||||
util.WriteStringToPath(publicKey, fmt.Sprintf("%s.pem", fileId))
|
util.WriteStringToPath(certificate, fmt.Sprintf("%s.pem", fileId))
|
||||||
|
|
||||||
// Write private key to file.
|
// Write private key to file.
|
||||||
util.WriteStringToPath(privateKey, fmt.Sprintf("%s.key", fileId))
|
util.WriteStringToPath(privateKey, fmt.Sprintf("%s.key", fileId))
|
||||||
|
@ -28,7 +28,7 @@ type AlipayPaymentProvider struct {
|
|||||||
Client *alipay.Client
|
Client *alipay.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewAlipayPaymentProvider(appId string, appPublicKey string, appPrivateKey string, authorityPublicKey string, authorityRootPublicKey string) *AlipayPaymentProvider {
|
func NewAlipayPaymentProvider(appId string, appCertificate string, appPrivateKey string, authorityPublicKey string, authorityRootPublicKey string) *AlipayPaymentProvider {
|
||||||
pp := &AlipayPaymentProvider{}
|
pp := &AlipayPaymentProvider{}
|
||||||
|
|
||||||
client, err := alipay.NewClient(appId, appPrivateKey, true)
|
client, err := alipay.NewClient(appId, appPrivateKey, true)
|
||||||
@ -36,7 +36,7 @@ func NewAlipayPaymentProvider(appId string, appPublicKey string, appPrivateKey s
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = client.SetCertSnByContent([]byte(appPublicKey), []byte(authorityRootPublicKey), []byte(authorityPublicKey))
|
err = client.SetCertSnByContent([]byte(appCertificate), []byte(authorityRootPublicKey), []byte(authorityPublicKey))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@ -22,9 +22,9 @@ type PaymentProvider interface {
|
|||||||
GetInvoice(paymentName string, personName string, personIdCard string, personEmail string, personPhone string, invoiceType string, invoiceTitle string, invoiceTaxId string) (string, error)
|
GetInvoice(paymentName string, personName string, personIdCard string, personEmail string, personPhone string, invoiceType string, invoiceTitle string, invoiceTaxId string) (string, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetPaymentProvider(typ string, appId string, clientSecret string, host string, appPublicKey string, appPrivateKey string, authorityPublicKey string, authorityRootPublicKey string) PaymentProvider {
|
func GetPaymentProvider(typ string, appId string, clientSecret string, host string, appCertificate string, appPrivateKey string, authorityPublicKey string, authorityRootPublicKey string) PaymentProvider {
|
||||||
if typ == "Alipay" {
|
if typ == "Alipay" {
|
||||||
return NewAlipayPaymentProvider(appId, appPublicKey, appPrivateKey, authorityPublicKey, authorityRootPublicKey)
|
return NewAlipayPaymentProvider(appId, appCertificate, appPrivateKey, authorityPublicKey, authorityRootPublicKey)
|
||||||
} else if typ == "GC" {
|
} else if typ == "GC" {
|
||||||
return NewGcPaymentProvider(appId, clientSecret, host)
|
return NewGcPaymentProvider(appId, clientSecret, host)
|
||||||
}
|
}
|
||||||
|
@ -3571,7 +3571,7 @@
|
|||||||
"privateKey": {
|
"privateKey": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
"publicKey": {
|
"certificate": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
"scope": {
|
"scope": {
|
||||||
|
@ -2346,7 +2346,7 @@ definitions:
|
|||||||
type: string
|
type: string
|
||||||
privateKey:
|
privateKey:
|
||||||
type: string
|
type: string
|
||||||
publicKey:
|
certificate:
|
||||||
type: string
|
type: string
|
||||||
scope:
|
scope:
|
||||||
type: string
|
type: string
|
||||||
|
@ -164,25 +164,25 @@ class CertEditPage extends React.Component {
|
|||||||
</Row>
|
</Row>
|
||||||
<Row style={{marginTop: "20px"}} >
|
<Row style={{marginTop: "20px"}} >
|
||||||
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
||||||
{Setting.getLabel(i18next.t("cert:Public key"), i18next.t("cert:Public key - Tooltip"))} :
|
{Setting.getLabel(i18next.t("cert:Certificate"), i18next.t("cert:Certificate - Tooltip"))} :
|
||||||
</Col>
|
</Col>
|
||||||
<Col span={9} >
|
<Col span={9} >
|
||||||
<Button style={{marginRight: "10px", marginBottom: "10px"}} onClick={() => {
|
<Button style={{marginRight: "10px", marginBottom: "10px"}} onClick={() => {
|
||||||
copy(this.state.cert.publicKey);
|
copy(this.state.cert.certificate);
|
||||||
Setting.showMessage("success", i18next.t("cert:Public key copied to clipboard successfully"));
|
Setting.showMessage("success", i18next.t("cert:Certificate copied to clipboard successfully"));
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{i18next.t("cert:Copy public key")}
|
{i18next.t("cert:Copy certificate")}
|
||||||
</Button>
|
</Button>
|
||||||
<Button type="primary" onClick={() => {
|
<Button type="primary" onClick={() => {
|
||||||
const blob = new Blob([this.state.cert.publicKey], {type: "text/plain;charset=utf-8"});
|
const blob = new Blob([this.state.cert.certificate], {type: "text/plain;charset=utf-8"});
|
||||||
FileSaver.saveAs(blob, "token_jwt_key.pem");
|
FileSaver.saveAs(blob, "token_jwt_key.pem");
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{i18next.t("cert:Download public key")}
|
{i18next.t("cert:Download certificate")}
|
||||||
</Button>
|
</Button>
|
||||||
<TextArea autoSize={{minRows: 30, maxRows: 30}} value={this.state.cert.publicKey} onChange={e => {
|
<TextArea autoSize={{minRows: 30, maxRows: 30}} value={this.state.cert.certificate} onChange={e => {
|
||||||
this.updateCertField("publicKey", e.target.value);
|
this.updateCertField("certificate", e.target.value);
|
||||||
}} />
|
}} />
|
||||||
</Col>
|
</Col>
|
||||||
<Col span={1} />
|
<Col span={1} />
|
||||||
|
@ -34,7 +34,7 @@ class CertListPage extends BaseListPage {
|
|||||||
cryptoAlgorithm: "RS256",
|
cryptoAlgorithm: "RS256",
|
||||||
bitSize: 4096,
|
bitSize: 4096,
|
||||||
expireInYears: 20,
|
expireInYears: 20,
|
||||||
publicKey: "",
|
certificate: "",
|
||||||
privateKey: "",
|
privateKey: "",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -622,7 +622,7 @@ class ProviderEditPage extends React.Component {
|
|||||||
</Row>
|
</Row>
|
||||||
<Row style={{marginTop: "20px"}} >
|
<Row style={{marginTop: "20px"}} >
|
||||||
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
||||||
{Setting.getLabel(i18next.t("provider:IdP"), i18next.t("provider:IdP public key"))} :
|
{Setting.getLabel(i18next.t("provider:IdP"), i18next.t("provider:IdP certificate"))} :
|
||||||
</Col>
|
</Col>
|
||||||
<Col span={22} >
|
<Col span={22} >
|
||||||
<Input value={this.state.provider.idP} onChange={e => {
|
<Input value={this.state.provider.idP} onChange={e => {
|
||||||
|
@ -638,13 +638,13 @@ class LoginPage extends React.Component {
|
|||||||
throw credentialRequestOptions.status.msg;
|
throw credentialRequestOptions.status.msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
credentialRequestOptions.publicKey.challenge = UserWebauthnBackend.webAuthnBufferDecode(credentialRequestOptions.publicKey.challenge);
|
credentialRequestOptions.certificate.challenge = UserWebauthnBackend.webAuthnBufferDecode(credentialRequestOptions.certificate.challenge);
|
||||||
credentialRequestOptions.publicKey.allowCredentials.forEach(function(listItem) {
|
credentialRequestOptions.certificate.allowCredentials.forEach(function(listItem) {
|
||||||
listItem.id = UserWebauthnBackend.webAuthnBufferDecode(listItem.id);
|
listItem.id = UserWebauthnBackend.webAuthnBufferDecode(listItem.id);
|
||||||
});
|
});
|
||||||
|
|
||||||
return navigator.credentials.get({
|
return navigator.credentials.get({
|
||||||
publicKey: credentialRequestOptions.publicKey
|
certificate: credentialRequestOptions.certificate
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
.then((assertion) => {
|
.then((assertion) => {
|
||||||
|
@ -21,15 +21,15 @@ export function registerWebauthnCredential() {
|
|||||||
})
|
})
|
||||||
.then(res => res.json())
|
.then(res => res.json())
|
||||||
.then((credentialCreationOptions) => {
|
.then((credentialCreationOptions) => {
|
||||||
credentialCreationOptions.publicKey.challenge = webAuthnBufferDecode(credentialCreationOptions.publicKey.challenge);
|
credentialCreationOptions.certificate.challenge = webAuthnBufferDecode(credentialCreationOptions.certificate.challenge);
|
||||||
credentialCreationOptions.publicKey.user.id = webAuthnBufferDecode(credentialCreationOptions.publicKey.user.id);
|
credentialCreationOptions.certificate.user.id = webAuthnBufferDecode(credentialCreationOptions.certificate.user.id);
|
||||||
if (credentialCreationOptions.publicKey.excludeCredentials) {
|
if (credentialCreationOptions.certificate.excludeCredentials) {
|
||||||
for (var i = 0; i < credentialCreationOptions.publicKey.excludeCredentials.length; i++) {
|
for (var i = 0; i < credentialCreationOptions.certificate.excludeCredentials.length; i++) {
|
||||||
credentialCreationOptions.publicKey.excludeCredentials[i].id = webAuthnBufferDecode(credentialCreationOptions.publicKey.excludeCredentials[i].id);
|
credentialCreationOptions.certificate.excludeCredentials[i].id = webAuthnBufferDecode(credentialCreationOptions.certificate.excludeCredentials[i].id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return navigator.credentials.create({
|
return navigator.credentials.create({
|
||||||
publicKey: credentialCreationOptions.publicKey
|
certificate: credentialCreationOptions.certificate
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
.then((credential) => {
|
.then((credential) => {
|
||||||
|
@ -51,11 +51,11 @@
|
|||||||
"Bit size": "Bitgröße",
|
"Bit size": "Bitgröße",
|
||||||
"Bit size - Tooltip": "Bit Größe - Tooltip",
|
"Bit size - Tooltip": "Bit Größe - Tooltip",
|
||||||
"Copy private key": "Privaten Schlüssel kopieren",
|
"Copy private key": "Privaten Schlüssel kopieren",
|
||||||
"Copy public key": "Öffentlichen Schlüssel kopieren",
|
"Copy certificate": "Kopieren des Zertifikats",
|
||||||
"Crypto algorithm": "Crypto-Algorithmus",
|
"Crypto algorithm": "Crypto-Algorithmus",
|
||||||
"Crypto algorithm - Tooltip": "Crypto algorithm - Tooltip",
|
"Crypto algorithm - Tooltip": "Crypto algorithm - Tooltip",
|
||||||
"Download private key": "Privaten Schlüssel herunterladen",
|
"Download private key": "Privaten Schlüssel herunterladen",
|
||||||
"Download public key": "Öffentlichen Schlüssel herunterladen",
|
"Download certificate": "Zertifikat herunterladen",
|
||||||
"Edit Cert": "Zitat bearbeiten",
|
"Edit Cert": "Zitat bearbeiten",
|
||||||
"Expire in years": "Gültig in Jahren",
|
"Expire in years": "Gültig in Jahren",
|
||||||
"Expire in years - Tooltip": "Verfällt in Jahren - Tooltip",
|
"Expire in years - Tooltip": "Verfällt in Jahren - Tooltip",
|
||||||
@ -63,9 +63,9 @@
|
|||||||
"Private key": "Privater Schlüssel",
|
"Private key": "Privater Schlüssel",
|
||||||
"Private key - Tooltip": "Privater Schlüssel - Tooltip",
|
"Private key - Tooltip": "Privater Schlüssel - Tooltip",
|
||||||
"Private key copied to clipboard successfully": "Privater Schlüssel erfolgreich in die Zwischenablage kopiert",
|
"Private key copied to clipboard successfully": "Privater Schlüssel erfolgreich in die Zwischenablage kopiert",
|
||||||
"Public key": "Öffentlicher Schlüssel",
|
"Certificate": "Zertifikat",
|
||||||
"Public key - Tooltip": "Öffentlicher Schlüssel - Tooltip",
|
"Certificate - Tooltip": "Zertifikat - Tooltip",
|
||||||
"Public key copied to clipboard successfully": "Öffentlicher Schlüssel erfolgreich in die Zwischenablage kopiert",
|
"Certificate copied to clipboard successfully": "Das Zertifikat wurde erfolgreich in die Zwischenablage kopiert",
|
||||||
"Scope": "Bereich",
|
"Scope": "Bereich",
|
||||||
"Scope - Tooltip": "Bereich - Tooltip",
|
"Scope - Tooltip": "Bereich - Tooltip",
|
||||||
"Type": "Typ",
|
"Type": "Typ",
|
||||||
@ -426,7 +426,7 @@
|
|||||||
"Host": "Host",
|
"Host": "Host",
|
||||||
"Host - Tooltip": "Unique string-style identifier",
|
"Host - Tooltip": "Unique string-style identifier",
|
||||||
"IdP": "IdP",
|
"IdP": "IdP",
|
||||||
"IdP public key": "IdP-öffentlicher Schlüssel",
|
"IdP certificate": "IdP-öffentlicher Schlüssel",
|
||||||
"Issuer URL": "Ausgabe-URL",
|
"Issuer URL": "Ausgabe-URL",
|
||||||
"Issuer URL - Tooltip": "Ausgabe-URL - Tooltip",
|
"Issuer URL - Tooltip": "Ausgabe-URL - Tooltip",
|
||||||
"Link copied to clipboard successfully": "Link erfolgreich in die Zwischenablage kopiert",
|
"Link copied to clipboard successfully": "Link erfolgreich in die Zwischenablage kopiert",
|
||||||
|
@ -51,11 +51,11 @@
|
|||||||
"Bit size": "Bit size",
|
"Bit size": "Bit size",
|
||||||
"Bit size - Tooltip": "Bit size - Tooltip",
|
"Bit size - Tooltip": "Bit size - Tooltip",
|
||||||
"Copy private key": "Copy private key",
|
"Copy private key": "Copy private key",
|
||||||
"Copy public key": "Copy public key",
|
"Copy certificate": "Copy certificate",
|
||||||
"Crypto algorithm": "Crypto algorithm",
|
"Crypto algorithm": "Crypto algorithm",
|
||||||
"Crypto algorithm - Tooltip": "Crypto algorithm - Tooltip",
|
"Crypto algorithm - Tooltip": "Crypto algorithm - Tooltip",
|
||||||
"Download private key": "Download private key",
|
"Download private key": "Download private key",
|
||||||
"Download public key": "Download public key",
|
"Download certificate": "Download certificate",
|
||||||
"Edit Cert": "Edit Cert",
|
"Edit Cert": "Edit Cert",
|
||||||
"Expire in years": "Expire in years",
|
"Expire in years": "Expire in years",
|
||||||
"Expire in years - Tooltip": "Expire in years - Tooltip",
|
"Expire in years - Tooltip": "Expire in years - Tooltip",
|
||||||
@ -63,9 +63,9 @@
|
|||||||
"Private key": "Private key",
|
"Private key": "Private key",
|
||||||
"Private key - Tooltip": "Private key - Tooltip",
|
"Private key - Tooltip": "Private key - Tooltip",
|
||||||
"Private key copied to clipboard successfully": "Private key copied to clipboard successfully",
|
"Private key copied to clipboard successfully": "Private key copied to clipboard successfully",
|
||||||
"Public key": "Public key",
|
"Certificate": "Certificate",
|
||||||
"Public key - Tooltip": "Public key - Tooltip",
|
"Certificate - Tooltip": "Certificate - Tooltip",
|
||||||
"Public key copied to clipboard successfully": "Public key copied to clipboard successfully",
|
"Certificate copied to clipboard successfully": "Certificate copied to clipboard successfully",
|
||||||
"Scope": "Scope",
|
"Scope": "Scope",
|
||||||
"Scope - Tooltip": "Scope - Tooltip",
|
"Scope - Tooltip": "Scope - Tooltip",
|
||||||
"Type": "Type",
|
"Type": "Type",
|
||||||
@ -426,7 +426,7 @@
|
|||||||
"Host": "Host",
|
"Host": "Host",
|
||||||
"Host - Tooltip": "Host - Tooltip",
|
"Host - Tooltip": "Host - Tooltip",
|
||||||
"IdP": "IdP",
|
"IdP": "IdP",
|
||||||
"IdP public key": "IdP public key",
|
"IdP certificate": "IdP certificate",
|
||||||
"Issuer URL": "Issuer URL",
|
"Issuer URL": "Issuer URL",
|
||||||
"Issuer URL - Tooltip": "Issuer URL - Tooltip",
|
"Issuer URL - Tooltip": "Issuer URL - Tooltip",
|
||||||
"Link copied to clipboard successfully": "Link copied to clipboard successfully",
|
"Link copied to clipboard successfully": "Link copied to clipboard successfully",
|
||||||
|
@ -51,21 +51,21 @@
|
|||||||
"Bit size": "Taille du bit",
|
"Bit size": "Taille du bit",
|
||||||
"Bit size - Tooltip": "Taille du bit - Infobulle",
|
"Bit size - Tooltip": "Taille du bit - Infobulle",
|
||||||
"Copy private key": "Copier la clé privée",
|
"Copy private key": "Copier la clé privée",
|
||||||
"Copy public key": "Copier la clé publique",
|
"Copy certificate": "Copier le certificate",
|
||||||
"Crypto algorithm": "Algorithme de cryptomonnaie",
|
"Crypto algorithm": "Algorithme de cryptomonnaie",
|
||||||
"Crypto algorithm - Tooltip": "Crypto algorithm - Tooltip",
|
"Crypto algorithm - Tooltip": "Crypto algorithm - Tooltip",
|
||||||
"Download private key": "Télécharger la clé privée",
|
"Download private key": "Télécharger la clé privée",
|
||||||
"Download public key": "Télécharger la clé publique",
|
"Download certificate": "Télécharger le certificate",
|
||||||
"Edit Cert": "Modifier le certificat",
|
"Edit Cert": "Modifier le certificate",
|
||||||
"Expire in years": "Expire dans les années",
|
"Expire in years": "Expire dans les années",
|
||||||
"Expire in years - Tooltip": "Expire dans les années - infobulle",
|
"Expire in years - Tooltip": "Expire dans les années - infobulle",
|
||||||
"New Cert": "New Cert",
|
"New Cert": "New Cert",
|
||||||
"Private key": "Clé privée",
|
"Private key": "Clé privée",
|
||||||
"Private key - Tooltip": "Clé privée - Infobulle",
|
"Private key - Tooltip": "Clé privée - Infobulle",
|
||||||
"Private key copied to clipboard successfully": "Clé privée copiée dans le presse-papiers avec succès",
|
"Private key copied to clipboard successfully": "Clé privée copiée dans le presse-papiers avec succès",
|
||||||
"Public key": "Clé publique",
|
"Certificate": "certificate",
|
||||||
"Public key - Tooltip": "Clé publique - Infobulle",
|
"Certificate - Tooltip": "certificate - Infobulle",
|
||||||
"Public key copied to clipboard successfully": "Clé publique copiée dans le presse-papiers avec succès",
|
"Certificate copied to clipboard successfully": "Le certificate a été copié avec succès dans le presse-papiers",
|
||||||
"Scope": "Périmètre d'application",
|
"Scope": "Périmètre d'application",
|
||||||
"Scope - Tooltip": "Scope - Infobulle",
|
"Scope - Tooltip": "Scope - Infobulle",
|
||||||
"Type": "Type de texte",
|
"Type": "Type de texte",
|
||||||
@ -426,7 +426,7 @@
|
|||||||
"Host": "Hôte",
|
"Host": "Hôte",
|
||||||
"Host - Tooltip": "Unique string-style identifier",
|
"Host - Tooltip": "Unique string-style identifier",
|
||||||
"IdP": "IDP",
|
"IdP": "IDP",
|
||||||
"IdP public key": "Clé publique IdP",
|
"IdP certificate": "Clé publique IdP",
|
||||||
"Issuer URL": "URL de l'émetteur",
|
"Issuer URL": "URL de l'émetteur",
|
||||||
"Issuer URL - Tooltip": "URL de l'émetteur - infobulle",
|
"Issuer URL - Tooltip": "URL de l'émetteur - infobulle",
|
||||||
"Link copied to clipboard successfully": "Lien copié dans le presse-papiers avec succès",
|
"Link copied to clipboard successfully": "Lien copié dans le presse-papiers avec succès",
|
||||||
|
@ -51,11 +51,11 @@
|
|||||||
"Bit size": "ビットサイズ",
|
"Bit size": "ビットサイズ",
|
||||||
"Bit size - Tooltip": "ビットサイズ - ツールチップ",
|
"Bit size - Tooltip": "ビットサイズ - ツールチップ",
|
||||||
"Copy private key": "秘密鍵をコピー",
|
"Copy private key": "秘密鍵をコピー",
|
||||||
"Copy public key": "公開鍵をコピー",
|
"Copy certificate": "証明書をコピーします",
|
||||||
"Crypto algorithm": "暗号化アルゴリズム",
|
"Crypto algorithm": "暗号化アルゴリズム",
|
||||||
"Crypto algorithm - Tooltip": "Crypto algorithm - Tooltip",
|
"Crypto algorithm - Tooltip": "Crypto algorithm - Tooltip",
|
||||||
"Download private key": "秘密鍵をダウンロード",
|
"Download private key": "秘密鍵をダウンロード",
|
||||||
"Download public key": "公開鍵をダウンロード",
|
"Download certificate": "証明書をダウンロードします",
|
||||||
"Edit Cert": "Certを編集",
|
"Edit Cert": "Certを編集",
|
||||||
"Expire in years": "有効期限",
|
"Expire in years": "有効期限",
|
||||||
"Expire in years - Tooltip": "年間有効期限 - ツールチップ",
|
"Expire in years - Tooltip": "年間有効期限 - ツールチップ",
|
||||||
@ -63,9 +63,9 @@
|
|||||||
"Private key": "Private key",
|
"Private key": "Private key",
|
||||||
"Private key - Tooltip": "Private key - Tooltip",
|
"Private key - Tooltip": "Private key - Tooltip",
|
||||||
"Private key copied to clipboard successfully": "秘密鍵を正常にクリップボードにコピーしました",
|
"Private key copied to clipboard successfully": "秘密鍵を正常にクリップボードにコピーしました",
|
||||||
"Public key": "公開キー",
|
"Certificate": "Certificate",
|
||||||
"Public key - Tooltip": "Public key - Tooltip",
|
"Certificate - Tooltip": "Certificate - Tooltip",
|
||||||
"Public key copied to clipboard successfully": "公開鍵を正常にクリップボードにコピーしました",
|
"Certificate copied to clipboard successfully": "証明書はクリップボードに正常にコピーされました",
|
||||||
"Scope": "スコープ",
|
"Scope": "スコープ",
|
||||||
"Scope - Tooltip": "スコープ → ツールチップ",
|
"Scope - Tooltip": "スコープ → ツールチップ",
|
||||||
"Type": "タイプ",
|
"Type": "タイプ",
|
||||||
@ -426,7 +426,7 @@
|
|||||||
"Host": "ホスト",
|
"Host": "ホスト",
|
||||||
"Host - Tooltip": "Unique string-style identifier",
|
"Host - Tooltip": "Unique string-style identifier",
|
||||||
"IdP": "IdP",
|
"IdP": "IdP",
|
||||||
"IdP public key": "IdP public key",
|
"IdP certificate": "IdP certificate",
|
||||||
"Issuer URL": "Issuer URL",
|
"Issuer URL": "Issuer URL",
|
||||||
"Issuer URL - Tooltip": "Issuer URL - ツールチップ",
|
"Issuer URL - Tooltip": "Issuer URL - ツールチップ",
|
||||||
"Link copied to clipboard successfully": "リンクをクリップボードにコピーしました",
|
"Link copied to clipboard successfully": "リンクをクリップボードにコピーしました",
|
||||||
|
@ -51,11 +51,11 @@
|
|||||||
"Bit size": "Bit size",
|
"Bit size": "Bit size",
|
||||||
"Bit size - Tooltip": "Bit size - Tooltip",
|
"Bit size - Tooltip": "Bit size - Tooltip",
|
||||||
"Copy private key": "Copy private key",
|
"Copy private key": "Copy private key",
|
||||||
"Copy public key": "Copy public key",
|
"Copy certificate": "Copy certificate",
|
||||||
"Crypto algorithm": "Crypto algorithm",
|
"Crypto algorithm": "Crypto algorithm",
|
||||||
"Crypto algorithm - Tooltip": "Crypto algorithm - Tooltip",
|
"Crypto algorithm - Tooltip": "Crypto algorithm - Tooltip",
|
||||||
"Download private key": "Download private key",
|
"Download private key": "Download private key",
|
||||||
"Download public key": "Download public key",
|
"Download certificate": "Download certificate",
|
||||||
"Edit Cert": "Edit Cert",
|
"Edit Cert": "Edit Cert",
|
||||||
"Expire in years": "Expire in years",
|
"Expire in years": "Expire in years",
|
||||||
"Expire in years - Tooltip": "Expire in years - Tooltip",
|
"Expire in years - Tooltip": "Expire in years - Tooltip",
|
||||||
@ -63,9 +63,9 @@
|
|||||||
"Private key": "Private key",
|
"Private key": "Private key",
|
||||||
"Private key - Tooltip": "Private key - Tooltip",
|
"Private key - Tooltip": "Private key - Tooltip",
|
||||||
"Private key copied to clipboard successfully": "Private key copied to clipboard successfully",
|
"Private key copied to clipboard successfully": "Private key copied to clipboard successfully",
|
||||||
"Public key": "Public key",
|
"Certificate": "Certificate",
|
||||||
"Public key - Tooltip": "Public key - Tooltip",
|
"Certificate - Tooltip": "Certificate - Tooltip",
|
||||||
"Public key copied to clipboard successfully": "Public key copied to clipboard successfully",
|
"Certificate copied to clipboard successfully": "Certificate copied to clipboard successfully",
|
||||||
"Scope": "Scope",
|
"Scope": "Scope",
|
||||||
"Scope - Tooltip": "Scope - Tooltip",
|
"Scope - Tooltip": "Scope - Tooltip",
|
||||||
"Type": "Type",
|
"Type": "Type",
|
||||||
@ -426,7 +426,7 @@
|
|||||||
"Host": "Host",
|
"Host": "Host",
|
||||||
"Host - Tooltip": "Unique string-style identifier",
|
"Host - Tooltip": "Unique string-style identifier",
|
||||||
"IdP": "IdP",
|
"IdP": "IdP",
|
||||||
"IdP public key": "IdP public key",
|
"IdP certificate": "IdP certificate",
|
||||||
"Issuer URL": "Issuer URL",
|
"Issuer URL": "Issuer URL",
|
||||||
"Issuer URL - Tooltip": "Issuer URL - Tooltip",
|
"Issuer URL - Tooltip": "Issuer URL - Tooltip",
|
||||||
"Link copied to clipboard successfully": "Link copied to clipboard successfully",
|
"Link copied to clipboard successfully": "Link copied to clipboard successfully",
|
||||||
|
@ -51,11 +51,11 @@
|
|||||||
"Bit size": "Размер бита",
|
"Bit size": "Размер бита",
|
||||||
"Bit size - Tooltip": "Размер бита - Подсказка",
|
"Bit size - Tooltip": "Размер бита - Подсказка",
|
||||||
"Copy private key": "Копировать закрытый ключ",
|
"Copy private key": "Копировать закрытый ключ",
|
||||||
"Copy public key": "Копировать открытый ключ",
|
"Copy certificate": "Копирование сертификата",
|
||||||
"Crypto algorithm": "Алгоритм крипто",
|
"Crypto algorithm": "Алгоритм крипто",
|
||||||
"Crypto algorithm - Tooltip": "Crypto algorithm - Tooltip",
|
"Crypto algorithm - Tooltip": "Crypto algorithm - Tooltip",
|
||||||
"Download private key": "Скачать закрытый ключ",
|
"Download private key": "Скачать закрытый ключ",
|
||||||
"Download public key": "Скачать открытый ключ",
|
"Download certificate": "Скачать сертификат",
|
||||||
"Edit Cert": "Изменить сертификат",
|
"Edit Cert": "Изменить сертификат",
|
||||||
"Expire in years": "Истекает через годы",
|
"Expire in years": "Истекает через годы",
|
||||||
"Expire in years - Tooltip": "Истекает через годы - Подсказка",
|
"Expire in years - Tooltip": "Истекает через годы - Подсказка",
|
||||||
@ -63,9 +63,9 @@
|
|||||||
"Private key": "Приватный ключ",
|
"Private key": "Приватный ключ",
|
||||||
"Private key - Tooltip": "Приватный ключ - Подсказка",
|
"Private key - Tooltip": "Приватный ключ - Подсказка",
|
||||||
"Private key copied to clipboard successfully": "Приватный ключ скопирован в буфер обмена",
|
"Private key copied to clipboard successfully": "Приватный ключ скопирован в буфер обмена",
|
||||||
"Public key": "Публичный ключ",
|
"Certificate": "сертификат",
|
||||||
"Public key - Tooltip": "Открытый ключ - Подсказка",
|
"Certificate - Tooltip": "сертификат - Подсказка",
|
||||||
"Public key copied to clipboard successfully": "Открытый ключ успешно скопирован в буфер обмена",
|
"Certificate copied to clipboard successfully": "Сертификат успешно скопирован в буфер обмена",
|
||||||
"Scope": "Сфера охвата",
|
"Scope": "Сфера охвата",
|
||||||
"Scope - Tooltip": "Область применения - Подсказка",
|
"Scope - Tooltip": "Область применения - Подсказка",
|
||||||
"Type": "Тип",
|
"Type": "Тип",
|
||||||
@ -426,7 +426,7 @@
|
|||||||
"Host": "Хост",
|
"Host": "Хост",
|
||||||
"Host - Tooltip": "Unique string-style identifier",
|
"Host - Tooltip": "Unique string-style identifier",
|
||||||
"IdP": "ИдП",
|
"IdP": "ИдП",
|
||||||
"IdP public key": "Публичный ключ IdP",
|
"IdP certificate": "Публичный ключ IdP",
|
||||||
"Issuer URL": "URL эмитента",
|
"Issuer URL": "URL эмитента",
|
||||||
"Issuer URL - Tooltip": "URL эмитента - Tooltip",
|
"Issuer URL - Tooltip": "URL эмитента - Tooltip",
|
||||||
"Link copied to clipboard successfully": "Ссылка скопирована в буфер обмена",
|
"Link copied to clipboard successfully": "Ссылка скопирована в буфер обмена",
|
||||||
|
@ -51,11 +51,11 @@
|
|||||||
"Bit size": "位大小",
|
"Bit size": "位大小",
|
||||||
"Bit size - Tooltip": "位大小 - 工具提示",
|
"Bit size - Tooltip": "位大小 - 工具提示",
|
||||||
"Copy private key": "复制私钥",
|
"Copy private key": "复制私钥",
|
||||||
"Copy public key": "复制公钥",
|
"Copy certificate": "复制证书",
|
||||||
"Crypto algorithm": "加密算法",
|
"Crypto algorithm": "加密算法",
|
||||||
"Crypto algorithm - Tooltip": "Crypto algorithm - Tooltip",
|
"Crypto algorithm - Tooltip": "Crypto algorithm - Tooltip",
|
||||||
"Download private key": "下载私钥",
|
"Download private key": "下载私钥",
|
||||||
"Download public key": "下载公钥",
|
"Download certificate": "下载证书",
|
||||||
"Edit Cert": "编辑证书",
|
"Edit Cert": "编辑证书",
|
||||||
"Expire in years": "有效期(年)",
|
"Expire in years": "有效期(年)",
|
||||||
"Expire in years - Tooltip": "到期年份-工具提示",
|
"Expire in years - Tooltip": "到期年份-工具提示",
|
||||||
@ -63,9 +63,9 @@
|
|||||||
"Private key": "私钥",
|
"Private key": "私钥",
|
||||||
"Private key - Tooltip": "私钥 - 工具提示",
|
"Private key - Tooltip": "私钥 - 工具提示",
|
||||||
"Private key copied to clipboard successfully": "私钥已成功复制到剪贴板",
|
"Private key copied to clipboard successfully": "私钥已成功复制到剪贴板",
|
||||||
"Public key": "公钥",
|
"Certificate": "证书",
|
||||||
"Public key - Tooltip": "公钥 - 工具提示",
|
"Certificate - Tooltip": "证书 - 工具提示",
|
||||||
"Public key copied to clipboard successfully": "公钥已成功复制到剪贴板",
|
"Certificate copied to clipboard successfully": "证书已成功复制到剪贴板",
|
||||||
"Scope": "用途",
|
"Scope": "用途",
|
||||||
"Scope - Tooltip": "范围 - 工具提示",
|
"Scope - Tooltip": "范围 - 工具提示",
|
||||||
"Type": "类型",
|
"Type": "类型",
|
||||||
@ -426,7 +426,7 @@
|
|||||||
"Host": "主机",
|
"Host": "主机",
|
||||||
"Host - Tooltip": "主机",
|
"Host - Tooltip": "主机",
|
||||||
"IdP": "IdP",
|
"IdP": "IdP",
|
||||||
"IdP public key": "IdP 公钥",
|
"IdP certificate": "IdP 公钥",
|
||||||
"Issuer URL": "发行者网址",
|
"Issuer URL": "发行者网址",
|
||||||
"Issuer URL - Tooltip": "发行者URL - 工具提示",
|
"Issuer URL - Tooltip": "发行者URL - 工具提示",
|
||||||
"Link copied to clipboard successfully": "链接已成功复制到剪贴板",
|
"Link copied to clipboard successfully": "链接已成功复制到剪贴板",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user