mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-11-04 00:11:04 +00:00 
			
		
		
		
	* update github.com/blevesearch/bleve v2.0.2 -> v2.0.3 * github.com/denisenkom/go-mssqldb v0.9.0 -> v0.10.0 * github.com/editorconfig/editorconfig-core-go v2.4.1 -> v2.4.2 * github.com/go-chi/cors v1.1.1 -> v1.2.0 * github.com/go-git/go-billy v5.0.0 -> v5.1.0 * github.com/go-git/go-git v5.2.0 -> v5.3.0 * github.com/go-ldap/ldap v3.2.4 -> v3.3.0 * github.com/go-redis/redis v8.6.0 -> v8.8.2 * github.com/go-sql-driver/mysql v1.5.0 -> v1.6.0 * github.com/go-swagger/go-swagger v0.26.1 -> v0.27.0 * github.com/lib/pq v1.9.0 -> v1.10.1 * github.com/mattn/go-sqlite3 v1.14.6 -> v1.14.7 * github.com/go-testfixtures/testfixtures v3.5.0 -> v3.6.0 * github.com/issue9/identicon v1.0.1 -> v1.2.0 * github.com/klauspost/compress v1.11.8 -> v1.12.1 * github.com/mgechev/revive v1.0.3 -> v1.0.6 * github.com/microcosm-cc/bluemonday v1.0.7 -> v1.0.8 * github.com/niklasfasching/go-org v1.4.0 -> v1.5.0 * github.com/olivere/elastic v7.0.22 -> v7.0.24 * github.com/pelletier/go-toml v1.8.1 -> v1.9.0 * github.com/prometheus/client_golang v1.9.0 -> v1.10.0 * github.com/xanzy/go-gitlab v0.44.0 -> v0.48.0 * github.com/yuin/goldmark v1.3.3 -> v1.3.5 * github.com/6543/go-version v1.2.4 -> v1.3.1 * do github.com/lib/pq v1.10.0 -> v1.10.1 again ...
		
			
				
	
	
		
			255 lines
		
	
	
	
		
			6.9 KiB
		
	
	
	
		
			Go
		
	
	
	
		
			Vendored
		
	
	
	
			
		
		
	
	
			255 lines
		
	
	
	
		
			6.9 KiB
		
	
	
	
		
			Go
		
	
	
	
		
			Vendored
		
	
	
	
//
 | 
						|
// Copyright 2021, Sander van Harmelen
 | 
						|
//
 | 
						|
// 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 gitlab
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/json"
 | 
						|
	"fmt"
 | 
						|
	"net/http"
 | 
						|
)
 | 
						|
 | 
						|
// EventType represents a Gitlab event type.
 | 
						|
type EventType string
 | 
						|
 | 
						|
// List of available event types.
 | 
						|
const (
 | 
						|
	EventTypeBuild         EventType = "Build Hook"
 | 
						|
	EventTypeDeployment    EventType = "Deployment Hook"
 | 
						|
	EventTypeIssue         EventType = "Issue Hook"
 | 
						|
	EventConfidentialIssue EventType = "Confidential Issue Hook"
 | 
						|
	EventTypeJob           EventType = "Job Hook"
 | 
						|
	EventTypeMergeRequest  EventType = "Merge Request Hook"
 | 
						|
	EventTypeNote          EventType = "Note Hook"
 | 
						|
	EventConfidentialNote  EventType = "Confidential Note Hook"
 | 
						|
	EventTypePipeline      EventType = "Pipeline Hook"
 | 
						|
	EventTypePush          EventType = "Push Hook"
 | 
						|
	EventTypeRelease       EventType = "Release Hook"
 | 
						|
	EventTypeSystemHook    EventType = "System Hook"
 | 
						|
	EventTypeTagPush       EventType = "Tag Push Hook"
 | 
						|
	EventTypeWikiPage      EventType = "Wiki Page Hook"
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	noteableTypeCommit       = "Commit"
 | 
						|
	noteableTypeMergeRequest = "MergeRequest"
 | 
						|
	noteableTypeIssue        = "Issue"
 | 
						|
	noteableTypeSnippet      = "Snippet"
 | 
						|
)
 | 
						|
 | 
						|
type noteEvent struct {
 | 
						|
	ObjectKind       string `json:"object_kind"`
 | 
						|
	ObjectAttributes struct {
 | 
						|
		NoteableType string `json:"noteable_type"`
 | 
						|
	} `json:"object_attributes"`
 | 
						|
}
 | 
						|
 | 
						|
const eventTypeHeader = "X-Gitlab-Event"
 | 
						|
 | 
						|
// HookEventType returns the event type for the given request.
 | 
						|
func HookEventType(r *http.Request) EventType {
 | 
						|
	return EventType(r.Header.Get(eventTypeHeader))
 | 
						|
}
 | 
						|
 | 
						|
// ParseHook tries to parse both web- and system hooks.
 | 
						|
//
 | 
						|
// Example usage:
 | 
						|
//
 | 
						|
// func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 | 
						|
//     payload, err := ioutil.ReadAll(r.Body)
 | 
						|
//     if err != nil { ... }
 | 
						|
//     event, err := gitlab.ParseHook(gitlab.HookEventType(r), payload)
 | 
						|
//     if err != nil { ... }
 | 
						|
//     switch event := event.(type) {
 | 
						|
//     case *gitlab.PushEvent:
 | 
						|
//         processPushEvent(event)
 | 
						|
//     case *gitlab.MergeEvent:
 | 
						|
//         processMergeEvent(event)
 | 
						|
//     ...
 | 
						|
//     }
 | 
						|
// }
 | 
						|
//
 | 
						|
func ParseHook(eventType EventType, payload []byte) (event interface{}, err error) {
 | 
						|
	switch eventType {
 | 
						|
	case EventTypeSystemHook:
 | 
						|
		return ParseSystemhook(payload)
 | 
						|
	default:
 | 
						|
		return ParseWebhook(eventType, payload)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// ParseSystemhook parses the event payload. For recognized event types, a
 | 
						|
// value of the corresponding struct type will be returned. An error will be
 | 
						|
// returned for unrecognized event types.
 | 
						|
//
 | 
						|
// Example usage:
 | 
						|
//
 | 
						|
// func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 | 
						|
//     payload, err := ioutil.ReadAll(r.Body)
 | 
						|
//     if err != nil { ... }
 | 
						|
//     event, err := gitlab.ParseSystemhook(payload)
 | 
						|
//     if err != nil { ... }
 | 
						|
//     switch event := event.(type) {
 | 
						|
//     case *gitlab.PushSystemEvent:
 | 
						|
//         processPushSystemEvent(event)
 | 
						|
//     case *gitlab.MergeSystemEvent:
 | 
						|
//         processMergeSystemEvent(event)
 | 
						|
//     ...
 | 
						|
//     }
 | 
						|
// }
 | 
						|
//
 | 
						|
func ParseSystemhook(payload []byte) (event interface{}, err error) {
 | 
						|
	e := &systemHookEvent{}
 | 
						|
	err = json.Unmarshal(payload, e)
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	switch e.EventName {
 | 
						|
	case "push":
 | 
						|
		event = &PushSystemEvent{}
 | 
						|
	case "tag_push":
 | 
						|
		event = &TagPushSystemEvent{}
 | 
						|
	case "repository_update":
 | 
						|
		event = &RepositoryUpdateSystemEvent{}
 | 
						|
	case
 | 
						|
		"project_create",
 | 
						|
		"project_update",
 | 
						|
		"project_destroy",
 | 
						|
		"project_transfer",
 | 
						|
		"project_rename":
 | 
						|
		event = &ProjectSystemEvent{}
 | 
						|
	case
 | 
						|
		"group_create",
 | 
						|
		"group_destroy",
 | 
						|
		"group_rename":
 | 
						|
		event = &GroupSystemEvent{}
 | 
						|
	case
 | 
						|
		"key_create",
 | 
						|
		"key_destroy":
 | 
						|
		event = &KeySystemEvent{}
 | 
						|
	case
 | 
						|
		"user_create",
 | 
						|
		"user_destroy",
 | 
						|
		"user_rename":
 | 
						|
		event = &UserSystemEvent{}
 | 
						|
	case
 | 
						|
		"user_add_to_group",
 | 
						|
		"user_remove_from_group",
 | 
						|
		"user_update_for_group":
 | 
						|
		event = &UserGroupSystemEvent{}
 | 
						|
	case
 | 
						|
		"user_add_to_team",
 | 
						|
		"user_remove_from_team",
 | 
						|
		"user_update_for_team":
 | 
						|
		event = &UserTeamSystemEvent{}
 | 
						|
	default:
 | 
						|
		switch e.ObjectKind {
 | 
						|
		case string(MergeRequestEventTargetType):
 | 
						|
			event = &MergeEvent{}
 | 
						|
		default:
 | 
						|
			return nil, fmt.Errorf("unexpected system hook type %s", e.EventName)
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if err := json.Unmarshal(payload, event); err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	return event, nil
 | 
						|
}
 | 
						|
 | 
						|
// WebhookEventType returns the event type for the given request.
 | 
						|
func WebhookEventType(r *http.Request) EventType {
 | 
						|
	return EventType(r.Header.Get(eventTypeHeader))
 | 
						|
}
 | 
						|
 | 
						|
// ParseWebhook parses the event payload. For recognized event types, a
 | 
						|
// value of the corresponding struct type will be returned. An error will
 | 
						|
// be returned for unrecognized event types.
 | 
						|
//
 | 
						|
// Example usage:
 | 
						|
//
 | 
						|
// func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 | 
						|
//     payload, err := ioutil.ReadAll(r.Body)
 | 
						|
//     if err != nil { ... }
 | 
						|
//     event, err := gitlab.ParseWebhook(gitlab.HookEventType(r), payload)
 | 
						|
//     if err != nil { ... }
 | 
						|
//     switch event := event.(type) {
 | 
						|
//     case *gitlab.PushEvent:
 | 
						|
//         processPushEvent(event)
 | 
						|
//     case *gitlab.MergeEvent:
 | 
						|
//         processMergeEvent(event)
 | 
						|
//     ...
 | 
						|
//     }
 | 
						|
// }
 | 
						|
//
 | 
						|
func ParseWebhook(eventType EventType, payload []byte) (event interface{}, err error) {
 | 
						|
	switch eventType {
 | 
						|
	case EventTypeBuild:
 | 
						|
		event = &BuildEvent{}
 | 
						|
	case EventTypeDeployment:
 | 
						|
		event = &DeploymentEvent{}
 | 
						|
	case EventTypeIssue, EventConfidentialIssue:
 | 
						|
		event = &IssueEvent{}
 | 
						|
	case EventTypeJob:
 | 
						|
		event = &JobEvent{}
 | 
						|
	case EventTypeMergeRequest:
 | 
						|
		event = &MergeEvent{}
 | 
						|
	case EventTypePipeline:
 | 
						|
		event = &PipelineEvent{}
 | 
						|
	case EventTypePush:
 | 
						|
		event = &PushEvent{}
 | 
						|
	case EventTypeRelease:
 | 
						|
		event = &ReleaseEvent{}
 | 
						|
	case EventTypeTagPush:
 | 
						|
		event = &TagEvent{}
 | 
						|
	case EventTypeWikiPage:
 | 
						|
		event = &WikiPageEvent{}
 | 
						|
	case EventTypeNote, EventConfidentialNote:
 | 
						|
		note := ¬eEvent{}
 | 
						|
		err := json.Unmarshal(payload, note)
 | 
						|
		if err != nil {
 | 
						|
			return nil, err
 | 
						|
		}
 | 
						|
 | 
						|
		if note.ObjectKind != string(NoteEventTargetType) {
 | 
						|
			return nil, fmt.Errorf("unexpected object kind %s", note.ObjectKind)
 | 
						|
		}
 | 
						|
 | 
						|
		switch note.ObjectAttributes.NoteableType {
 | 
						|
		case noteableTypeCommit:
 | 
						|
			event = &CommitCommentEvent{}
 | 
						|
		case noteableTypeMergeRequest:
 | 
						|
			event = &MergeCommentEvent{}
 | 
						|
		case noteableTypeIssue:
 | 
						|
			event = &IssueCommentEvent{}
 | 
						|
		case noteableTypeSnippet:
 | 
						|
			event = &SnippetCommentEvent{}
 | 
						|
		default:
 | 
						|
			return nil, fmt.Errorf("unexpected noteable type %s", note.ObjectAttributes.NoteableType)
 | 
						|
		}
 | 
						|
 | 
						|
	default:
 | 
						|
		return nil, fmt.Errorf("unexpected event type: %s", eventType)
 | 
						|
	}
 | 
						|
 | 
						|
	if err := json.Unmarshal(payload, event); err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	return event, nil
 | 
						|
}
 |