本文整理匯總了Golang中github.com/pgpst/pgpst/internal/github.com/gin-gonic/gin.Context.Bind方法的典型用法代碼示例。如果您正苦於以下問題:Golang Context.Bind方法的具體用法?Golang Context.Bind怎麽用?Golang Context.Bind使用的例子?那麽, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在類github.com/pgpst/pgpst/internal/github.com/gin-gonic/gin.Context
的用法示例。
在下文中一共展示了Context.Bind方法的6個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Golang代碼示例。
示例1: createResource
func (a *API) createResource(c *gin.Context) {
// Get token and account info from the context
var (
account = c.MustGet("account").(*models.Account)
token = c.MustGet("token").(*models.Token)
)
// Check the scope
if !models.InScope(token.Scope, []string{"resources:create"}) {
c.JSON(403, &gin.H{
"code": 0,
"error": "Your token has insufficient scope",
})
return
}
// Decode the input
var input struct {
Meta map[string]interface{} `json:"meta"`
Body []byte `json:"body"`
Tags []string `json:"tags"`
}
if err := c.Bind(&input); err != nil {
c.JSON(422, &gin.H{
"code": 0,
"message": err.Error(),
})
return
}
// Save it into database
resource := &models.Resource{
ID: uniuri.NewLen(uniuri.UUIDLen),
DateCreated: time.Now(),
DateModified: time.Now(),
Owner: account.ID,
Meta: input.Meta,
Body: input.Body,
Tags: input.Tags,
}
// Insert it into database
if err := r.Table("resources").Insert(resource).Exec(a.Rethink); err != nil {
c.JSON(500, &gin.H{
"code": 0,
"message": err.Error(),
})
return
}
c.JSON(201, resource)
}
示例2: oauthToken
func (a *API) oauthToken(c *gin.Context) {
// Decode the input
var input struct {
GrantType string `json:"grant_type"`
Code string `json:"code"`
ClientID string `json:"client_id"`
ClientSecret string `json:"client_secret"`
Address string `json:"address"`
Password string `json:"password"`
ExpiryTime int64 `json:"expiry_time"`
}
if err := c.Bind(&input); err != nil {
c.JSON(422, &gin.H{
"code": CodeGeneralInvalidInput,
"message": err.Error(),
})
return
}
// Switch the action
switch input.GrantType {
case "authorization_code":
// Parameters:
// - code - authorization code from the app
// - client_id - id of the client app
// - client_secret - secret of the client app
// Fetch the application from database
cursor, err := r.Table("applications").Get(input.ClientID).Default(map[string]interface{}{}).Run(a.Rethink)
if err != nil {
c.JSON(500, &gin.H{
"code": CodeGeneralDatabaseError,
"message": err.Error(),
})
return
}
defer cursor.Close()
var application *models.Application
if err := cursor.One(&application); err != nil {
c.JSON(500, &gin.H{
"code": CodeGeneralDatabaseError,
"message": err.Error(),
})
return
}
if application.ID == "" {
c.JSON(422, &gin.H{
"code": CodeOAuthInvalidApplication,
"message": "No such client ID.",
})
return
}
if application.Secret != input.ClientSecret {
c.JSON(422, &gin.H{
"code": CodeOAuthInvalidSecret,
"message": "Invalid client secret.",
})
return
}
// Fetch the code from the database
cursor, err = r.Table("tokens").Get(input.Code).Default(map[string]interface{}{}).Run(a.Rethink)
if err != nil {
c.JSON(500, &gin.H{
"code": CodeGeneralDatabaseError,
"message": err.Error(),
})
return
}
defer cursor.Close()
var codeToken *models.Token
if err := cursor.One(&codeToken); err != nil {
c.JSON(500, &gin.H{
"code": CodeGeneralDatabaseError,
"message": err.Error(),
})
return
}
// Ensure token type and matching client id
if codeToken.ID == "" || codeToken.Type != "code" || codeToken.ClientID != input.ClientID {
c.JSON(422, &gin.H{
"code": CodeOAuthInvalidCode,
"message": "Invalid code",
})
return
}
// Create a new authentication code
token := &models.Token{
ID: uniuri.NewLen(uniuri.UUIDLen),
DateCreated: time.Now(),
DateModified: time.Now(),
Owner: codeToken.Owner,
ExpiryDate: codeToken.ExpiryDate,
Type: "auth",
Scope: codeToken.Scope,
ClientID: input.ClientID,
}
//.........這裏部分代碼省略.........
示例3: createToken
func (a *API) createToken(c *gin.Context) {
// Get token and account info from the context
var (
account = c.MustGet("account").(*models.Account)
currentToken = c.MustGet("token").(*models.Token)
)
if !models.InScope(currentToken.Scope, []string{"tokens:oauth"}) {
c.JSON(403, &gin.H{
"code": 0,
"error": "Your token has insufficient scope",
})
return
}
// Decode the input
var input struct {
Type string `json:"type"`
ClientID string `json:"client_id"`
Scope []string `json:"scope"`
ExpiryTime int64 `json:"expiry_time"`
}
if err := c.Bind(&input); err != nil {
c.JSON(422, &gin.H{
"code": 0,
"message": err.Error(),
})
return
}
// Run the validation
errors := []string{}
// Type has to be code
if input.Type != "code" && input.Type != "auth" {
errors = append(errors, "Only \"code\" token can be created using this endpoint.")
}
// Scope must contain proper scopes
sm := map[string]struct{}{}
for _, scope := range input.Scope {
if _, ok := models.Scopes[scope]; !ok {
errors = append(errors, "Scope \""+scope+"\" does not exist.")
} else {
sm[scope] = struct{}{}
}
}
if _, ok := sm["password_grant"]; ok {
errors = append(errors, "You can not request the password grant scope.")
}
if _, ok := sm["admin"]; ok && account.Subscription != "admin" {
errors = append(errors, "You can not request the admin scope.")
}
// Expiry time must be valid
if input.ExpiryTime == 0 {
input.ExpiryTime = 86400
} else if input.ExpiryTime < 0 {
errors = append(errors, "Invalid expiry time.")
}
// Client ID has to be an application ID
var application *models.Application
if input.ClientID == "" {
errors = append(errors, "Client ID is missing.")
} else {
cursor, err := r.Table("applications").Get(input.ClientID).Default(map[string]interface{}{}).Run(a.Rethink)
if err != nil {
c.JSON(500, &gin.H{
"code": 0,
"message": err.Error(),
})
return
}
defer cursor.Close()
if err := cursor.One(&application); err != nil {
c.JSON(500, &gin.H{
"code": 0,
"message": err.Error(),
})
return
}
if application.ID == "" {
errors = append(errors, "There is no such application.")
}
}
// Abort the request if there are errors
if len(errors) > 0 {
c.JSON(422, &gin.H{
"code": 0,
"message": "Validation failed.",
"errors": errors,
})
return
}
// Create a new token
token := &models.Token{
//.........這裏部分代碼省略.........
示例4: updateAccount
func (a *API) updateAccount(c *gin.Context) {
// Get token and account info from the context
var (
account = c.MustGet("account").(*models.Account)
token = c.MustGet("token").(*models.Token)
)
// Decode the input
var input struct {
MainAddress string `json:"main_address"`
NewPassword []byte `json:"new_password"`
OldPassword []byte `json:"old_password"`
}
if err := c.Bind(&input); err != nil {
c.JSON(422, &gin.H{
"code": 0,
"message": err.Error(),
})
return
}
var newAddress *models.Address
if input.MainAddress != "" {
// Fetch address from the database
cursor, err := r.Table("addresses").Get(input.MainAddress).Default(map[string]interface{}{}).Run(a.Rethink)
if err != nil {
c.JSON(500, &gin.H{
"code": 0,
"message": err.Error(),
})
return
}
defer cursor.Close()
if err := cursor.One(&newAddress); err != nil {
c.JSON(500, &gin.H{
"code": 0,
"message": err.Error(),
})
return
}
// Verify that we got something
if newAddress.ID == "" {
c.JSON(422, &gin.H{
"code": 0,
"message": "No such address exists",
})
return
}
}
// Resolve the account ID and check scope accordingly
id := c.Param("id")
if id == "me" {
// Swap the ID to own account's ID
id = account.ID
}
if id == account.ID {
// Check the scope
if !models.InScope(token.Scope, []string{"account:modify"}) {
c.JSON(403, &gin.H{
"code": 0,
"error": "Your token has insufficient scope",
})
return
}
// Validate password
valid, _, err := account.VerifyPassword(input.OldPassword)
if err != nil {
c.JSON(500, &gin.H{
"code": 0,
"message": err.Error(),
})
return
}
if !valid {
c.JSON(401, &gin.H{
"code": 0,
"message": "Invalid password",
})
return
}
} else {
// Check the scope
if !models.InScope(token.Scope, []string{"admin"}) {
c.JSON(403, &gin.H{
"code": 0,
"error": "Your token has insufficient scope",
})
return
}
// Fetch the account from the database
cursor, err := r.Table("accounts").Get(id).Default(map[string]interface{}{}).Run(a.Rethink)
if err != nil {
c.JSON(500, &gin.H{
"code": 0,
"message": err.Error(),
//.........這裏部分代碼省略.........
示例5: createAccount
func (a *API) createAccount(c *gin.Context) {
// Decode the input
var input struct {
Action string `json:"action"`
Username string `json:"username"`
AltEmail string `json:"alt_email"`
Token string `json:"token"`
Password string `json:"password"`
Address string `json:"address"`
}
if err := c.Bind(&input); err != nil {
c.JSON(422, &gin.H{
"code": 0,
"message": err.Error(),
})
return
}
// Switch the action
switch input.Action {
case "reserve":
// Parameters:
// - username - desired username
// - alt_email - desired email
// Normalize the username
styledID := utils.NormalizeUsername(input.Username)
nu := utils.RemoveDots(styledID)
// Validate input:
// - len(username) >= 3 && len(username) <= 32
// - email.match(alt_email)
errors := []string{}
if len(nu) < 3 {
errors = append(errors, "Username too short. It must be 3-32 characters long.")
}
if len(nu) > 32 {
errors = append(errors, "Username too long. It must be 3-32 characters long.")
}
if !govalidator.IsEmail(input.AltEmail) {
errors = append(errors, "Invalid alternative e-mail format.")
}
if len(errors) > 0 {
c.JSON(422, &gin.H{
"code": 0,
"message": "Validation failed.",
"errors": errors,
})
return
}
// Check in the database whether you can register such account
cursor, err := r.Table("addresses").Get(nu + "@pgp.st").Ne(nil).Do(func(left r.Term) map[string]interface{} {
return map[string]interface{}{
"username": left,
"alt_email": r.Table("accounts").GetAllByIndex("alt_email", input.AltEmail).Count().Eq(1),
}
}).Run(a.Rethink)
if err != nil {
c.JSON(500, &gin.H{
"code": 0,
"message": err.Error(),
})
return
}
defer cursor.Close()
var result struct {
Username bool `gorethink:"username"`
AltEmail bool `gorethink:"alt_email"`
}
if err := cursor.One(&result); err != nil {
c.JSON(500, &gin.H{
"code": 0,
"message": err.Error(),
})
return
}
if result.Username || result.AltEmail {
errors := []string{}
if result.Username {
errors = append(errors, "This username is taken.")
}
if result.AltEmail {
errors = append(errors, "This email address is used.")
}
c.JSON(422, &gin.H{
"code": 0,
"message": "Naming conflict",
"errors": errors,
})
return
}
// Create an account and an address
address := &models.Address{
ID: nu + "@pgp.st",
StyledID: styledID + "@pgp.st",
DateCreated: time.Now(),
Owner: "", // we set it later
}
//.........這裏部分代碼省略.........
示例6: createKey
func (a *API) createKey(c *gin.Context) {
// Get token and account info from the context
var (
account = c.MustGet("account").(*models.Account)
token = c.MustGet("token").(*models.Token)
)
// Check the scope
if !models.InScope(token.Scope, []string{"keys"}) {
c.JSON(403, &gin.H{
"code": 0,
"error": "Your token has insufficient scope",
})
return
}
// Decode the input
var input struct {
Body []byte `json:"body"`
}
if err := c.Bind(&input); err != nil {
c.JSON(422, &gin.H{
"code": 0,
"message": err.Error(),
})
return
}
// Validate the input
if input.Body == nil || len(input.Body) == 0 {
c.JSON(422, &gin.H{
"code": 0,
"message": "No key body in the input",
})
return
}
// Parse the key
keyring, err := openpgp.ReadKeyRing(bytes.NewReader(input.Body))
if err != nil {
c.JSON(422, &gin.H{
"code": 0,
"message": "Invalid key format",
})
return
}
publicKey := keyring[0].PrimaryKey
// Parse the identities
identities := []*models.Identity{}
for _, identity := range keyring[0].Identities {
id := &models.Identity{
Name: identity.Name,
}
if identity.SelfSignature != nil {
sig := identity.SelfSignature
id.SelfSignature = &models.Signature{
Type: uint8(sig.SigType),
Algorithm: uint8(sig.PubKeyAlgo),
Hash: uint(sig.Hash),
CreationTime: sig.CreationTime,
SigLifetimeSecs: sig.SigLifetimeSecs,
KeyLifetimeSecs: sig.KeyLifetimeSecs,
IssuerKeyID: sig.IssuerKeyId,
IsPrimaryID: sig.IsPrimaryId,
RevocationReason: sig.RevocationReason,
RevocationReasonText: sig.RevocationReasonText,
}
}
if identity.Signatures != nil {
id.Signatures = []*models.Signature{}
for _, sig := range identity.Signatures {
id.Signatures = append(id.Signatures, &models.Signature{
Type: uint8(sig.SigType),
Algorithm: uint8(sig.PubKeyAlgo),
Hash: uint(sig.Hash),
CreationTime: sig.CreationTime,
SigLifetimeSecs: sig.SigLifetimeSecs,
KeyLifetimeSecs: sig.KeyLifetimeSecs,
IssuerKeyID: sig.IssuerKeyId,
IsPrimaryID: sig.IsPrimaryId,
RevocationReason: sig.RevocationReason,
RevocationReasonText: sig.RevocationReasonText,
})
}
}
identities = append(identities, id)
}
// Acquire key's length
length, err := publicKey.BitLength()
if err != nil {
c.JSON(422, &gin.H{
"code": 0,
"message": "Couldn't calculate bit length",
})
return
//.........這裏部分代碼省略.........