mirror of
https://github.com/golang/oauth2.git
synced 2025-07-21 00:00:09 +08:00
Creates a new package called clientcredentials and adds transport and token information to the internal package. Also modifies the oauth2 package to make use of the newly added files in the internal package. The clientcredentials package allows for token requests using a "client credentials" grant type. Fixes https://github.com/golang/oauth2/issues/7 Change-Id: Iec649d1029870c27a2d1023baa9d52db42ff45e8 Reviewed-on: https://go-review.googlesource.com/2983 Reviewed-by: Burcu Dogan <jbd@google.com> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
77 lines
2.0 KiB
Go
77 lines
2.0 KiB
Go
// Copyright 2014 The oauth2 Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// Package internal contains support packages for oauth2 package.
|
|
package internal
|
|
|
|
import (
|
|
"bufio"
|
|
"crypto/rsa"
|
|
"crypto/x509"
|
|
"encoding/pem"
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"strings"
|
|
)
|
|
|
|
// ParseKey converts the binary contents of a private key file
|
|
// to an *rsa.PrivateKey. It detects whether the private key is in a
|
|
// PEM container or not. If so, it extracts the the private key
|
|
// from PEM container before conversion. It only supports PEM
|
|
// containers with no passphrase.
|
|
func ParseKey(key []byte) (*rsa.PrivateKey, error) {
|
|
block, _ := pem.Decode(key)
|
|
if block != nil {
|
|
key = block.Bytes
|
|
}
|
|
parsedKey, err := x509.ParsePKCS8PrivateKey(key)
|
|
if err != nil {
|
|
parsedKey, err = x509.ParsePKCS1PrivateKey(key)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("private key should be a PEM or plain PKSC1 or PKCS8; parse error: %v", err)
|
|
}
|
|
}
|
|
parsed, ok := parsedKey.(*rsa.PrivateKey)
|
|
if !ok {
|
|
return nil, errors.New("private key is invalid")
|
|
}
|
|
return parsed, nil
|
|
}
|
|
|
|
func ParseINI(ini io.Reader) (map[string]map[string]string, error) {
|
|
result := map[string]map[string]string{
|
|
"": map[string]string{}, // root section
|
|
}
|
|
scanner := bufio.NewScanner(ini)
|
|
currentSection := ""
|
|
for scanner.Scan() {
|
|
line := strings.TrimSpace(scanner.Text())
|
|
if strings.HasPrefix(line, ";") {
|
|
// comment.
|
|
continue
|
|
}
|
|
if strings.HasPrefix(line, "[") && strings.HasSuffix(line, "]") {
|
|
currentSection = strings.TrimSpace(line[1 : len(line)-1])
|
|
result[currentSection] = map[string]string{}
|
|
continue
|
|
}
|
|
parts := strings.SplitN(line, "=", 2)
|
|
if len(parts) == 2 && parts[0] != "" {
|
|
result[currentSection][strings.TrimSpace(parts[0])] = strings.TrimSpace(parts[1])
|
|
}
|
|
}
|
|
if err := scanner.Err(); err != nil {
|
|
return nil, fmt.Errorf("error scanning ini: %v", err)
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
func CondVal(v string) []string {
|
|
if v == "" {
|
|
return nil
|
|
}
|
|
return []string{v}
|
|
}
|