forked from lug/matterbridge
		
	Update vendor (mattermost)
This commit is contained in:
		
							
								
								
									
										7
									
								
								vendor/github.com/mattermost/platform/einterfaces/cluster.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/github.com/mattermost/platform/einterfaces/cluster.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -12,10 +12,15 @@ type ClusterInterface interface { | ||||
| 	StopInterNodeCommunication() | ||||
| 	GetClusterInfos() []*model.ClusterInfo | ||||
| 	GetClusterStats() ([]*model.ClusterStats, *model.AppError) | ||||
| 	RemoveAllSessionsForUserId(userId string) | ||||
| 	ClearSessionCacheForUser(userId string) | ||||
| 	InvalidateCacheForUser(userId string) | ||||
| 	InvalidateCacheForChannel(channelId string) | ||||
| 	InvalidateCacheForChannelByName(teamId, name string) | ||||
| 	InvalidateCacheForChannelMembers(channelId string) | ||||
| 	InvalidateCacheForChannelMembersNotifyProps(channelId string) | ||||
| 	InvalidateCacheForChannelPosts(channelId string) | ||||
| 	InvalidateCacheForWebhook(webhookId string) | ||||
| 	InvalidateCacheForReactions(postId string) | ||||
| 	Publish(event *model.WebSocketEvent) | ||||
| 	UpdateStatus(status *model.Status) | ||||
| 	GetLogs() ([]string, *model.AppError) | ||||
|   | ||||
							
								
								
									
										8
									
								
								vendor/github.com/mattermost/platform/einterfaces/metrics.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/mattermost/platform/einterfaces/metrics.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -8,6 +8,7 @@ type MetricsInterface interface { | ||||
| 	StopServer() | ||||
|  | ||||
| 	IncrementPostCreate() | ||||
| 	IncrementWebhookPost() | ||||
| 	IncrementPostSentEmail() | ||||
| 	IncrementPostSentPush() | ||||
| 	IncrementPostBroadcast() | ||||
| @@ -17,6 +18,9 @@ type MetricsInterface interface { | ||||
| 	IncrementHttpError() | ||||
| 	ObserveHttpRequestDuration(elapsed float64) | ||||
|  | ||||
| 	IncrementClusterRequest() | ||||
| 	ObserveClusterRequestDuration(elapsed float64) | ||||
|  | ||||
| 	IncrementLogin() | ||||
| 	IncrementLoginFail() | ||||
|  | ||||
| @@ -25,6 +29,10 @@ type MetricsInterface interface { | ||||
|  | ||||
| 	IncrementMemCacheHitCounter(cacheName string) | ||||
| 	IncrementMemCacheMissCounter(cacheName string) | ||||
| 	IncrementMemCacheMissCounterSession() | ||||
| 	IncrementMemCacheHitCounterSession() | ||||
|  | ||||
| 	IncrementWebsocketEvent(eventType string) | ||||
|  | ||||
| 	AddMemCacheHitCounter(cacheName string, amount float64) | ||||
| 	AddMemCacheMissCounter(cacheName string, amount float64) | ||||
|   | ||||
							
								
								
									
										2
									
								
								vendor/github.com/mattermost/platform/einterfaces/saml.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/mattermost/platform/einterfaces/saml.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -10,7 +10,7 @@ import ( | ||||
| type SamlInterface interface { | ||||
| 	ConfigureSP() *model.AppError | ||||
| 	BuildRequest(relayState string) (*model.SamlAuthRequest, *model.AppError) | ||||
| 	DoLogin(encodedXML string, relayState map[string]string) (*model.User, *model.AppError) | ||||
| 	DoLogin(encodedXML string, relayState map[string]string, siteURL string) (*model.User, *model.AppError) | ||||
| 	GetMetadata() (string, *model.AppError) | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										55
									
								
								vendor/github.com/mattermost/platform/model/authorization.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										55
									
								
								vendor/github.com/mattermost/platform/model/authorization.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -27,7 +27,10 @@ var PERMISSION_MANAGE_PUBLIC_CHANNEL_MEMBERS *Permission | ||||
| var PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS *Permission | ||||
| var PERMISSION_ASSIGN_SYSTEM_ADMIN_ROLE *Permission | ||||
| var PERMISSION_MANAGE_ROLES *Permission | ||||
| var PERMISSION_MANAGE_TEAM_ROLES *Permission | ||||
| var PERMISSION_MANAGE_CHANNEL_ROLES *Permission | ||||
| var PERMISSION_CREATE_DIRECT_CHANNEL *Permission | ||||
| var PERMISSION_CREATE_GROUP_CHANNEL *Permission | ||||
| var PERMISSION_MANAGE_PUBLIC_CHANNEL_PROPERTIES *Permission | ||||
| var PERMISSION_MANAGE_PRIVATE_CHANNEL_PROPERTIES *Permission | ||||
| var PERMISSION_LIST_TEAM_CHANNELS *Permission | ||||
| @@ -46,9 +49,13 @@ var PERMISSION_MANAGE_SYSTEM_WIDE_OAUTH *Permission | ||||
| var PERMISSION_CREATE_POST *Permission | ||||
| var PERMISSION_EDIT_POST *Permission | ||||
| var PERMISSION_EDIT_OTHERS_POSTS *Permission | ||||
| var PERMISSION_DELETE_POST *Permission | ||||
| var PERMISSION_DELETE_OTHERS_POSTS *Permission | ||||
| var PERMISSION_REMOVE_USER_FROM_TEAM *Permission | ||||
| var PERMISSION_CREATE_TEAM *Permission | ||||
| var PERMISSION_MANAGE_TEAM *Permission | ||||
| var PERMISSION_IMPORT_TEAM *Permission | ||||
| var PERMISSION_VIEW_TEAM *Permission | ||||
|  | ||||
| // General permission that encompases all system admin functions | ||||
| // in the future this could be broken up to allow access to some | ||||
| @@ -123,6 +130,16 @@ func InitalizePermissions() { | ||||
| 		"authentication.permissions.manage_roles.name", | ||||
| 		"authentication.permissions.manage_roles.description", | ||||
| 	} | ||||
| 	PERMISSION_MANAGE_TEAM_ROLES = &Permission{ | ||||
| 		"manage_team_roles", | ||||
| 		"authentication.permissions.manage_team_roles.name", | ||||
| 		"authentication.permissions.manage_team_roles.description", | ||||
| 	} | ||||
| 	PERMISSION_MANAGE_CHANNEL_ROLES = &Permission{ | ||||
| 		"manage_channel_roles", | ||||
| 		"authentication.permissions.manage_channel_roles.name", | ||||
| 		"authentication.permissions.manage_channel_roles.description", | ||||
| 	} | ||||
| 	PERMISSION_MANAGE_SYSTEM = &Permission{ | ||||
| 		"manage_system", | ||||
| 		"authentication.permissions.manage_system.name", | ||||
| @@ -133,6 +150,11 @@ func InitalizePermissions() { | ||||
| 		"authentication.permissions.create_direct_channel.name", | ||||
| 		"authentication.permissions.create_direct_channel.description", | ||||
| 	} | ||||
| 	PERMISSION_CREATE_GROUP_CHANNEL = &Permission{ | ||||
| 		"create_group_channel", | ||||
| 		"authentication.permissions.create_group_channel.name", | ||||
| 		"authentication.permissions.create_group_channel.description", | ||||
| 	} | ||||
| 	PERMISSION_MANAGE_PUBLIC_CHANNEL_PROPERTIES = &Permission{ | ||||
| 		"manage__publicchannel_properties", | ||||
| 		"authentication.permissions.manage_public_channel_properties.name", | ||||
| @@ -223,11 +245,26 @@ func InitalizePermissions() { | ||||
| 		"authentication.permissions.edit_others_posts.name", | ||||
| 		"authentication.permissions.edit_others_posts.description", | ||||
| 	} | ||||
| 	PERMISSION_DELETE_POST = &Permission{ | ||||
| 		"delete_post", | ||||
| 		"authentication.permissions.delete_post.name", | ||||
| 		"authentication.permissions.delete_post.description", | ||||
| 	} | ||||
| 	PERMISSION_DELETE_OTHERS_POSTS = &Permission{ | ||||
| 		"delete_others_posts", | ||||
| 		"authentication.permissions.delete_others_posts.name", | ||||
| 		"authentication.permissions.delete_others_posts.description", | ||||
| 	} | ||||
| 	PERMISSION_REMOVE_USER_FROM_TEAM = &Permission{ | ||||
| 		"remove_user_from_team", | ||||
| 		"authentication.permissions.remove_user_from_team.name", | ||||
| 		"authentication.permissions.remove_user_from_team.description", | ||||
| 	} | ||||
| 	PERMISSION_CREATE_TEAM = &Permission{ | ||||
| 		"create_team", | ||||
| 		"authentication.permissions.create_team.name", | ||||
| 		"authentication.permissions.create_team.description", | ||||
| 	} | ||||
| 	PERMISSION_MANAGE_TEAM = &Permission{ | ||||
| 		"manage_team", | ||||
| 		"authentication.permissions.manage_team.name", | ||||
| @@ -238,6 +275,11 @@ func InitalizePermissions() { | ||||
| 		"authentication.permissions.import_team.name", | ||||
| 		"authentication.permissions.import_team.description", | ||||
| 	} | ||||
| 	PERMISSION_VIEW_TEAM = &Permission{ | ||||
| 		"view_team", | ||||
| 		"authentication.permissions.view_team.name", | ||||
| 		"authentication.permissions.view_team.description", | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func InitalizeRoles() { | ||||
| @@ -264,7 +306,9 @@ func InitalizeRoles() { | ||||
| 		"channel_admin", | ||||
| 		"authentication.roles.channel_admin.name", | ||||
| 		"authentication.roles.channel_admin.description", | ||||
| 		[]string{}, | ||||
| 		[]string{ | ||||
| 			PERMISSION_MANAGE_CHANNEL_ROLES.Id, | ||||
| 		}, | ||||
| 	} | ||||
| 	BuiltInRoles[ROLE_CHANNEL_ADMIN.Id] = ROLE_CHANNEL_ADMIN | ||||
| 	ROLE_CHANNEL_GUEST = &Role{ | ||||
| @@ -282,6 +326,7 @@ func InitalizeRoles() { | ||||
| 		[]string{ | ||||
| 			PERMISSION_LIST_TEAM_CHANNELS.Id, | ||||
| 			PERMISSION_JOIN_PUBLIC_CHANNELS.Id, | ||||
| 			PERMISSION_VIEW_TEAM.Id, | ||||
| 		}, | ||||
| 	} | ||||
| 	BuiltInRoles[ROLE_TEAM_USER.Id] = ROLE_TEAM_USER | ||||
| @@ -295,7 +340,8 @@ func InitalizeRoles() { | ||||
| 			PERMISSION_REMOVE_USER_FROM_TEAM.Id, | ||||
| 			PERMISSION_MANAGE_TEAM.Id, | ||||
| 			PERMISSION_IMPORT_TEAM.Id, | ||||
| 			PERMISSION_MANAGE_ROLES.Id, | ||||
| 			PERMISSION_MANAGE_TEAM_ROLES.Id, | ||||
| 			PERMISSION_MANAGE_CHANNEL_ROLES.Id, | ||||
| 			PERMISSION_MANAGE_OTHERS_WEBHOOKS.Id, | ||||
| 			PERMISSION_MANAGE_SLASH_COMMANDS.Id, | ||||
| 			PERMISSION_MANAGE_OTHERS_SLASH_COMMANDS.Id, | ||||
| @@ -310,6 +356,7 @@ func InitalizeRoles() { | ||||
| 		"authentication.roles.global_user.description", | ||||
| 		[]string{ | ||||
| 			PERMISSION_CREATE_DIRECT_CHANNEL.Id, | ||||
| 			PERMISSION_CREATE_GROUP_CHANNEL.Id, | ||||
| 			PERMISSION_PERMANENT_DELETE_USER.Id, | ||||
| 			PERMISSION_MANAGE_OAUTH.Id, | ||||
| 		}, | ||||
| @@ -329,6 +376,7 @@ func InitalizeRoles() { | ||||
| 						[]string{ | ||||
| 							PERMISSION_ASSIGN_SYSTEM_ADMIN_ROLE.Id, | ||||
| 							PERMISSION_MANAGE_SYSTEM.Id, | ||||
| 							PERMISSION_MANAGE_ROLES.Id, | ||||
| 							PERMISSION_MANAGE_PUBLIC_CHANNEL_PROPERTIES.Id, | ||||
| 							PERMISSION_DELETE_PUBLIC_CHANNEL.Id, | ||||
| 							PERMISSION_CREATE_PUBLIC_CHANNEL.Id, | ||||
| @@ -340,6 +388,9 @@ func InitalizeRoles() { | ||||
| 							PERMISSION_EDIT_OTHER_USERS.Id, | ||||
| 							PERMISSION_MANAGE_OAUTH.Id, | ||||
| 							PERMISSION_INVITE_USER.Id, | ||||
| 							PERMISSION_DELETE_POST.Id, | ||||
| 							PERMISSION_DELETE_OTHERS_POSTS.Id, | ||||
| 							PERMISSION_CREATE_TEAM.Id, | ||||
| 						}, | ||||
| 						ROLE_TEAM_USER.Permissions..., | ||||
| 					), | ||||
|   | ||||
							
								
								
									
										47
									
								
								vendor/github.com/mattermost/platform/model/channel.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										47
									
								
								vendor/github.com/mattermost/platform/model/channel.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -4,8 +4,12 @@ | ||||
| package model | ||||
|  | ||||
| import ( | ||||
| 	"crypto/sha1" | ||||
| 	"encoding/hex" | ||||
| 	"encoding/json" | ||||
| 	"io" | ||||
| 	"sort" | ||||
| 	"strings" | ||||
| 	"unicode/utf8" | ||||
| ) | ||||
|  | ||||
| @@ -13,11 +17,16 @@ const ( | ||||
| 	CHANNEL_OPEN                   = "O" | ||||
| 	CHANNEL_PRIVATE                = "P" | ||||
| 	CHANNEL_DIRECT                 = "D" | ||||
| 	CHANNEL_GROUP                  = "G" | ||||
| 	CHANNEL_GROUP_MAX_USERS        = 8 | ||||
| 	CHANNEL_GROUP_MIN_USERS        = 3 | ||||
| 	DEFAULT_CHANNEL                = "town-square" | ||||
| 	CHANNEL_DISPLAY_NAME_MAX_RUNES = 64 | ||||
| 	CHANNEL_NAME_MIN_LENGTH        = 2 | ||||
| 	CHANNEL_NAME_MAX_LENGTH        = 64 | ||||
| 	CHANNEL_HEADER_MAX_RUNES       = 1024 | ||||
| 	CHANNEL_PURPOSE_MAX_RUNES      = 250 | ||||
| 	CHANNEL_CACHE_SIZE             = 25000 | ||||
| ) | ||||
|  | ||||
| type Channel struct { | ||||
| @@ -83,15 +92,11 @@ func (o *Channel) IsValid() *AppError { | ||||
| 		return NewLocAppError("Channel.IsValid", "model.channel.is_valid.display_name.app_error", nil, "id="+o.Id) | ||||
| 	} | ||||
|  | ||||
| 	if len(o.Name) > CHANNEL_NAME_MAX_LENGTH { | ||||
| 		return NewLocAppError("Channel.IsValid", "model.channel.is_valid.name.app_error", nil, "id="+o.Id) | ||||
| 	} | ||||
|  | ||||
| 	if !IsValidChannelIdentifier(o.Name) { | ||||
| 		return NewLocAppError("Channel.IsValid", "model.channel.is_valid.2_or_more.app_error", nil, "id="+o.Id) | ||||
| 	} | ||||
|  | ||||
| 	if !(o.Type == CHANNEL_OPEN || o.Type == CHANNEL_PRIVATE || o.Type == CHANNEL_DIRECT) { | ||||
| 	if !(o.Type == CHANNEL_OPEN || o.Type == CHANNEL_PRIVATE || o.Type == CHANNEL_DIRECT || o.Type == CHANNEL_GROUP) { | ||||
| 		return NewLocAppError("Channel.IsValid", "model.channel.is_valid.type.app_error", nil, "id="+o.Id) | ||||
| 	} | ||||
|  | ||||
| @@ -128,6 +133,10 @@ func (o *Channel) ExtraUpdated() { | ||||
| 	o.ExtraUpdateAt = GetMillis() | ||||
| } | ||||
|  | ||||
| func (o *Channel) IsGroupOrDirect() bool { | ||||
| 	return o.Type == CHANNEL_DIRECT || o.Type == CHANNEL_GROUP | ||||
| } | ||||
|  | ||||
| func GetDMNameFromIds(userId1, userId2 string) string { | ||||
| 	if userId1 > userId2 { | ||||
| 		return userId2 + "__" + userId1 | ||||
| @@ -135,3 +144,31 @@ func GetDMNameFromIds(userId1, userId2 string) string { | ||||
| 		return userId1 + "__" + userId2 | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func GetGroupDisplayNameFromUsers(users []*User, truncate bool) string { | ||||
| 	usernames := make([]string, len(users)) | ||||
| 	for index, user := range users { | ||||
| 		usernames[index] = user.Username | ||||
| 	} | ||||
|  | ||||
| 	sort.Strings(usernames) | ||||
|  | ||||
| 	name := strings.Join(usernames, ", ") | ||||
|  | ||||
| 	if truncate && len(name) > CHANNEL_NAME_MAX_LENGTH { | ||||
| 		name = name[:CHANNEL_NAME_MAX_LENGTH] | ||||
| 	} | ||||
|  | ||||
| 	return name | ||||
| } | ||||
|  | ||||
| func GetGroupNameFromUserIds(userIds []string) string { | ||||
| 	sort.Strings(userIds) | ||||
|  | ||||
| 	h := sha1.New() | ||||
| 	for _, id := range userIds { | ||||
| 		io.WriteString(h, id) | ||||
| 	} | ||||
|  | ||||
| 	return hex.EncodeToString(h.Sum(nil)) | ||||
| } | ||||
|   | ||||
							
								
								
									
										28
									
								
								vendor/github.com/mattermost/platform/model/channel_member.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								vendor/github.com/mattermost/platform/model/channel_member.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -88,18 +88,32 @@ func (o *ChannelMember) IsValid() *AppError { | ||||
| 		return NewLocAppError("ChannelMember.IsValid", "model.channel_member.is_valid.user_id.app_error", nil, "") | ||||
| 	} | ||||
|  | ||||
| 	notifyLevel := o.NotifyProps["desktop"] | ||||
| 	notifyLevel := o.NotifyProps[DESKTOP_NOTIFY_PROP] | ||||
| 	if len(notifyLevel) > 20 || !IsChannelNotifyLevelValid(notifyLevel) { | ||||
| 		return NewLocAppError("ChannelMember.IsValid", "model.channel_member.is_valid.notify_level.app_error", | ||||
| 			nil, "notify_level="+notifyLevel) | ||||
| 	} | ||||
|  | ||||
| 	markUnreadLevel := o.NotifyProps["mark_unread"] | ||||
| 	markUnreadLevel := o.NotifyProps[MARK_UNREAD_NOTIFY_PROP] | ||||
| 	if len(markUnreadLevel) > 20 || !IsChannelMarkUnreadLevelValid(markUnreadLevel) { | ||||
| 		return NewLocAppError("ChannelMember.IsValid", "model.channel_member.is_valid.unread_level.app_error", | ||||
| 			nil, "mark_unread_level="+markUnreadLevel) | ||||
| 	} | ||||
|  | ||||
| 	if pushLevel, ok := o.NotifyProps[PUSH_NOTIFY_PROP]; ok { | ||||
| 		if len(pushLevel) > 20 || !IsChannelNotifyLevelValid(pushLevel) { | ||||
| 			return NewLocAppError("ChannelMember.IsValid", "model.channel_member.is_valid.push_level.app_error", | ||||
| 				nil, "push_notification_level="+pushLevel) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if sendEmail, ok := o.NotifyProps[EMAIL_NOTIFY_PROP]; ok { | ||||
| 		if len(sendEmail) > 20 || !IsSendEmailValid(sendEmail) { | ||||
| 			return NewLocAppError("ChannelMember.IsValid", "model.channel_member.is_valid.email_value.app_error", | ||||
| 				nil, "push_notification_level="+sendEmail) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| @@ -126,9 +140,15 @@ func IsChannelMarkUnreadLevelValid(markUnreadLevel string) bool { | ||||
| 	return markUnreadLevel == CHANNEL_MARK_UNREAD_ALL || markUnreadLevel == CHANNEL_MARK_UNREAD_MENTION | ||||
| } | ||||
|  | ||||
| func IsSendEmailValid(sendEmail string) bool { | ||||
| 	return sendEmail == CHANNEL_NOTIFY_DEFAULT || sendEmail == "true" || sendEmail == "false" | ||||
| } | ||||
|  | ||||
| func GetDefaultChannelNotifyProps() StringMap { | ||||
| 	return StringMap{ | ||||
| 		"desktop":     CHANNEL_NOTIFY_DEFAULT, | ||||
| 		"mark_unread": CHANNEL_MARK_UNREAD_ALL, | ||||
| 		DESKTOP_NOTIFY_PROP:     CHANNEL_NOTIFY_DEFAULT, | ||||
| 		MARK_UNREAD_NOTIFY_PROP: CHANNEL_MARK_UNREAD_ALL, | ||||
| 		PUSH_NOTIFY_PROP:        CHANNEL_NOTIFY_DEFAULT, | ||||
| 		EMAIL_NOTIFY_PROP:       CHANNEL_NOTIFY_DEFAULT, | ||||
| 	} | ||||
| } | ||||
|   | ||||
							
								
								
									
										76
									
								
								vendor/github.com/mattermost/platform/model/client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										76
									
								
								vendor/github.com/mattermost/platform/model/client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -35,12 +35,14 @@ const ( | ||||
| 	STATUS                    = "status" | ||||
| 	STATUS_OK                 = "OK" | ||||
| 	STATUS_FAIL               = "FAIL" | ||||
| 	STATUS_REMOVE             = "REMOVE" | ||||
|  | ||||
| 	CLIENT_DIR = "webapp/dist" | ||||
|  | ||||
| 	API_URL_SUFFIX_V1 = "/api/v1" | ||||
| 	API_URL_SUFFIX_V3 = "/api/v3" | ||||
| 	API_URL_SUFFIX    = API_URL_SUFFIX_V3 | ||||
| 	API_URL_SUFFIX_V4 = "/api/v4" | ||||
| 	API_URL_SUFFIX    = API_URL_SUFFIX_V4 | ||||
| ) | ||||
|  | ||||
| type Result struct { | ||||
| @@ -71,7 +73,7 @@ type Client struct { | ||||
| // NewClient constructs a new client with convienence methods for talking to | ||||
| // the server. | ||||
| func NewClient(url string) *Client { | ||||
| 	return &Client{url, url + API_URL_SUFFIX, &http.Client{}, "", "", "", "", "", ""} | ||||
| 	return &Client{url, url + API_URL_SUFFIX_V3, &http.Client{}, "", "", "", "", "", ""} | ||||
| } | ||||
|  | ||||
| func closeBody(r *http.Response) { | ||||
| @@ -782,7 +784,7 @@ func (c *Client) GetSessions(id string) (*Result, *AppError) { | ||||
| } | ||||
|  | ||||
| func (c *Client) EmailToOAuth(m map[string]string) (*Result, *AppError) { | ||||
| 	if r, err := c.DoApiPost("/users/claim/email_to_sso", MapToJson(m)); err != nil { | ||||
| 	if r, err := c.DoApiPost("/users/claim/email_to_oauth", MapToJson(m)); err != nil { | ||||
| 		return nil, err | ||||
| 	} else { | ||||
| 		defer closeBody(r) | ||||
| @@ -1119,6 +1121,16 @@ func (c *Client) CreateDirectChannel(userId string) (*Result, *AppError) { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (c *Client) CreateGroupChannel(userIds []string) (*Result, *AppError) { | ||||
| 	if r, err := c.DoApiPost(c.GetTeamRoute()+"/channels/create_group", ArrayToJson(userIds)); err != nil { | ||||
| 		return nil, err | ||||
| 	} else { | ||||
| 		defer closeBody(r) | ||||
| 		return &Result{r.Header.Get(HEADER_REQUEST_ID), | ||||
| 			r.Header.Get(HEADER_ETAG_SERVER), ChannelFromJson(r.Body)}, nil | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (c *Client) UpdateChannel(channel *Channel) (*Result, *AppError) { | ||||
| 	if r, err := c.DoApiPost(c.GetTeamRoute()+"/channels/update", channel.ToJson()); err != nil { | ||||
| 		return nil, err | ||||
| @@ -1471,6 +1483,21 @@ func (c *Client) GetPostById(postId string, etag string) (*PostList, *ResponseMe | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // GetPermalink returns a post list, based on the provided channel and post ID. | ||||
| func (c *Client) GetPermalink(channelId string, postId string, etag string) (*PostList, *ResponseMetadata) { | ||||
| 	if r, err := c.DoApiGet(c.GetTeamRoute()+fmt.Sprintf("/pltmp/%v", postId), "", etag); err != nil { | ||||
| 		return nil, &ResponseMetadata{StatusCode: r.StatusCode, Error: err} | ||||
| 	} else { | ||||
| 		defer closeBody(r) | ||||
| 		return PostListFromJson(r.Body), | ||||
| 			&ResponseMetadata{ | ||||
| 				StatusCode: r.StatusCode, | ||||
| 				RequestId:  r.Header.Get(HEADER_REQUEST_ID), | ||||
| 				Etag:       r.Header.Get(HEADER_ETAG_SERVER), | ||||
| 			} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (c *Client) DeletePost(channelId string, postId string) (*Result, *AppError) { | ||||
| 	if r, err := c.DoApiPost(c.GetChannelRoute(channelId)+fmt.Sprintf("/posts/%v/delete", postId), ""); err != nil { | ||||
| 		return nil, err | ||||
| @@ -1991,6 +2018,16 @@ func (c *Client) CreateIncomingWebhook(hook *IncomingWebhook) (*Result, *AppErro | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (c *Client) UpdateIncomingWebhook(hook *IncomingWebhook) (*Result, *AppError) { | ||||
| 	if r, err := c.DoApiPost(c.GetTeamRoute()+"/hooks/incoming/update", hook.ToJson()); err != nil { | ||||
| 		return nil, err | ||||
| 	} else { | ||||
| 		defer closeBody(r) | ||||
| 		return &Result{r.Header.Get(HEADER_REQUEST_ID), | ||||
| 			r.Header.Get(HEADER_ETAG_SERVER), IncomingWebhookFromJson(r.Body)}, nil | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (c *Client) PostToWebhook(id, payload string) (*Result, *AppError) { | ||||
| 	if r, err := c.DoPost("/hooks/"+id, payload, "application/x-www-form-urlencoded"); err != nil { | ||||
| 		return nil, err | ||||
| @@ -2082,6 +2119,16 @@ func (c *Client) CreateOutgoingWebhook(hook *OutgoingWebhook) (*Result, *AppErro | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (c *Client) UpdateOutgoingWebhook(hook *OutgoingWebhook) (*Result, *AppError) { | ||||
| 	if r, err := c.DoApiPost(c.GetTeamRoute()+"/hooks/outgoing/update", hook.ToJson()); err != nil { | ||||
| 		return nil, err | ||||
| 	} else { | ||||
| 		defer closeBody(r) | ||||
| 		return &Result{r.Header.Get(HEADER_REQUEST_ID), | ||||
| 			r.Header.Get(HEADER_ETAG_SERVER), OutgoingWebhookFromJson(r.Body)}, nil | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (c *Client) DeleteOutgoingWebhook(id string) (*Result, *AppError) { | ||||
| 	data := make(map[string]string) | ||||
| 	data["id"] = id | ||||
| @@ -2319,3 +2366,26 @@ func (c *Client) ListReactions(channelId string, postId string) ([]*Reaction, *A | ||||
| 		return ReactionsFromJson(r.Body), nil | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Updates the user's roles in the channel by replacing them with the roles provided. | ||||
| func (c *Client) UpdateChannelRoles(channelId string, userId string, roles string) (map[string]string, *ResponseMetadata) { | ||||
| 	data := make(map[string]string) | ||||
| 	data["new_roles"] = roles | ||||
| 	data["user_id"] = userId | ||||
|  | ||||
| 	if r, err := c.DoApiPost(c.GetChannelRoute(channelId)+"/update_member_roles", MapToJson(data)); err != nil { | ||||
| 		metadata := ResponseMetadata{Error: err} | ||||
| 		if r != nil { | ||||
| 			metadata.StatusCode = r.StatusCode | ||||
| 		} | ||||
| 		return nil, &metadata | ||||
| 	} else { | ||||
| 		defer closeBody(r) | ||||
| 		return MapFromJson(r.Body), | ||||
| 			&ResponseMetadata{ | ||||
| 				StatusCode: r.StatusCode, | ||||
| 				RequestId:  r.Header.Get(HEADER_REQUEST_ID), | ||||
| 				Etag:       r.Header.Get(HEADER_ETAG_SERVER), | ||||
| 			} | ||||
| 	} | ||||
| } | ||||
|   | ||||
							
								
								
									
										1006
									
								
								vendor/github.com/mattermost/platform/model/client4.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1006
									
								
								vendor/github.com/mattermost/platform/model/client4.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										30
									
								
								vendor/github.com/mattermost/platform/model/command_response.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										30
									
								
								vendor/github.com/mattermost/platform/model/command_response.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -5,6 +5,7 @@ package model | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| ) | ||||
|  | ||||
| @@ -14,12 +15,12 @@ const ( | ||||
| ) | ||||
|  | ||||
| type CommandResponse struct { | ||||
| 	ResponseType string      `json:"response_type"` | ||||
| 	Text         string      `json:"text"` | ||||
| 	Username     string      `json:"username"` | ||||
| 	IconURL      string      `json:"icon_url"` | ||||
| 	GotoLocation string      `json:"goto_location"` | ||||
| 	Attachments  interface{} `json:"attachments"` | ||||
| 	ResponseType string             `json:"response_type"` | ||||
| 	Text         string             `json:"text"` | ||||
| 	Username     string             `json:"username"` | ||||
| 	IconURL      string             `json:"icon_url"` | ||||
| 	GotoLocation string             `json:"goto_location"` | ||||
| 	Attachments  []*SlackAttachment `json:"attachments"` | ||||
| } | ||||
|  | ||||
| func (o *CommandResponse) ToJson() string { | ||||
| @@ -34,10 +35,19 @@ func (o *CommandResponse) ToJson() string { | ||||
| func CommandResponseFromJson(data io.Reader) *CommandResponse { | ||||
| 	decoder := json.NewDecoder(data) | ||||
| 	var o CommandResponse | ||||
| 	err := decoder.Decode(&o) | ||||
| 	if err == nil { | ||||
| 		return &o | ||||
| 	} else { | ||||
|  | ||||
| 	if err := decoder.Decode(&o); err != nil { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	// Ensure attachment fields are stored as strings | ||||
| 	for _, attachment := range o.Attachments { | ||||
| 		for _, field := range attachment.Fields { | ||||
| 			if field.Value != nil { | ||||
| 				field.Value = fmt.Sprintf("%v", field.Value) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return &o | ||||
| } | ||||
|   | ||||
							
								
								
									
										245
									
								
								vendor/github.com/mattermost/platform/model/config.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										245
									
								
								vendor/github.com/mattermost/platform/model/config.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -49,49 +49,109 @@ const ( | ||||
| 	RESTRICT_EMOJI_CREATION_ADMIN        = "admin" | ||||
| 	RESTRICT_EMOJI_CREATION_SYSTEM_ADMIN = "system_admin" | ||||
|  | ||||
| 	PERMISSIONS_DELETE_POST_ALL          = "all" | ||||
| 	PERMISSIONS_DELETE_POST_TEAM_ADMIN   = "team_admin" | ||||
| 	PERMISSIONS_DELETE_POST_SYSTEM_ADMIN = "system_admin" | ||||
|  | ||||
| 	ALLOW_EDIT_POST_ALWAYS     = "always" | ||||
| 	ALLOW_EDIT_POST_NEVER      = "never" | ||||
| 	ALLOW_EDIT_POST_TIME_LIMIT = "time_limit" | ||||
|  | ||||
| 	EMAIL_BATCHING_BUFFER_SIZE = 256 | ||||
| 	EMAIL_BATCHING_INTERVAL    = 30 | ||||
|  | ||||
| 	SITENAME_MAX_LENGTH = 30 | ||||
|  | ||||
| 	SERVICE_SETTINGS_DEFAULT_SITE_URL        = "" | ||||
| 	SERVICE_SETTINGS_DEFAULT_TLS_CERT_FILE   = "" | ||||
| 	SERVICE_SETTINGS_DEFAULT_TLS_KEY_FILE    = "" | ||||
| 	SERVICE_SETTINGS_DEFAULT_READ_TIMEOUT    = 300 | ||||
| 	SERVICE_SETTINGS_DEFAULT_WRITE_TIMEOUT   = 300 | ||||
| 	SERVICE_SETTINGS_DEFAULT_ALLOW_CORS_FROM = "" | ||||
|  | ||||
| 	TEAM_SETTINGS_DEFAULT_CUSTOM_BRAND_TEXT        = "" | ||||
| 	TEAM_SETTINGS_DEFAULT_CUSTOM_DESCRIPTION_TEXT  = "" | ||||
| 	TEAM_SETTINGS_DEFAULT_USER_STATUS_AWAY_TIMEOUT = 300 | ||||
|  | ||||
| 	EMAIL_SETTINGS_DEFAULT_FEEDBACK_ORGANIZATION = "" | ||||
|  | ||||
| 	SUPPORT_SETTINGS_DEFAULT_TERMS_OF_SERVICE_LINK = "https://about.mattermost.com/default-terms/" | ||||
| 	SUPPORT_SETTINGS_DEFAULT_PRIVACY_POLICY_LINK   = "https://about.mattermost.com/default-privacy-policy/" | ||||
| 	SUPPORT_SETTINGS_DEFAULT_ABOUT_LINK            = "https://about.mattermost.com/default-about/" | ||||
| 	SUPPORT_SETTINGS_DEFAULT_HELP_LINK             = "https://about.mattermost.com/default-help/" | ||||
| 	SUPPORT_SETTINGS_DEFAULT_REPORT_A_PROBLEM_LINK = "https://about.mattermost.com/default-report-a-problem/" | ||||
| 	SUPPORT_SETTINGS_DEFAULT_SUPPORT_EMAIL         = "feedback@mattermost.com" | ||||
|  | ||||
| 	LDAP_SETTINGS_DEFAULT_FIRST_NAME_ATTRIBUTE = "" | ||||
| 	LDAP_SETTINGS_DEFAULT_LAST_NAME_ATTRIBUTE  = "" | ||||
| 	LDAP_SETTINGS_DEFAULT_EMAIL_ATTRIBUTE      = "" | ||||
| 	LDAP_SETTINGS_DEFAULT_USERNAME_ATTRIBUTE   = "" | ||||
| 	LDAP_SETTINGS_DEFAULT_NICKNAME_ATTRIBUTE   = "" | ||||
| 	LDAP_SETTINGS_DEFAULT_ID_ATTRIBUTE         = "" | ||||
| 	LDAP_SETTINGS_DEFAULT_POSITION_ATTRIBUTE   = "" | ||||
| 	LDAP_SETTINGS_DEFAULT_LOGIN_FIELD_NAME     = "" | ||||
|  | ||||
| 	SAML_SETTINGS_DEFAULT_FIRST_NAME_ATTRIBUTE = "" | ||||
| 	SAML_SETTINGS_DEFAULT_LAST_NAME_ATTRIBUTE  = "" | ||||
| 	SAML_SETTINGS_DEFAULT_EMAIL_ATTRIBUTE      = "" | ||||
| 	SAML_SETTINGS_DEFAULT_USERNAME_ATTRIBUTE   = "" | ||||
| 	SAML_SETTINGS_DEFAULT_NICKNAME_ATTRIBUTE   = "" | ||||
| 	SAML_SETTINGS_DEFAULT_LOCALE_ATTRIBUTE     = "" | ||||
| 	SAML_SETTINGS_DEFAULT_POSITION_ATTRIBUTE   = "" | ||||
|  | ||||
| 	NATIVEAPP_SETTINGS_DEFAULT_APP_DOWNLOAD_LINK         = "https://about.mattermost.com/downloads/" | ||||
| 	NATIVEAPP_SETTINGS_DEFAULT_ANDROID_APP_DOWNLOAD_LINK = "https://about.mattermost.com/mattermost-android-app/" | ||||
| 	NATIVEAPP_SETTINGS_DEFAULT_IOS_APP_DOWNLOAD_LINK     = "https://about.mattermost.com/mattermost-ios-app/" | ||||
|  | ||||
| 	WEBRTC_SETTINGS_DEFAULT_STUN_URI = "" | ||||
| 	WEBRTC_SETTINGS_DEFAULT_TURN_URI = "" | ||||
|  | ||||
| 	ANALYTICS_SETTINGS_DEFAULT_MAX_USERS_FOR_STATISTICS = 2500 | ||||
| ) | ||||
|  | ||||
| type ServiceSettings struct { | ||||
| 	SiteURL                           *string | ||||
| 	ListenAddress                     string | ||||
| 	ConnectionSecurity                *string | ||||
| 	TLSCertFile                       *string | ||||
| 	TLSKeyFile                        *string | ||||
| 	UseLetsEncrypt                    *bool | ||||
| 	LetsEncryptCertificateCacheFile   *string | ||||
| 	Forward80To443                    *bool | ||||
| 	ReadTimeout                       *int | ||||
| 	WriteTimeout                      *int | ||||
| 	MaximumLoginAttempts              int | ||||
| 	SegmentDeveloperKey               string | ||||
| 	GoogleDeveloperKey                string | ||||
| 	EnableOAuthServiceProvider        bool | ||||
| 	EnableIncomingWebhooks            bool | ||||
| 	EnableOutgoingWebhooks            bool | ||||
| 	EnableCommands                    *bool | ||||
| 	EnableOnlyAdminIntegrations       *bool | ||||
| 	EnablePostUsernameOverride        bool | ||||
| 	EnablePostIconOverride            bool | ||||
| 	EnableTesting                     bool | ||||
| 	EnableDeveloper                   *bool | ||||
| 	EnableSecurityFixAlert            *bool | ||||
| 	EnableInsecureOutgoingConnections *bool | ||||
| 	EnableMultifactorAuthentication   *bool | ||||
| 	EnforceMultifactorAuthentication  *bool | ||||
| 	AllowCorsFrom                     *string | ||||
| 	SessionLengthWebInDays            *int | ||||
| 	SessionLengthMobileInDays         *int | ||||
| 	SessionLengthSSOInDays            *int | ||||
| 	SessionCacheInMinutes             *int | ||||
| 	WebsocketSecurePort               *int | ||||
| 	WebsocketPort                     *int | ||||
| 	WebserverMode                     *string | ||||
| 	EnableCustomEmoji                 *bool | ||||
| 	RestrictCustomEmojiCreation       *string | ||||
| 	SiteURL                                  *string | ||||
| 	ListenAddress                            string | ||||
| 	ConnectionSecurity                       *string | ||||
| 	TLSCertFile                              *string | ||||
| 	TLSKeyFile                               *string | ||||
| 	UseLetsEncrypt                           *bool | ||||
| 	LetsEncryptCertificateCacheFile          *string | ||||
| 	Forward80To443                           *bool | ||||
| 	ReadTimeout                              *int | ||||
| 	WriteTimeout                             *int | ||||
| 	MaximumLoginAttempts                     int | ||||
| 	GoogleDeveloperKey                       string | ||||
| 	EnableOAuthServiceProvider               bool | ||||
| 	EnableIncomingWebhooks                   bool | ||||
| 	EnableOutgoingWebhooks                   bool | ||||
| 	EnableCommands                           *bool | ||||
| 	EnableOnlyAdminIntegrations              *bool | ||||
| 	EnablePostUsernameOverride               bool | ||||
| 	EnablePostIconOverride                   bool | ||||
| 	EnableLinkPreviews                       *bool | ||||
| 	EnableTesting                            bool | ||||
| 	EnableDeveloper                          *bool | ||||
| 	EnableSecurityFixAlert                   *bool | ||||
| 	EnableInsecureOutgoingConnections        *bool | ||||
| 	EnableMultifactorAuthentication          *bool | ||||
| 	EnforceMultifactorAuthentication         *bool | ||||
| 	AllowCorsFrom                            *string | ||||
| 	SessionLengthWebInDays                   *int | ||||
| 	SessionLengthMobileInDays                *int | ||||
| 	SessionLengthSSOInDays                   *int | ||||
| 	SessionCacheInMinutes                    *int | ||||
| 	WebsocketSecurePort                      *int | ||||
| 	WebsocketPort                            *int | ||||
| 	WebserverMode                            *string | ||||
| 	EnableCustomEmoji                        *bool | ||||
| 	RestrictCustomEmojiCreation              *string | ||||
| 	RestrictPostDelete                       *string | ||||
| 	AllowEditPost                            *string | ||||
| 	PostEditTimeLimit                        *int | ||||
| 	TimeBetweenUserTypingUpdatesMilliseconds *int64 | ||||
| 	EnableUserTypingMessages                 *bool | ||||
| 	ClusterLogTimeoutMilliseconds            *int | ||||
| } | ||||
|  | ||||
| type ClusterSettings struct { | ||||
| @@ -433,7 +493,12 @@ func (o *Config) SetDefaults() { | ||||
|  | ||||
| 	if o.ServiceSettings.SiteURL == nil { | ||||
| 		o.ServiceSettings.SiteURL = new(string) | ||||
| 		*o.ServiceSettings.SiteURL = "" | ||||
| 		*o.ServiceSettings.SiteURL = SERVICE_SETTINGS_DEFAULT_SITE_URL | ||||
| 	} | ||||
|  | ||||
| 	if o.ServiceSettings.EnableLinkPreviews == nil { | ||||
| 		o.ServiceSettings.EnableLinkPreviews = new(bool) | ||||
| 		*o.ServiceSettings.EnableLinkPreviews = false | ||||
| 	} | ||||
|  | ||||
| 	if o.ServiceSettings.EnableDeveloper == nil { | ||||
| @@ -493,12 +558,12 @@ func (o *Config) SetDefaults() { | ||||
|  | ||||
| 	if o.TeamSettings.CustomBrandText == nil { | ||||
| 		o.TeamSettings.CustomBrandText = new(string) | ||||
| 		*o.TeamSettings.CustomBrandText = "" | ||||
| 		*o.TeamSettings.CustomBrandText = TEAM_SETTINGS_DEFAULT_CUSTOM_BRAND_TEXT | ||||
| 	} | ||||
|  | ||||
| 	if o.TeamSettings.CustomDescriptionText == nil { | ||||
| 		o.TeamSettings.CustomDescriptionText = new(string) | ||||
| 		*o.TeamSettings.CustomDescriptionText = "" | ||||
| 		*o.TeamSettings.CustomDescriptionText = TEAM_SETTINGS_DEFAULT_CUSTOM_DESCRIPTION_TEXT | ||||
| 	} | ||||
|  | ||||
| 	if o.TeamSettings.EnableOpenServer == nil { | ||||
| @@ -552,7 +617,7 @@ func (o *Config) SetDefaults() { | ||||
|  | ||||
| 	if o.TeamSettings.UserStatusAwayTimeout == nil { | ||||
| 		o.TeamSettings.UserStatusAwayTimeout = new(int64) | ||||
| 		*o.TeamSettings.UserStatusAwayTimeout = 300 | ||||
| 		*o.TeamSettings.UserStatusAwayTimeout = TEAM_SETTINGS_DEFAULT_USER_STATUS_AWAY_TIMEOUT | ||||
| 	} | ||||
|  | ||||
| 	if o.TeamSettings.MaxChannelsPerTeam == nil { | ||||
| @@ -597,7 +662,7 @@ func (o *Config) SetDefaults() { | ||||
|  | ||||
| 	if o.EmailSettings.FeedbackOrganization == nil { | ||||
| 		o.EmailSettings.FeedbackOrganization = new(string) | ||||
| 		*o.EmailSettings.FeedbackOrganization = "" | ||||
| 		*o.EmailSettings.FeedbackOrganization = EMAIL_SETTINGS_DEFAULT_FEEDBACK_ORGANIZATION | ||||
| 	} | ||||
|  | ||||
| 	if o.EmailSettings.EnableEmailBatching == nil { | ||||
| @@ -621,7 +686,7 @@ func (o *Config) SetDefaults() { | ||||
|  | ||||
| 	if o.SupportSettings.TermsOfServiceLink == nil { | ||||
| 		o.SupportSettings.TermsOfServiceLink = new(string) | ||||
| 		*o.SupportSettings.TermsOfServiceLink = "https://about.mattermost.com/default-terms/" | ||||
| 		*o.SupportSettings.TermsOfServiceLink = SUPPORT_SETTINGS_DEFAULT_TERMS_OF_SERVICE_LINK | ||||
| 	} | ||||
|  | ||||
| 	if !IsSafeLink(o.SupportSettings.PrivacyPolicyLink) { | ||||
| @@ -630,7 +695,7 @@ func (o *Config) SetDefaults() { | ||||
|  | ||||
| 	if o.SupportSettings.PrivacyPolicyLink == nil { | ||||
| 		o.SupportSettings.PrivacyPolicyLink = new(string) | ||||
| 		*o.SupportSettings.PrivacyPolicyLink = "" | ||||
| 		*o.SupportSettings.PrivacyPolicyLink = SUPPORT_SETTINGS_DEFAULT_PRIVACY_POLICY_LINK | ||||
| 	} | ||||
|  | ||||
| 	if !IsSafeLink(o.SupportSettings.AboutLink) { | ||||
| @@ -639,7 +704,7 @@ func (o *Config) SetDefaults() { | ||||
|  | ||||
| 	if o.SupportSettings.AboutLink == nil { | ||||
| 		o.SupportSettings.AboutLink = new(string) | ||||
| 		*o.SupportSettings.AboutLink = "" | ||||
| 		*o.SupportSettings.AboutLink = SUPPORT_SETTINGS_DEFAULT_ABOUT_LINK | ||||
| 	} | ||||
|  | ||||
| 	if !IsSafeLink(o.SupportSettings.HelpLink) { | ||||
| @@ -648,7 +713,7 @@ func (o *Config) SetDefaults() { | ||||
|  | ||||
| 	if o.SupportSettings.HelpLink == nil { | ||||
| 		o.SupportSettings.HelpLink = new(string) | ||||
| 		*o.SupportSettings.HelpLink = "" | ||||
| 		*o.SupportSettings.HelpLink = SUPPORT_SETTINGS_DEFAULT_HELP_LINK | ||||
| 	} | ||||
|  | ||||
| 	if !IsSafeLink(o.SupportSettings.ReportAProblemLink) { | ||||
| @@ -657,12 +722,12 @@ func (o *Config) SetDefaults() { | ||||
|  | ||||
| 	if o.SupportSettings.ReportAProblemLink == nil { | ||||
| 		o.SupportSettings.ReportAProblemLink = new(string) | ||||
| 		*o.SupportSettings.ReportAProblemLink = "" | ||||
| 		*o.SupportSettings.ReportAProblemLink = SUPPORT_SETTINGS_DEFAULT_REPORT_A_PROBLEM_LINK | ||||
| 	} | ||||
|  | ||||
| 	if o.SupportSettings.SupportEmail == nil { | ||||
| 		o.SupportSettings.SupportEmail = new(string) | ||||
| 		*o.SupportSettings.SupportEmail = "feedback@mattermost.com" | ||||
| 		*o.SupportSettings.SupportEmail = SUPPORT_SETTINGS_DEFAULT_SUPPORT_EMAIL | ||||
| 	} | ||||
|  | ||||
| 	if o.LdapSettings.Enable == nil { | ||||
| @@ -707,37 +772,37 @@ func (o *Config) SetDefaults() { | ||||
|  | ||||
| 	if o.LdapSettings.FirstNameAttribute == nil { | ||||
| 		o.LdapSettings.FirstNameAttribute = new(string) | ||||
| 		*o.LdapSettings.FirstNameAttribute = "" | ||||
| 		*o.LdapSettings.FirstNameAttribute = LDAP_SETTINGS_DEFAULT_FIRST_NAME_ATTRIBUTE | ||||
| 	} | ||||
|  | ||||
| 	if o.LdapSettings.LastNameAttribute == nil { | ||||
| 		o.LdapSettings.LastNameAttribute = new(string) | ||||
| 		*o.LdapSettings.LastNameAttribute = "" | ||||
| 		*o.LdapSettings.LastNameAttribute = LDAP_SETTINGS_DEFAULT_LAST_NAME_ATTRIBUTE | ||||
| 	} | ||||
|  | ||||
| 	if o.LdapSettings.EmailAttribute == nil { | ||||
| 		o.LdapSettings.EmailAttribute = new(string) | ||||
| 		*o.LdapSettings.EmailAttribute = "" | ||||
| 		*o.LdapSettings.EmailAttribute = LDAP_SETTINGS_DEFAULT_EMAIL_ATTRIBUTE | ||||
| 	} | ||||
|  | ||||
| 	if o.LdapSettings.UsernameAttribute == nil { | ||||
| 		o.LdapSettings.UsernameAttribute = new(string) | ||||
| 		*o.LdapSettings.UsernameAttribute = "" | ||||
| 		*o.LdapSettings.UsernameAttribute = LDAP_SETTINGS_DEFAULT_USERNAME_ATTRIBUTE | ||||
| 	} | ||||
|  | ||||
| 	if o.LdapSettings.NicknameAttribute == nil { | ||||
| 		o.LdapSettings.NicknameAttribute = new(string) | ||||
| 		*o.LdapSettings.NicknameAttribute = "" | ||||
| 		*o.LdapSettings.NicknameAttribute = LDAP_SETTINGS_DEFAULT_NICKNAME_ATTRIBUTE | ||||
| 	} | ||||
|  | ||||
| 	if o.LdapSettings.IdAttribute == nil { | ||||
| 		o.LdapSettings.IdAttribute = new(string) | ||||
| 		*o.LdapSettings.IdAttribute = "" | ||||
| 		*o.LdapSettings.IdAttribute = LDAP_SETTINGS_DEFAULT_ID_ATTRIBUTE | ||||
| 	} | ||||
|  | ||||
| 	if o.LdapSettings.PositionAttribute == nil { | ||||
| 		o.LdapSettings.PositionAttribute = new(string) | ||||
| 		*o.LdapSettings.PositionAttribute = "" | ||||
| 		*o.LdapSettings.PositionAttribute = LDAP_SETTINGS_DEFAULT_POSITION_ATTRIBUTE | ||||
| 	} | ||||
|  | ||||
| 	if o.LdapSettings.SyncIntervalMinutes == nil { | ||||
| @@ -762,7 +827,7 @@ func (o *Config) SetDefaults() { | ||||
|  | ||||
| 	if o.LdapSettings.LoginFieldName == nil { | ||||
| 		o.LdapSettings.LoginFieldName = new(string) | ||||
| 		*o.LdapSettings.LoginFieldName = "" | ||||
| 		*o.LdapSettings.LoginFieldName = LDAP_SETTINGS_DEFAULT_LOGIN_FIELD_NAME | ||||
| 	} | ||||
|  | ||||
| 	if o.ServiceSettings.SessionLengthWebInDays == nil { | ||||
| @@ -807,7 +872,7 @@ func (o *Config) SetDefaults() { | ||||
|  | ||||
| 	if o.ServiceSettings.AllowCorsFrom == nil { | ||||
| 		o.ServiceSettings.AllowCorsFrom = new(string) | ||||
| 		*o.ServiceSettings.AllowCorsFrom = "" | ||||
| 		*o.ServiceSettings.AllowCorsFrom = SERVICE_SETTINGS_DEFAULT_ALLOW_CORS_FROM | ||||
| 	} | ||||
|  | ||||
| 	if o.ServiceSettings.WebserverMode == nil { | ||||
| @@ -827,6 +892,21 @@ func (o *Config) SetDefaults() { | ||||
| 		*o.ServiceSettings.RestrictCustomEmojiCreation = RESTRICT_EMOJI_CREATION_ALL | ||||
| 	} | ||||
|  | ||||
| 	if o.ServiceSettings.RestrictPostDelete == nil { | ||||
| 		o.ServiceSettings.RestrictPostDelete = new(string) | ||||
| 		*o.ServiceSettings.RestrictPostDelete = PERMISSIONS_DELETE_POST_ALL | ||||
| 	} | ||||
|  | ||||
| 	if o.ServiceSettings.AllowEditPost == nil { | ||||
| 		o.ServiceSettings.AllowEditPost = new(string) | ||||
| 		*o.ServiceSettings.AllowEditPost = ALLOW_EDIT_POST_ALWAYS | ||||
| 	} | ||||
|  | ||||
| 	if o.ServiceSettings.PostEditTimeLimit == nil { | ||||
| 		o.ServiceSettings.PostEditTimeLimit = new(int) | ||||
| 		*o.ServiceSettings.PostEditTimeLimit = 300 | ||||
| 	} | ||||
|  | ||||
| 	if o.ClusterSettings.InterNodeListenAddress == nil { | ||||
| 		o.ClusterSettings.InterNodeListenAddress = new(string) | ||||
| 		*o.ClusterSettings.InterNodeListenAddress = ":8075" | ||||
| @@ -853,7 +933,7 @@ func (o *Config) SetDefaults() { | ||||
|  | ||||
| 	if o.AnalyticsSettings.MaxUsersForStatistics == nil { | ||||
| 		o.AnalyticsSettings.MaxUsersForStatistics = new(int) | ||||
| 		*o.AnalyticsSettings.MaxUsersForStatistics = 2500 | ||||
| 		*o.AnalyticsSettings.MaxUsersForStatistics = ANALYTICS_SETTINGS_DEFAULT_MAX_USERS_FOR_STATISTICS | ||||
| 	} | ||||
|  | ||||
| 	if o.ComplianceSettings.Enable == nil { | ||||
| @@ -943,52 +1023,52 @@ func (o *Config) SetDefaults() { | ||||
|  | ||||
| 	if o.SamlSettings.FirstNameAttribute == nil { | ||||
| 		o.SamlSettings.FirstNameAttribute = new(string) | ||||
| 		*o.SamlSettings.FirstNameAttribute = "" | ||||
| 		*o.SamlSettings.FirstNameAttribute = SAML_SETTINGS_DEFAULT_FIRST_NAME_ATTRIBUTE | ||||
| 	} | ||||
|  | ||||
| 	if o.SamlSettings.LastNameAttribute == nil { | ||||
| 		o.SamlSettings.LastNameAttribute = new(string) | ||||
| 		*o.SamlSettings.LastNameAttribute = "" | ||||
| 		*o.SamlSettings.LastNameAttribute = SAML_SETTINGS_DEFAULT_LAST_NAME_ATTRIBUTE | ||||
| 	} | ||||
|  | ||||
| 	if o.SamlSettings.EmailAttribute == nil { | ||||
| 		o.SamlSettings.EmailAttribute = new(string) | ||||
| 		*o.SamlSettings.EmailAttribute = "" | ||||
| 		*o.SamlSettings.EmailAttribute = SAML_SETTINGS_DEFAULT_EMAIL_ATTRIBUTE | ||||
| 	} | ||||
|  | ||||
| 	if o.SamlSettings.UsernameAttribute == nil { | ||||
| 		o.SamlSettings.UsernameAttribute = new(string) | ||||
| 		*o.SamlSettings.UsernameAttribute = "" | ||||
| 		*o.SamlSettings.UsernameAttribute = SAML_SETTINGS_DEFAULT_USERNAME_ATTRIBUTE | ||||
| 	} | ||||
|  | ||||
| 	if o.SamlSettings.NicknameAttribute == nil { | ||||
| 		o.SamlSettings.NicknameAttribute = new(string) | ||||
| 		*o.SamlSettings.NicknameAttribute = "" | ||||
| 		*o.SamlSettings.NicknameAttribute = SAML_SETTINGS_DEFAULT_NICKNAME_ATTRIBUTE | ||||
| 	} | ||||
|  | ||||
| 	if o.SamlSettings.PositionAttribute == nil { | ||||
| 		o.SamlSettings.PositionAttribute = new(string) | ||||
| 		*o.SamlSettings.PositionAttribute = "" | ||||
| 		*o.SamlSettings.PositionAttribute = SAML_SETTINGS_DEFAULT_POSITION_ATTRIBUTE | ||||
| 	} | ||||
|  | ||||
| 	if o.SamlSettings.LocaleAttribute == nil { | ||||
| 		o.SamlSettings.LocaleAttribute = new(string) | ||||
| 		*o.SamlSettings.LocaleAttribute = "" | ||||
| 		*o.SamlSettings.LocaleAttribute = SAML_SETTINGS_DEFAULT_LOCALE_ATTRIBUTE | ||||
| 	} | ||||
|  | ||||
| 	if o.NativeAppSettings.AppDownloadLink == nil { | ||||
| 		o.NativeAppSettings.AppDownloadLink = new(string) | ||||
| 		*o.NativeAppSettings.AppDownloadLink = "https://about.mattermost.com/downloads/" | ||||
| 		*o.NativeAppSettings.AppDownloadLink = NATIVEAPP_SETTINGS_DEFAULT_APP_DOWNLOAD_LINK | ||||
| 	} | ||||
|  | ||||
| 	if o.NativeAppSettings.AndroidAppDownloadLink == nil { | ||||
| 		o.NativeAppSettings.AndroidAppDownloadLink = new(string) | ||||
| 		*o.NativeAppSettings.AndroidAppDownloadLink = "https://about.mattermost.com/mattermost-android-app/" | ||||
| 		*o.NativeAppSettings.AndroidAppDownloadLink = NATIVEAPP_SETTINGS_DEFAULT_ANDROID_APP_DOWNLOAD_LINK | ||||
| 	} | ||||
|  | ||||
| 	if o.NativeAppSettings.IosAppDownloadLink == nil { | ||||
| 		o.NativeAppSettings.IosAppDownloadLink = new(string) | ||||
| 		*o.NativeAppSettings.IosAppDownloadLink = "https://about.mattermost.com/mattermost-ios-app/" | ||||
| 		*o.NativeAppSettings.IosAppDownloadLink = NATIVEAPP_SETTINGS_DEFAULT_IOS_APP_DOWNLOAD_LINK | ||||
| 	} | ||||
|  | ||||
| 	if o.RateLimitSettings.Enable == nil { | ||||
| @@ -1008,12 +1088,12 @@ func (o *Config) SetDefaults() { | ||||
|  | ||||
| 	if o.ServiceSettings.TLSKeyFile == nil { | ||||
| 		o.ServiceSettings.TLSKeyFile = new(string) | ||||
| 		*o.ServiceSettings.TLSKeyFile = "" | ||||
| 		*o.ServiceSettings.TLSKeyFile = SERVICE_SETTINGS_DEFAULT_TLS_KEY_FILE | ||||
| 	} | ||||
|  | ||||
| 	if o.ServiceSettings.TLSCertFile == nil { | ||||
| 		o.ServiceSettings.TLSCertFile = new(string) | ||||
| 		*o.ServiceSettings.TLSCertFile = "" | ||||
| 		*o.ServiceSettings.TLSCertFile = SERVICE_SETTINGS_DEFAULT_TLS_CERT_FILE | ||||
| 	} | ||||
|  | ||||
| 	if o.ServiceSettings.UseLetsEncrypt == nil { | ||||
| @@ -1028,12 +1108,12 @@ func (o *Config) SetDefaults() { | ||||
|  | ||||
| 	if o.ServiceSettings.ReadTimeout == nil { | ||||
| 		o.ServiceSettings.ReadTimeout = new(int) | ||||
| 		*o.ServiceSettings.ReadTimeout = 300 | ||||
| 		*o.ServiceSettings.ReadTimeout = SERVICE_SETTINGS_DEFAULT_READ_TIMEOUT | ||||
| 	} | ||||
|  | ||||
| 	if o.ServiceSettings.WriteTimeout == nil { | ||||
| 		o.ServiceSettings.WriteTimeout = new(int) | ||||
| 		*o.ServiceSettings.WriteTimeout = 300 | ||||
| 		*o.ServiceSettings.WriteTimeout = SERVICE_SETTINGS_DEFAULT_WRITE_TIMEOUT | ||||
| 	} | ||||
|  | ||||
| 	if o.ServiceSettings.Forward80To443 == nil { | ||||
| @@ -1046,6 +1126,21 @@ func (o *Config) SetDefaults() { | ||||
| 		*o.MetricsSettings.BlockProfileRate = 0 | ||||
| 	} | ||||
|  | ||||
| 	if o.ServiceSettings.TimeBetweenUserTypingUpdatesMilliseconds == nil { | ||||
| 		o.ServiceSettings.TimeBetweenUserTypingUpdatesMilliseconds = new(int64) | ||||
| 		*o.ServiceSettings.TimeBetweenUserTypingUpdatesMilliseconds = 5000 | ||||
| 	} | ||||
|  | ||||
| 	if o.ServiceSettings.EnableUserTypingMessages == nil { | ||||
| 		o.ServiceSettings.EnableUserTypingMessages = new(bool) | ||||
| 		*o.ServiceSettings.EnableUserTypingMessages = true | ||||
| 	} | ||||
|  | ||||
| 	if o.ServiceSettings.ClusterLogTimeoutMilliseconds == nil { | ||||
| 		o.ServiceSettings.ClusterLogTimeoutMilliseconds = new(int) | ||||
| 		*o.ServiceSettings.ClusterLogTimeoutMilliseconds = 2000 | ||||
| 	} | ||||
|  | ||||
| 	o.defaultWebrtcSettings() | ||||
| } | ||||
|  | ||||
| @@ -1277,6 +1372,10 @@ func (o *Config) IsValid() *AppError { | ||||
| 		return NewLocAppError("Config.IsValid", "model.config.is_valid.write_timeout.app_error", nil, "") | ||||
| 	} | ||||
|  | ||||
| 	if *o.ServiceSettings.TimeBetweenUserTypingUpdatesMilliseconds < 1000 { | ||||
| 		return NewLocAppError("Config.IsValid", "model.config.is_valid.time_between_user_typing.app_error", nil, "") | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| @@ -1339,12 +1438,12 @@ func (o *Config) defaultWebrtcSettings() { | ||||
|  | ||||
| 	if o.WebrtcSettings.StunURI == nil { | ||||
| 		o.WebrtcSettings.StunURI = new(string) | ||||
| 		*o.WebrtcSettings.StunURI = "" | ||||
| 		*o.WebrtcSettings.StunURI = WEBRTC_SETTINGS_DEFAULT_STUN_URI | ||||
| 	} | ||||
|  | ||||
| 	if o.WebrtcSettings.TurnURI == nil { | ||||
| 		o.WebrtcSettings.TurnURI = new(string) | ||||
| 		*o.WebrtcSettings.TurnURI = "" | ||||
| 		*o.WebrtcSettings.TurnURI = WEBRTC_SETTINGS_DEFAULT_TURN_URI | ||||
| 	} | ||||
|  | ||||
| 	if o.WebrtcSettings.TurnUsername == nil { | ||||
|   | ||||
							
								
								
									
										4
									
								
								vendor/github.com/mattermost/platform/model/file.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/mattermost/platform/model/file.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -8,6 +8,10 @@ import ( | ||||
| 	"io" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	MaxImageSize = 6048 * 4032 // 24 megapixels, roughly 36MB as a raw image | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	IMAGE_EXTENSIONS = [5]string{".jpg", ".jpeg", ".gif", ".bmp", ".png"} | ||||
| 	IMAGE_MIME_TYPES = map[string]string{".jpg": "image/jpeg", ".jpeg": "image/jpeg", ".gif": "image/gif", ".bmp": "image/bmp", ".png": "image/png", ".tiff": "image/tiff"} | ||||
|   | ||||
							
								
								
									
										9
									
								
								vendor/github.com/mattermost/platform/model/gitlab/gitlab.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/mattermost/platform/model/gitlab/gitlab.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -65,6 +65,15 @@ func gitLabUserFromJson(data io.Reader) *GitLabUser { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (glu *GitLabUser) ToJson() string { | ||||
| 	b, err := json.Marshal(glu) | ||||
| 	if err != nil { | ||||
| 		return "" | ||||
| 	} else { | ||||
| 		return string(b) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (glu *GitLabUser) IsValid() bool { | ||||
| 	if glu.Id == 0 { | ||||
| 		return false | ||||
|   | ||||
							
								
								
									
										46
									
								
								vendor/github.com/mattermost/platform/model/incoming_webhook.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										46
									
								
								vendor/github.com/mattermost/platform/model/incoming_webhook.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -29,13 +29,13 @@ type IncomingWebhook struct { | ||||
| } | ||||
|  | ||||
| type IncomingWebhookRequest struct { | ||||
| 	Text        string          `json:"text"` | ||||
| 	Username    string          `json:"username"` | ||||
| 	IconURL     string          `json:"icon_url"` | ||||
| 	ChannelName string          `json:"channel"` | ||||
| 	Props       StringInterface `json:"props"` | ||||
| 	Attachments interface{}     `json:"attachments"` | ||||
| 	Type        string          `json:"type"` | ||||
| 	Text        string             `json:"text"` | ||||
| 	Username    string             `json:"username"` | ||||
| 	IconURL     string             `json:"icon_url"` | ||||
| 	ChannelName string             `json:"channel"` | ||||
| 	Props       StringInterface    `json:"props"` | ||||
| 	Attachments []*SlackAttachment `json:"attachments"` | ||||
| 	Type        string             `json:"type"` | ||||
| } | ||||
|  | ||||
| func (o *IncomingWebhook) ToJson() string { | ||||
| @@ -212,31 +212,15 @@ func expandAnnouncement(text string) string { | ||||
| func expandAnnouncements(i *IncomingWebhookRequest) { | ||||
| 	i.Text = expandAnnouncement(i.Text) | ||||
|  | ||||
| 	if i.Attachments != nil { | ||||
| 		attachments := i.Attachments.([]interface{}) | ||||
| 		for _, attachment := range attachments { | ||||
| 			a := attachment.(map[string]interface{}) | ||||
| 	for _, attachment := range i.Attachments { | ||||
| 		attachment.Pretext = expandAnnouncement(attachment.Pretext) | ||||
| 		attachment.Text = expandAnnouncement(attachment.Text) | ||||
| 		attachment.Title = expandAnnouncement(attachment.Title) | ||||
|  | ||||
| 			if a["pretext"] != nil { | ||||
| 				a["pretext"] = expandAnnouncement(a["pretext"].(string)) | ||||
| 			} | ||||
|  | ||||
| 			if a["text"] != nil { | ||||
| 				a["text"] = expandAnnouncement(a["text"].(string)) | ||||
| 			} | ||||
|  | ||||
| 			if a["title"] != nil { | ||||
| 				a["title"] = expandAnnouncement(a["title"].(string)) | ||||
| 			} | ||||
|  | ||||
| 			if a["fields"] != nil { | ||||
| 				fields := a["fields"].([]interface{}) | ||||
| 				for _, field := range fields { | ||||
| 					f := field.(map[string]interface{}) | ||||
| 					if f["value"] != nil { | ||||
| 						f["value"] = expandAnnouncement(fmt.Sprintf("%v", f["value"])) | ||||
| 					} | ||||
| 				} | ||||
| 		for _, field := range attachment.Fields { | ||||
| 			if field.Value != nil { | ||||
| 				// Ensure the value is set to a string if it is set | ||||
| 				field.Value = expandAnnouncement(fmt.Sprintf("%v", field.Value)) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|   | ||||
							
								
								
									
										4
									
								
								vendor/github.com/mattermost/platform/model/job.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/mattermost/platform/model/job.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -14,8 +14,8 @@ type ScheduledTask struct { | ||||
| 	Name      string        `json:"name"` | ||||
| 	Interval  time.Duration `json:"interval"` | ||||
| 	Recurring bool          `json:"recurring"` | ||||
| 	function  TaskFunc      `json:",omitempty"` | ||||
| 	timer     *time.Timer   `json:",omitempty"` | ||||
| 	function  TaskFunc | ||||
| 	timer     *time.Timer | ||||
| } | ||||
|  | ||||
| var tasks = make(map[string]*ScheduledTask) | ||||
|   | ||||
							
								
								
									
										5
									
								
								vendor/github.com/mattermost/platform/model/license.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/mattermost/platform/model/license.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -8,6 +8,11 @@ import ( | ||||
| 	"io" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	EXPIRED_LICENSE_ERROR = "api.license.add_license.expired.app_error" | ||||
| 	INVALID_LICENSE_ERROR = "api.license.add_license.invalid.app_error" | ||||
| ) | ||||
|  | ||||
| type LicenseRecord struct { | ||||
| 	Id       string `json:"id"` | ||||
| 	CreateAt int64  `json:"create_at"` | ||||
|   | ||||
							
								
								
									
										14
									
								
								vendor/github.com/mattermost/platform/model/post.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/mattermost/platform/model/post.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -14,10 +14,15 @@ const ( | ||||
| 	POST_DEFAULT               = "" | ||||
| 	POST_SLACK_ATTACHMENT      = "slack_attachment" | ||||
| 	POST_SYSTEM_GENERIC        = "system_generic" | ||||
| 	POST_JOIN_LEAVE            = "system_join_leave" | ||||
| 	POST_ADD_REMOVE            = "system_add_remove" | ||||
| 	POST_JOIN_LEAVE            = "system_join_leave" // Deprecated, use POST_JOIN_CHANNEL or POST_LEAVE_CHANNEL instead | ||||
| 	POST_JOIN_CHANNEL          = "system_join_channel" | ||||
| 	POST_LEAVE_CHANNEL         = "system_leave_channel" | ||||
| 	POST_ADD_REMOVE            = "system_add_remove" // Deprecated, use POST_ADD_TO_CHANNEL or POST_REMOVE_FROM_CHANNEL instead | ||||
| 	POST_ADD_TO_CHANNEL        = "system_add_to_channel" | ||||
| 	POST_REMOVE_FROM_CHANNEL   = "system_remove_from_channel" | ||||
| 	POST_HEADER_CHANGE         = "system_header_change" | ||||
| 	POST_DISPLAYNAME_CHANGE    = "system_displayname_change" | ||||
| 	POST_PURPOSE_CHANGE        = "system_purpose_change" | ||||
| 	POST_CHANNEL_DELETED       = "system_channel_deleted" | ||||
| 	POST_EPHEMERAL             = "system_ephemeral" | ||||
| 	POST_FILEIDS_MAX_RUNES     = 150 | ||||
| @@ -31,6 +36,7 @@ type Post struct { | ||||
| 	Id            string          `json:"id"` | ||||
| 	CreateAt      int64           `json:"create_at"` | ||||
| 	UpdateAt      int64           `json:"update_at"` | ||||
| 	EditAt        int64           `json:"edit_at"` | ||||
| 	DeleteAt      int64           `json:"delete_at"` | ||||
| 	UserId        string          `json:"user_id"` | ||||
| 	ChannelId     string          `json:"channel_id"` | ||||
| @@ -119,7 +125,9 @@ func (o *Post) IsValid() *AppError { | ||||
|  | ||||
| 	// should be removed once more message types are supported | ||||
| 	if !(o.Type == POST_DEFAULT || o.Type == POST_JOIN_LEAVE || o.Type == POST_ADD_REMOVE || | ||||
| 		o.Type == POST_SLACK_ATTACHMENT || o.Type == POST_HEADER_CHANGE || | ||||
| 		o.Type == POST_JOIN_CHANNEL || o.Type == POST_LEAVE_CHANNEL || | ||||
| 		o.Type == POST_REMOVE_FROM_CHANNEL || o.Type == POST_ADD_TO_CHANNEL || | ||||
| 		o.Type == POST_SLACK_ATTACHMENT || o.Type == POST_HEADER_CHANGE || o.Type == POST_PURPOSE_CHANGE || | ||||
| 		o.Type == POST_DISPLAYNAME_CHANGE || o.Type == POST_CHANNEL_DELETED) { | ||||
| 		return NewLocAppError("Post.IsValid", "model.post.is_valid.type.app_error", nil, "id="+o.Type) | ||||
| 	} | ||||
|   | ||||
							
								
								
									
										17
									
								
								vendor/github.com/mattermost/platform/model/post_list.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								vendor/github.com/mattermost/platform/model/post_list.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -13,6 +13,13 @@ type PostList struct { | ||||
| 	Posts map[string]*Post `json:"posts"` | ||||
| } | ||||
|  | ||||
| func NewPostList() *PostList { | ||||
| 	return &PostList{ | ||||
| 		Order: make([]string, 0), | ||||
| 		Posts: make(map[string]*Post), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (o *PostList) ToJson() string { | ||||
| 	b, err := json.Marshal(o) | ||||
| 	if err != nil { | ||||
| @@ -72,10 +79,18 @@ func (o *PostList) Etag() string { | ||||
| 		if v.UpdateAt > t { | ||||
| 			t = v.UpdateAt | ||||
| 			id = v.Id | ||||
| 		} else if v.UpdateAt == t && v.Id > id { | ||||
| 			t = v.UpdateAt | ||||
| 			id = v.Id | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return Etag(id, t) | ||||
| 	orderId := "" | ||||
| 	if len(o.Order) > 0 { | ||||
| 		orderId = o.Order[0] | ||||
| 	} | ||||
|  | ||||
| 	return Etag(orderId, id, t) | ||||
| } | ||||
|  | ||||
| func (o *PostList) IsChannelId(channelId string) bool { | ||||
|   | ||||
							
								
								
									
										18
									
								
								vendor/github.com/mattermost/platform/model/push_notification.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								vendor/github.com/mattermost/platform/model/push_notification.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -10,8 +10,10 @@ import ( | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	PUSH_NOTIFY_APPLE   = "apple" | ||||
| 	PUSH_NOTIFY_ANDROID = "android" | ||||
| 	PUSH_NOTIFY_APPLE                = "apple" | ||||
| 	PUSH_NOTIFY_ANDROID              = "android" | ||||
| 	PUSH_NOTIFY_APPLE_REACT_NATIVE   = "apple_rn" | ||||
| 	PUSH_NOTIFY_ANDROID_REACT_NATIVE = "android_rn" | ||||
|  | ||||
| 	PUSH_TYPE_MESSAGE = "message" | ||||
| 	PUSH_TYPE_CLEAR   = "clear" | ||||
| @@ -46,12 +48,12 @@ func (me *PushNotification) ToJson() string { | ||||
| } | ||||
|  | ||||
| func (me *PushNotification) SetDeviceIdAndPlatform(deviceId string) { | ||||
| 	if strings.HasPrefix(deviceId, PUSH_NOTIFY_APPLE+":") { | ||||
| 		me.Platform = PUSH_NOTIFY_APPLE | ||||
| 		me.DeviceId = strings.TrimPrefix(deviceId, PUSH_NOTIFY_APPLE+":") | ||||
| 	} else if strings.HasPrefix(deviceId, PUSH_NOTIFY_ANDROID+":") { | ||||
| 		me.Platform = PUSH_NOTIFY_ANDROID | ||||
| 		me.DeviceId = strings.TrimPrefix(deviceId, PUSH_NOTIFY_ANDROID+":") | ||||
|  | ||||
| 	index := strings.Index(deviceId, ":") | ||||
|  | ||||
| 	if index > -1 { | ||||
| 		me.Platform = deviceId[:index] | ||||
| 		me.DeviceId = deviceId[index+1:] | ||||
| 	} | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										57
									
								
								vendor/github.com/mattermost/platform/model/push_response.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								vendor/github.com/mattermost/platform/model/push_response.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| // Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. | ||||
| // See License.txt for license information. | ||||
|  | ||||
| package model | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"io" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	PUSH_STATUS           = "status" | ||||
| 	PUSH_STATUS_OK        = "OK" | ||||
| 	PUSH_STATUS_FAIL      = "FAIL" | ||||
| 	PUSH_STATUS_REMOVE    = "REMOVE" | ||||
| 	PUSH_STATUS_ERROR_MSG = "error" | ||||
| ) | ||||
|  | ||||
| type PushResponse map[string]string | ||||
|  | ||||
| func NewOkPushResponse() PushResponse { | ||||
| 	m := make(map[string]string) | ||||
| 	m[PUSH_STATUS] = PUSH_STATUS_OK | ||||
| 	return m | ||||
| } | ||||
|  | ||||
| func NewRemovePushResponse() PushResponse { | ||||
| 	m := make(map[string]string) | ||||
| 	m[PUSH_STATUS] = PUSH_STATUS_REMOVE | ||||
| 	return m | ||||
| } | ||||
|  | ||||
| func NewErrorPushResponse(message string) PushResponse { | ||||
| 	m := make(map[string]string) | ||||
| 	m[PUSH_STATUS] = PUSH_STATUS_FAIL | ||||
| 	m[PUSH_STATUS_ERROR_MSG] = message | ||||
| 	return m | ||||
| } | ||||
|  | ||||
| func (me *PushResponse) ToJson() string { | ||||
| 	if b, err := json.Marshal(me); err != nil { | ||||
| 		return "" | ||||
| 	} else { | ||||
| 		return string(b) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func PushResponseFromJson(data io.Reader) PushResponse { | ||||
| 	decoder := json.NewDecoder(data) | ||||
|  | ||||
| 	var objmap PushResponse | ||||
| 	if err := decoder.Decode(&objmap); err != nil { | ||||
| 		return make(map[string]string) | ||||
| 	} else { | ||||
| 		return objmap | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										5
									
								
								vendor/github.com/mattermost/platform/model/session.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/mattermost/platform/model/session.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -11,7 +11,7 @@ import ( | ||||
|  | ||||
| const ( | ||||
| 	SESSION_COOKIE_TOKEN  = "MMAUTHTOKEN" | ||||
| 	SESSION_CACHE_SIZE    = 25000 | ||||
| 	SESSION_CACHE_SIZE    = 35000 | ||||
| 	SESSION_PROP_PLATFORM = "platform" | ||||
| 	SESSION_PROP_OS       = "os" | ||||
| 	SESSION_PROP_BROWSER  = "browser" | ||||
| @@ -111,8 +111,7 @@ func (me *Session) GetTeamByTeamId(teamId string) *TeamMember { | ||||
| } | ||||
|  | ||||
| func (me *Session) IsMobileApp() bool { | ||||
| 	return len(me.DeviceId) > 0 && | ||||
| 		(strings.HasPrefix(me.DeviceId, PUSH_NOTIFY_APPLE+":") || strings.HasPrefix(me.DeviceId, PUSH_NOTIFY_ANDROID+":")) | ||||
| 	return len(me.DeviceId) > 0 | ||||
| } | ||||
|  | ||||
| func (me *Session) GetUserRoles() []string { | ||||
|   | ||||
							
								
								
									
										29
									
								
								vendor/github.com/mattermost/platform/model/slack_attachment.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								vendor/github.com/mattermost/platform/model/slack_attachment.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| // Copyright (c) 2017 Mattermost, Inc. All Rights Reserved. | ||||
| // See License.txt for license information. | ||||
|  | ||||
| package model | ||||
|  | ||||
| type SlackAttachment struct { | ||||
| 	Id         int64                   `json:"id"` | ||||
| 	Fallback   string                  `json:"fallback"` | ||||
| 	Color      string                  `json:"color"` | ||||
| 	Pretext    string                  `json:"pretext"` | ||||
| 	AuthorName string                  `json:"author_name"` | ||||
| 	AuthorLink string                  `json:"author_link"` | ||||
| 	AuthorIcon string                  `json:"author_icon"` | ||||
| 	Title      string                  `json:"title"` | ||||
| 	TitleLink  string                  `json:"title_link"` | ||||
| 	Text       string                  `json:"text"` | ||||
| 	Fields     []*SlackAttachmentField `json:"fields"` | ||||
| 	ImageURL   string                  `json:"image_url"` | ||||
| 	ThumbURL   string                  `json:"thumb_url"` | ||||
| 	Footer     string                  `json:"footer"` | ||||
| 	FooterIcon string                  `json:"footer_icon"` | ||||
| 	Timestamp  interface{}             `json:"ts"` // This is either a string or an int64 | ||||
| } | ||||
|  | ||||
| type SlackAttachmentField struct { | ||||
| 	Title string      `json:"title"` | ||||
| 	Value interface{} `json:"value"` | ||||
| 	Short bool        `json:"short"` | ||||
| } | ||||
							
								
								
									
										2
									
								
								vendor/github.com/mattermost/platform/model/status.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/mattermost/platform/model/status.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -12,7 +12,7 @@ const ( | ||||
| 	STATUS_OFFLINE         = "offline" | ||||
| 	STATUS_AWAY            = "away" | ||||
| 	STATUS_ONLINE          = "online" | ||||
| 	STATUS_CACHE_SIZE      = 25000 | ||||
| 	STATUS_CACHE_SIZE      = SESSION_CACHE_SIZE | ||||
| 	STATUS_CHANNEL_TIMEOUT = 20000  // 20 seconds | ||||
| 	STATUS_MIN_UPDATE_TIME = 120000 // 2 minutes | ||||
| ) | ||||
|   | ||||
							
								
								
									
										80
									
								
								vendor/github.com/mattermost/platform/model/team.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										80
									
								
								vendor/github.com/mattermost/platform/model/team.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -7,14 +7,22 @@ import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"net/http" | ||||
| 	"regexp" | ||||
| 	"strings" | ||||
| 	"unicode/utf8" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	TEAM_OPEN   = "O" | ||||
| 	TEAM_INVITE = "I" | ||||
| 	TEAM_OPEN                       = "O" | ||||
| 	TEAM_INVITE                     = "I" | ||||
| 	TEAM_ALLOWED_DOMAINS_MAX_LENGTH = 500 | ||||
| 	TEAM_COMPANY_NAME_MAX_LENGTH    = 64 | ||||
| 	TEAM_DESCRIPTION_MAX_LENGTH     = 255 | ||||
| 	TEAM_DISPLAY_NAME_MAX_RUNES     = 64 | ||||
| 	TEAM_EMAIL_MAX_LENGTH           = 128 | ||||
| 	TEAM_NAME_MAX_LENGTH            = 64 | ||||
| 	TEAM_NAME_MIN_LENGTH            = 2 | ||||
| ) | ||||
|  | ||||
| type Team struct { | ||||
| @@ -48,6 +56,14 @@ func InvitesFromJson(data io.Reader) *Invites { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (o *Invites) ToEmailList() []string { | ||||
| 	emailList := make([]string, len(o.Invites)) | ||||
| 	for _, invite := range o.Invites { | ||||
| 		emailList = append(emailList, invite["email"]) | ||||
| 	} | ||||
| 	return emailList | ||||
| } | ||||
|  | ||||
| func (o *Invites) ToJson() string { | ||||
| 	b, err := json.Marshal(o) | ||||
| 	if err != nil { | ||||
| @@ -97,6 +113,26 @@ func TeamMapFromJson(data io.Reader) map[string]*Team { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TeamListToJson(t []*Team) string { | ||||
| 	b, err := json.Marshal(t) | ||||
| 	if err != nil { | ||||
| 		return "" | ||||
| 	} else { | ||||
| 		return string(b) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TeamListFromJson(data io.Reader) []*Team { | ||||
| 	decoder := json.NewDecoder(data) | ||||
| 	var teams []*Team | ||||
| 	err := decoder.Decode(&teams) | ||||
| 	if err == nil { | ||||
| 		return teams | ||||
| 	} else { | ||||
| 		return nil | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (o *Team) Etag() string { | ||||
| 	return Etag(o.Id, o.UpdateAt) | ||||
| } | ||||
| @@ -104,55 +140,55 @@ func (o *Team) Etag() string { | ||||
| func (o *Team) IsValid() *AppError { | ||||
|  | ||||
| 	if len(o.Id) != 26 { | ||||
| 		return NewLocAppError("Team.IsValid", "model.team.is_valid.id.app_error", nil, "") | ||||
| 		return NewAppError("Team.IsValid", "model.team.is_valid.id.app_error", nil, "", http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	if o.CreateAt == 0 { | ||||
| 		return NewLocAppError("Team.IsValid", "model.team.is_valid.create_at.app_error", nil, "id="+o.Id) | ||||
| 		return NewAppError("Team.IsValid", "model.team.is_valid.create_at.app_error", nil, "id="+o.Id, http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	if o.UpdateAt == 0 { | ||||
| 		return NewLocAppError("Team.IsValid", "model.team.is_valid.update_at.app_error", nil, "id="+o.Id) | ||||
| 		return NewAppError("Team.IsValid", "model.team.is_valid.update_at.app_error", nil, "id="+o.Id, http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	if len(o.Email) > 128 { | ||||
| 		return NewLocAppError("Team.IsValid", "model.team.is_valid.email.app_error", nil, "id="+o.Id) | ||||
| 	if len(o.Email) > TEAM_EMAIL_MAX_LENGTH { | ||||
| 		return NewAppError("Team.IsValid", "model.team.is_valid.email.app_error", nil, "id="+o.Id, http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	if len(o.Email) > 0 && !IsValidEmail(o.Email) { | ||||
| 		return NewLocAppError("Team.IsValid", "model.team.is_valid.email.app_error", nil, "id="+o.Id) | ||||
| 		return NewAppError("Team.IsValid", "model.team.is_valid.email.app_error", nil, "id="+o.Id, http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	if utf8.RuneCountInString(o.DisplayName) == 0 || utf8.RuneCountInString(o.DisplayName) > 64 { | ||||
| 		return NewLocAppError("Team.IsValid", "model.team.is_valid.name.app_error", nil, "id="+o.Id) | ||||
| 	if utf8.RuneCountInString(o.DisplayName) == 0 || utf8.RuneCountInString(o.DisplayName) > TEAM_DISPLAY_NAME_MAX_RUNES { | ||||
| 		return NewAppError("Team.IsValid", "model.team.is_valid.name.app_error", nil, "id="+o.Id, http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	if len(o.Name) > 64 { | ||||
| 		return NewLocAppError("Team.IsValid", "model.team.is_valid.url.app_error", nil, "id="+o.Id) | ||||
| 	if len(o.Name) > TEAM_NAME_MAX_LENGTH { | ||||
| 		return NewAppError("Team.IsValid", "model.team.is_valid.url.app_error", nil, "id="+o.Id, http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	if len(o.Description) > 255 { | ||||
| 		return NewLocAppError("Team.IsValid", "model.team.is_valid.description.app_error", nil, "id="+o.Id) | ||||
| 	if len(o.Description) > TEAM_DESCRIPTION_MAX_LENGTH { | ||||
| 		return NewAppError("Team.IsValid", "model.team.is_valid.description.app_error", nil, "id="+o.Id, http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	if IsReservedTeamName(o.Name) { | ||||
| 		return NewLocAppError("Team.IsValid", "model.team.is_valid.reserved.app_error", nil, "id="+o.Id) | ||||
| 		return NewAppError("Team.IsValid", "model.team.is_valid.reserved.app_error", nil, "id="+o.Id, http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	if !IsValidTeamName(o.Name) { | ||||
| 		return NewLocAppError("Team.IsValid", "model.team.is_valid.characters.app_error", nil, "id="+o.Id) | ||||
| 		return NewAppError("Team.IsValid", "model.team.is_valid.characters.app_error", nil, "id="+o.Id, http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	if !(o.Type == TEAM_OPEN || o.Type == TEAM_INVITE) { | ||||
| 		return NewLocAppError("Team.IsValid", "model.team.is_valid.type.app_error", nil, "id="+o.Id) | ||||
| 		return NewAppError("Team.IsValid", "model.team.is_valid.type.app_error", nil, "id="+o.Id, http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	if len(o.CompanyName) > 64 { | ||||
| 		return NewLocAppError("Team.IsValid", "model.team.is_valid.company.app_error", nil, "id="+o.Id) | ||||
| 	if len(o.CompanyName) > TEAM_COMPANY_NAME_MAX_LENGTH { | ||||
| 		return NewAppError("Team.IsValid", "model.team.is_valid.company.app_error", nil, "id="+o.Id, http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	if len(o.AllowedDomains) > 500 { | ||||
| 		return NewLocAppError("Team.IsValid", "model.team.is_valid.domains.app_error", nil, "id="+o.Id) | ||||
| 	if len(o.AllowedDomains) > TEAM_ALLOWED_DOMAINS_MAX_LENGTH { | ||||
| 		return NewAppError("Team.IsValid", "model.team.is_valid.domains.app_error", nil, "id="+o.Id, http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| @@ -193,7 +229,7 @@ func IsValidTeamName(s string) bool { | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	if len(s) <= 1 { | ||||
| 	if len(s) < TEAM_NAME_MIN_LENGTH { | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
|   | ||||
							
								
								
									
										143
									
								
								vendor/github.com/mattermost/platform/model/user.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										143
									
								
								vendor/github.com/mattermost/platform/model/user.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -7,20 +7,36 @@ import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"net/http" | ||||
| 	"regexp" | ||||
| 	"strings" | ||||
| 	"unicode" | ||||
| 	"unicode/utf8" | ||||
|  | ||||
| 	"golang.org/x/crypto/bcrypt" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	USER_NOTIFY_ALL            = "all" | ||||
| 	USER_NOTIFY_MENTION        = "mention" | ||||
| 	USER_NOTIFY_NONE           = "none" | ||||
| 	USER_NOTIFY_ALL         = "all" | ||||
| 	USER_NOTIFY_MENTION     = "mention" | ||||
| 	USER_NOTIFY_NONE        = "none" | ||||
| 	DESKTOP_NOTIFY_PROP     = "desktop" | ||||
| 	MARK_UNREAD_NOTIFY_PROP = "mark_unread" | ||||
| 	PUSH_NOTIFY_PROP        = "push" | ||||
| 	EMAIL_NOTIFY_PROP       = "email" | ||||
|  | ||||
| 	DEFAULT_LOCALE             = "en" | ||||
| 	USER_AUTH_SERVICE_EMAIL    = "email" | ||||
| 	USER_AUTH_SERVICE_USERNAME = "username" | ||||
|  | ||||
| 	USER_EMAIL_MAX_LENGTH     = 128 | ||||
| 	USER_NICKNAME_MAX_RUNES   = 64 | ||||
| 	USER_POSITION_MAX_RUNES   = 35 | ||||
| 	USER_FIRST_NAME_MAX_RUNES = 64 | ||||
| 	USER_LAST_NAME_MAX_RUNES  = 64 | ||||
| 	USER_AUTH_DATA_MAX_LENGTH = 128 | ||||
| 	USER_NAME_MAX_LENGTH      = 64 | ||||
| 	USER_NAME_MIN_LENGTH      = 1 | ||||
| ) | ||||
|  | ||||
| type User struct { | ||||
| @@ -51,56 +67,68 @@ type User struct { | ||||
| 	LastActivityAt     int64     `db:"-" json:"last_activity_at,omitempty"` | ||||
| } | ||||
|  | ||||
| type UserPatch struct { | ||||
| 	Username    *string    `json:"username"` | ||||
| 	Nickname    *string    `json:"nickname"` | ||||
| 	FirstName   *string    `json:"first_name"` | ||||
| 	LastName    *string    `json:"last_name"` | ||||
| 	Position    *string    `json:"position"` | ||||
| 	Email       *string    `json:"email"` | ||||
| 	Props       *StringMap `json:"props,omitempty"` | ||||
| 	NotifyProps *StringMap `json:"notify_props,omitempty"` | ||||
| 	Locale      *string    `json:"locale"` | ||||
| } | ||||
|  | ||||
| // IsValid validates the user and returns an error if it isn't configured | ||||
| // correctly. | ||||
| func (u *User) IsValid() *AppError { | ||||
|  | ||||
| 	if len(u.Id) != 26 { | ||||
| 		return NewLocAppError("User.IsValid", "model.user.is_valid.id.app_error", nil, "") | ||||
| 		return NewAppError("User.IsValid", "model.user.is_valid.id.app_error", nil, "", http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	if u.CreateAt == 0 { | ||||
| 		return NewLocAppError("User.IsValid", "model.user.is_valid.create_at.app_error", nil, "user_id="+u.Id) | ||||
| 		return NewAppError("User.IsValid", "model.user.is_valid.create_at.app_error", nil, "user_id="+u.Id, http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	if u.UpdateAt == 0 { | ||||
| 		return NewLocAppError("User.IsValid", "model.user.is_valid.update_at.app_error", nil, "user_id="+u.Id) | ||||
| 		return NewAppError("User.IsValid", "model.user.is_valid.update_at.app_error", nil, "user_id="+u.Id, http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	if !IsValidUsername(u.Username) { | ||||
| 		return NewLocAppError("User.IsValid", "model.user.is_valid.username.app_error", nil, "user_id="+u.Id) | ||||
| 		return NewAppError("User.IsValid", "model.user.is_valid.username.app_error", nil, "user_id="+u.Id, http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	if len(u.Email) > 128 || len(u.Email) == 0 { | ||||
| 		return NewLocAppError("User.IsValid", "model.user.is_valid.email.app_error", nil, "user_id="+u.Id) | ||||
| 	if len(u.Email) > USER_EMAIL_MAX_LENGTH || len(u.Email) == 0 { | ||||
| 		return NewAppError("User.IsValid", "model.user.is_valid.email.app_error", nil, "user_id="+u.Id, http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	if utf8.RuneCountInString(u.Nickname) > 64 { | ||||
| 		return NewLocAppError("User.IsValid", "model.user.is_valid.nickname.app_error", nil, "user_id="+u.Id) | ||||
| 	if utf8.RuneCountInString(u.Nickname) > USER_NICKNAME_MAX_RUNES { | ||||
| 		return NewAppError("User.IsValid", "model.user.is_valid.nickname.app_error", nil, "user_id="+u.Id, http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	if utf8.RuneCountInString(u.Position) > 35 { | ||||
| 		return NewLocAppError("User.IsValid", "model.user.is_valid.position.app_error", nil, "user_id="+u.Id) | ||||
| 	if utf8.RuneCountInString(u.Position) > USER_POSITION_MAX_RUNES { | ||||
| 		return NewAppError("User.IsValid", "model.user.is_valid.position.app_error", nil, "user_id="+u.Id, http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	if utf8.RuneCountInString(u.FirstName) > 64 { | ||||
| 		return NewLocAppError("User.IsValid", "model.user.is_valid.first_name.app_error", nil, "user_id="+u.Id) | ||||
| 	if utf8.RuneCountInString(u.FirstName) > USER_FIRST_NAME_MAX_RUNES { | ||||
| 		return NewAppError("User.IsValid", "model.user.is_valid.first_name.app_error", nil, "user_id="+u.Id, http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	if utf8.RuneCountInString(u.LastName) > 64 { | ||||
| 		return NewLocAppError("User.IsValid", "model.user.is_valid.last_name.app_error", nil, "user_id="+u.Id) | ||||
| 	if utf8.RuneCountInString(u.LastName) > USER_LAST_NAME_MAX_RUNES { | ||||
| 		return NewAppError("User.IsValid", "model.user.is_valid.last_name.app_error", nil, "user_id="+u.Id, http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	if u.AuthData != nil && len(*u.AuthData) > 128 { | ||||
| 		return NewLocAppError("User.IsValid", "model.user.is_valid.auth_data.app_error", nil, "user_id="+u.Id) | ||||
| 	if u.AuthData != nil && len(*u.AuthData) > USER_AUTH_DATA_MAX_LENGTH { | ||||
| 		return NewAppError("User.IsValid", "model.user.is_valid.auth_data.app_error", nil, "user_id="+u.Id, http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	if u.AuthData != nil && len(*u.AuthData) > 0 && len(u.AuthService) == 0 { | ||||
| 		return NewLocAppError("User.IsValid", "model.user.is_valid.auth_data_type.app_error", nil, "user_id="+u.Id) | ||||
| 		return NewAppError("User.IsValid", "model.user.is_valid.auth_data_type.app_error", nil, "user_id="+u.Id, http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	if len(u.Password) > 0 && u.AuthData != nil && len(*u.AuthData) > 0 { | ||||
| 		return NewLocAppError("User.IsValid", "model.user.is_valid.auth_data_pwd.app_error", nil, "user_id="+u.Id) | ||||
| 		return NewAppError("User.IsValid", "model.user.is_valid.auth_data_pwd.app_error", nil, "user_id="+u.Id, http.StatusBadRequest) | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| @@ -115,7 +143,7 @@ func (u *User) PreSave() { | ||||
| 	} | ||||
|  | ||||
| 	if u.Username == "" { | ||||
| 		u.Username = NewId() | ||||
| 		u.Username = "n" + NewId() | ||||
| 	} | ||||
|  | ||||
| 	if u.AuthData != nil && *u.AuthData == "" { | ||||
| @@ -205,6 +233,44 @@ func (user *User) UpdateMentionKeysFromUsername(oldUsername string) { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (u *User) Patch(patch *UserPatch) { | ||||
| 	if patch.Username != nil { | ||||
| 		u.Username = *patch.Username | ||||
| 	} | ||||
|  | ||||
| 	if patch.Nickname != nil { | ||||
| 		u.Nickname = *patch.Nickname | ||||
| 	} | ||||
|  | ||||
| 	if patch.FirstName != nil { | ||||
| 		u.FirstName = *patch.FirstName | ||||
| 	} | ||||
|  | ||||
| 	if patch.LastName != nil { | ||||
| 		u.LastName = *patch.LastName | ||||
| 	} | ||||
|  | ||||
| 	if patch.Position != nil { | ||||
| 		u.Position = *patch.Position | ||||
| 	} | ||||
|  | ||||
| 	if patch.Email != nil { | ||||
| 		u.Email = *patch.Email | ||||
| 	} | ||||
|  | ||||
| 	if patch.Props != nil { | ||||
| 		u.Props = *patch.Props | ||||
| 	} | ||||
|  | ||||
| 	if patch.NotifyProps != nil { | ||||
| 		u.NotifyProps = *patch.NotifyProps | ||||
| 	} | ||||
|  | ||||
| 	if patch.Locale != nil { | ||||
| 		u.Locale = *patch.Locale | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ToJson convert a User to a json string | ||||
| func (u *User) ToJson() string { | ||||
| 	b, err := json.Marshal(u) | ||||
| @@ -215,6 +281,15 @@ func (u *User) ToJson() string { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (u *UserPatch) ToJson() string { | ||||
| 	b, err := json.Marshal(u) | ||||
| 	if err != nil { | ||||
| 		return "" | ||||
| 	} else { | ||||
| 		return string(b) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Generate a valid strong etag so the browser can cache the results | ||||
| func (u *User) Etag(showFullName, showEmail bool) string { | ||||
| 	return Etag(u.Id, u.UpdateAt, showFullName, showEmail) | ||||
| @@ -376,6 +451,13 @@ func IsInRole(userRoles string, inRole string) bool { | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func (u *User) IsSSOUser() bool { | ||||
| 	if u.AuthService != "" && u.AuthService != USER_AUTH_SERVICE_EMAIL { | ||||
| 		return true | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func (u *User) IsOAuthUser() bool { | ||||
| 	if u.AuthService == USER_AUTH_SERVICE_GITLAB { | ||||
| 		return true | ||||
| @@ -402,6 +484,17 @@ func UserFromJson(data io.Reader) *User { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func UserPatchFromJson(data io.Reader) *UserPatch { | ||||
| 	decoder := json.NewDecoder(data) | ||||
| 	var user UserPatch | ||||
| 	err := decoder.Decode(&user) | ||||
| 	if err == nil { | ||||
| 		return &user | ||||
| 	} else { | ||||
| 		return nil | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func UserMapToJson(u map[string]*User) string { | ||||
| 	b, err := json.Marshal(u) | ||||
| 	if err != nil { | ||||
| @@ -472,7 +565,7 @@ var restrictedUsernames = []string{ | ||||
| } | ||||
|  | ||||
| func IsValidUsername(s string) bool { | ||||
| 	if len(s) == 0 || len(s) > 64 { | ||||
| 	if len(s) < USER_NAME_MIN_LENGTH || len(s) > USER_NAME_MAX_LENGTH { | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| @@ -480,6 +573,10 @@ func IsValidUsername(s string) bool { | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	if !unicode.IsLetter(rune(s[0])) { | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	for _, restrictedUsername := range restrictedUsernames { | ||||
| 		if s == restrictedUsername { | ||||
| 			return false | ||||
|   | ||||
							
								
								
									
										32
									
								
								vendor/github.com/mattermost/platform/model/utils.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										32
									
								
								vendor/github.com/mattermost/platform/model/utils.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -34,14 +34,14 @@ type StringArray []string | ||||
| type EncryptStringMap map[string]string | ||||
|  | ||||
| type AppError struct { | ||||
| 	Id            string                 `json:"id"` | ||||
| 	Message       string                 `json:"message"`               // Message to be display to the end user without debugging information | ||||
| 	DetailedError string                 `json:"detailed_error"`        // Internal error string to help the developer | ||||
| 	RequestId     string                 `json:"request_id,omitempty"`  // The RequestId that's also set in the header | ||||
| 	StatusCode    int                    `json:"status_code,omitempty"` // The http status code | ||||
| 	Where         string                 `json:"-"`                     // The function where it happened in the form of Struct.Func | ||||
| 	IsOAuth       bool                   `json:"is_oauth,omitempty"`    // Whether the error is OAuth specific | ||||
| 	params        map[string]interface{} `json:"-"` | ||||
| 	Id            string `json:"id"` | ||||
| 	Message       string `json:"message"`               // Message to be display to the end user without debugging information | ||||
| 	DetailedError string `json:"detailed_error"`        // Internal error string to help the developer | ||||
| 	RequestId     string `json:"request_id,omitempty"`  // The RequestId that's also set in the header | ||||
| 	StatusCode    int    `json:"status_code,omitempty"` // The http status code | ||||
| 	Where         string `json:"-"`                     // The function where it happened in the form of Struct.Func | ||||
| 	IsOAuth       bool   `json:"is_oauth,omitempty"`    // Whether the error is OAuth specific | ||||
| 	params        map[string]interface{} | ||||
| } | ||||
|  | ||||
| func (er *AppError) Error() string { | ||||
| @@ -93,6 +93,18 @@ func AppErrorFromJson(data io.Reader) *AppError { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func NewAppError(where string, id string, params map[string]interface{}, details string, status int) *AppError { | ||||
| 	ap := &AppError{} | ||||
| 	ap.Id = id | ||||
| 	ap.params = params | ||||
| 	ap.Message = id | ||||
| 	ap.Where = where | ||||
| 	ap.DetailedError = details | ||||
| 	ap.StatusCode = status | ||||
| 	ap.IsOAuth = false | ||||
| 	return ap | ||||
| } | ||||
|  | ||||
| func NewLocAppError(where string, id string, params map[string]interface{}, details string) *AppError { | ||||
| 	ap := &AppError{} | ||||
| 	ap.Id = id | ||||
| @@ -268,7 +280,7 @@ func IsValidChannelIdentifier(s string) bool { | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	if len(s) < 2 { | ||||
| 	if len(s) < CHANNEL_NAME_MIN_LENGTH { | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| @@ -370,7 +382,7 @@ func ClearMentionTags(post string) string { | ||||
| var UrlRegex = regexp.MustCompile(`^((?:[a-z]+:\/\/)?(?:(?:[a-z0-9\-]+\.)+(?:[a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|local|internal))(:[0-9]{1,5})?(?:\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(?:\?[a-z0-9+_~\-\.%=&]*)?)?(?:#[a-zA-Z0-9!$&'()*+.=-_~:@/?]*)?)(?:\s+|$)$`) | ||||
| var PartialUrlRegex = regexp.MustCompile(`/([A-Za-z0-9]{26})/([A-Za-z0-9]{26})/((?:[A-Za-z0-9]{26})?.+(?:\.[A-Za-z0-9]{3,})?)`) | ||||
|  | ||||
| var SplitRunes = map[rune]bool{',': true, ' ': true, '.': true, '!': true, '?': true, ':': true, ';': true, '\n': true, '<': true, '>': true, '(': true, ')': true, '{': true, '}': true, '[': true, ']': true, '+': true, '/': true, '\\': true} | ||||
| var SplitRunes = map[rune]bool{',': true, ' ': true, '.': true, '!': true, '?': true, ':': true, ';': true, '\n': true, '<': true, '>': true, '(': true, ')': true, '{': true, '}': true, '[': true, ']': true, '+': true, '/': true, '\\': true, '^': true, '#': true, '$': true, '&': true} | ||||
|  | ||||
| func IsValidHttpUrl(rawUrl string) bool { | ||||
| 	if strings.Index(rawUrl, "http://") != 0 && strings.Index(rawUrl, "https://") != 0 { | ||||
|   | ||||
							
								
								
									
										1
									
								
								vendor/github.com/mattermost/platform/model/version.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/mattermost/platform/model/version.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -13,6 +13,7 @@ import ( | ||||
| // It should be maitained in chronological order with most current | ||||
| // release at the front of the list. | ||||
| var versions = []string{ | ||||
| 	"3.7.0", | ||||
| 	"3.6.0", | ||||
| 	"3.5.0", | ||||
| 	"3.4.0", | ||||
|   | ||||
							
								
								
									
										8
									
								
								vendor/github.com/mattermost/platform/model/websocket_client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/mattermost/platform/model/websocket_client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -8,6 +8,10 @@ import ( | ||||
| 	"github.com/gorilla/websocket" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	SOCKET_MAX_MESSAGE_SIZE_KB = 8 * 1024 // 8KB | ||||
| ) | ||||
|  | ||||
| type WebSocketClient struct { | ||||
| 	Url             string          // The location of the server like "ws://localhost:8065" | ||||
| 	ApiUrl          string          // The api location of the server like "ws://localhost:8065/api/v3" | ||||
| @@ -22,14 +26,14 @@ type WebSocketClient struct { | ||||
| // NewWebSocketClient constructs a new WebSocket client with convienence | ||||
| // methods for talking to the server. | ||||
| func NewWebSocketClient(url, authToken string) (*WebSocketClient, *AppError) { | ||||
| 	conn, _, err := websocket.DefaultDialer.Dial(url+API_URL_SUFFIX+"/users/websocket", nil) | ||||
| 	conn, _, err := websocket.DefaultDialer.Dial(url+API_URL_SUFFIX_V3+"/users/websocket", nil) | ||||
| 	if err != nil { | ||||
| 		return nil, NewLocAppError("NewWebSocketClient", "model.websocket_client.connect_fail.app_error", nil, err.Error()) | ||||
| 	} | ||||
|  | ||||
| 	client := &WebSocketClient{ | ||||
| 		url, | ||||
| 		url + API_URL_SUFFIX, | ||||
| 		url + API_URL_SUFFIX_V3, | ||||
| 		conn, | ||||
| 		authToken, | ||||
| 		1, | ||||
|   | ||||
							
								
								
									
										3
									
								
								vendor/github.com/mattermost/platform/model/websocket_message.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/mattermost/platform/model/websocket_message.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -14,8 +14,9 @@ const ( | ||||
| 	WEBSOCKET_EVENT_POST_EDITED        = "post_edited" | ||||
| 	WEBSOCKET_EVENT_POST_DELETED       = "post_deleted" | ||||
| 	WEBSOCKET_EVENT_CHANNEL_DELETED    = "channel_deleted" | ||||
| 	WEBSOCKET_EVENT_CHANNEL_VIEWED     = "channel_viewed" | ||||
| 	WEBSOCKET_EVENT_CHANNEL_CREATED    = "channel_created" | ||||
| 	WEBSOCKET_EVENT_DIRECT_ADDED       = "direct_added" | ||||
| 	WEBSOCKET_EVENT_GROUP_ADDED        = "group_added" | ||||
| 	WEBSOCKET_EVENT_NEW_USER           = "new_user" | ||||
| 	WEBSOCKET_EVENT_LEAVE_TEAM         = "leave_team" | ||||
| 	WEBSOCKET_EVENT_UPDATE_TEAM        = "update_team" | ||||
|   | ||||
							
								
								
									
										897
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/LICENSE.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										897
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/LICENSE.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,897 @@ | ||||
| Mattermost Licensing | ||||
|  | ||||
| SOFTWARE LICENSING  | ||||
|  | ||||
| You are licensed to use compiled versions of the Mattermost platform produced by Mattermost, Inc. under an MIT LICENSE  | ||||
|  | ||||
| -	See MIT-COMPILED-LICENSE.md included in compiled versions for details | ||||
|  | ||||
| You may be licensed to use source code to create compiled versions not produced by Mattermost, Inc. in one of two ways: | ||||
|  | ||||
| 1. Under the Free Software Foundation’s GNU AGPL v.3.0, subject to the exceptions outlined in this policy; or  | ||||
| 2. Under a commercial license available from Mattermost, Inc. by contacting commercial@mattermost.com  | ||||
|  | ||||
| You are licensed to use the source code in Admin Tools and Configuration Files (templates/, config/, model/,  | ||||
| webapp/client, webapp/fonts, webapp/i18n, webapp/images and all subdirectories thereof) under the Apache License v2.0. | ||||
|  | ||||
| We promise that we will not enforce the copyleft provisions in AGPL v3.0 against you if your application (a) does not  | ||||
| link to the Mattermost Platform directly, but exclusively uses the Mattermost Admin Tools and Configuration Files, and | ||||
| (b) you have not modified, added to or adapted the source code of Mattermost in a way that results in the creation of  | ||||
| a “modified version” or “work based on” Mattermost as these terms are defined in the AGPL v3.0 license. | ||||
|  | ||||
| MATTERMOST TRADEMARK GUIDELINES | ||||
|  | ||||
| Your use of the mark Mattermost is subject to Mattermost, Inc's prior written approval and our organization’s Trademark  | ||||
| Standards of Use at http://www.mattermost.org/trademark-standards-of-use/. For trademark approval or any questions  | ||||
| you have about using these trademarks, please email trademark@mattermost.com  | ||||
|  | ||||
| ------------------------------------------------------------------------------------------------------------------------------ | ||||
|                                 | ||||
|                                Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "[]" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright [yyyy] [name of copyright owner] | ||||
|  | ||||
|    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. | ||||
|  | ||||
| ------------------------------------------------------------------------------ | ||||
|  | ||||
| The software is released under the terms of the GNU Affero General Public | ||||
| License, version 3. | ||||
|  | ||||
|                     GNU AFFERO GENERAL PUBLIC LICENSE | ||||
|                        Version 3, 19 November 2007 | ||||
|  | ||||
|  Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | ||||
|  Everyone is permitted to copy and distribute verbatim copies | ||||
|  of this license document, but changing it is not allowed. | ||||
|  | ||||
|                             Preamble | ||||
|  | ||||
|   The GNU Affero General Public License is a free, copyleft license for | ||||
| software and other kinds of works, specifically designed to ensure | ||||
| cooperation with the community in the case of network server software. | ||||
|  | ||||
|   The licenses for most software and other practical works are designed | ||||
| to take away your freedom to share and change the works.  By contrast, | ||||
| our General Public Licenses are intended to guarantee your freedom to | ||||
| share and change all versions of a program--to make sure it remains free | ||||
| software for all its users. | ||||
|  | ||||
|   When we speak of free software, we are referring to freedom, not | ||||
| price.  Our General Public Licenses are designed to make sure that you | ||||
| have the freedom to distribute copies of free software (and charge for | ||||
| them if you wish), that you receive source code or can get it if you | ||||
| want it, that you can change the software or use pieces of it in new | ||||
| free programs, and that you know you can do these things. | ||||
|  | ||||
|   Developers that use our General Public Licenses protect your rights | ||||
| with two steps: (1) assert copyright on the software, and (2) offer | ||||
| you this License which gives you legal permission to copy, distribute | ||||
| and/or modify the software. | ||||
|  | ||||
|   A secondary benefit of defending all users' freedom is that | ||||
| improvements made in alternate versions of the program, if they | ||||
| receive widespread use, become available for other developers to | ||||
| incorporate.  Many developers of free software are heartened and | ||||
| encouraged by the resulting cooperation.  However, in the case of | ||||
| software used on network servers, this result may fail to come about. | ||||
| The GNU General Public License permits making a modified version and | ||||
| letting the public access it on a server without ever releasing its | ||||
| source code to the public. | ||||
|  | ||||
|   The GNU Affero General Public License is designed specifically to | ||||
| ensure that, in such cases, the modified source code becomes available | ||||
| to the community.  It requires the operator of a network server to | ||||
| provide the source code of the modified version running there to the | ||||
| users of that server.  Therefore, public use of a modified version, on | ||||
| a publicly accessible server, gives the public access to the source | ||||
| code of the modified version. | ||||
|  | ||||
|   An older license, called the Affero General Public License and | ||||
| published by Affero, was designed to accomplish similar goals.  This is | ||||
| a different license, not a version of the Affero GPL, but Affero has | ||||
| released a new version of the Affero GPL which permits relicensing under | ||||
| this license. | ||||
|  | ||||
|   The precise terms and conditions for copying, distribution and | ||||
| modification follow. | ||||
|  | ||||
|                        TERMS AND CONDITIONS | ||||
|  | ||||
|   0. Definitions. | ||||
|  | ||||
|   "This License" refers to version 3 of the GNU Affero General Public License. | ||||
|  | ||||
|   "Copyright" also means copyright-like laws that apply to other kinds of | ||||
| works, such as semiconductor masks. | ||||
|  | ||||
|   "The Program" refers to any copyrightable work licensed under this | ||||
| License.  Each licensee is addressed as "you".  "Licensees" and | ||||
| "recipients" may be individuals or organizations. | ||||
|  | ||||
|   To "modify" a work means to copy from or adapt all or part of the work | ||||
| in a fashion requiring copyright permission, other than the making of an | ||||
| exact copy.  The resulting work is called a "modified version" of the | ||||
| earlier work or a work "based on" the earlier work. | ||||
|  | ||||
|   A "covered work" means either the unmodified Program or a work based | ||||
| on the Program. | ||||
|  | ||||
|   To "propagate" a work means to do anything with it that, without | ||||
| permission, would make you directly or secondarily liable for | ||||
| infringement under applicable copyright law, except executing it on a | ||||
| computer or modifying a private copy.  Propagation includes copying, | ||||
| distribution (with or without modification), making available to the | ||||
| public, and in some countries other activities as well. | ||||
|  | ||||
|   To "convey" a work means any kind of propagation that enables other | ||||
| parties to make or receive copies.  Mere interaction with a user through | ||||
| a computer network, with no transfer of a copy, is not conveying. | ||||
|  | ||||
|   An interactive user interface displays "Appropriate Legal Notices" | ||||
| to the extent that it includes a convenient and prominently visible | ||||
| feature that (1) displays an appropriate copyright notice, and (2) | ||||
| tells the user that there is no warranty for the work (except to the | ||||
| extent that warranties are provided), that licensees may convey the | ||||
| work under this License, and how to view a copy of this License.  If | ||||
| the interface presents a list of user commands or options, such as a | ||||
| menu, a prominent item in the list meets this criterion. | ||||
|  | ||||
|   1. Source Code. | ||||
|  | ||||
|   The "source code" for a work means the preferred form of the work | ||||
| for making modifications to it.  "Object code" means any non-source | ||||
| form of a work. | ||||
|  | ||||
|   A "Standard Interface" means an interface that either is an official | ||||
| standard defined by a recognized standards body, or, in the case of | ||||
| interfaces specified for a particular programming language, one that | ||||
| is widely used among developers working in that language. | ||||
|  | ||||
|   The "System Libraries" of an executable work include anything, other | ||||
| than the work as a whole, that (a) is included in the normal form of | ||||
| packaging a Major Component, but which is not part of that Major | ||||
| Component, and (b) serves only to enable use of the work with that | ||||
| Major Component, or to implement a Standard Interface for which an | ||||
| implementation is available to the public in source code form.  A | ||||
| "Major Component", in this context, means a major essential component | ||||
| (kernel, window system, and so on) of the specific operating system | ||||
| (if any) on which the executable work runs, or a compiler used to | ||||
| produce the work, or an object code interpreter used to run it. | ||||
|  | ||||
|   The "Corresponding Source" for a work in object code form means all | ||||
| the source code needed to generate, install, and (for an executable | ||||
| work) run the object code and to modify the work, including scripts to | ||||
| control those activities.  However, it does not include the work's | ||||
| System Libraries, or general-purpose tools or generally available free | ||||
| programs which are used unmodified in performing those activities but | ||||
| which are not part of the work.  For example, Corresponding Source | ||||
| includes interface definition files associated with source files for | ||||
| the work, and the source code for shared libraries and dynamically | ||||
| linked subprograms that the work is specifically designed to require, | ||||
| such as by intimate data communication or control flow between those | ||||
| subprograms and other parts of the work. | ||||
|  | ||||
|   The Corresponding Source need not include anything that users | ||||
| can regenerate automatically from other parts of the Corresponding | ||||
| Source. | ||||
|  | ||||
|   The Corresponding Source for a work in source code form is that | ||||
| same work. | ||||
|  | ||||
|   2. Basic Permissions. | ||||
|  | ||||
|   All rights granted under this License are granted for the term of | ||||
| copyright on the Program, and are irrevocable provided the stated | ||||
| conditions are met.  This License explicitly affirms your unlimited | ||||
| permission to run the unmodified Program.  The output from running a | ||||
| covered work is covered by this License only if the output, given its | ||||
| content, constitutes a covered work.  This License acknowledges your | ||||
| rights of fair use or other equivalent, as provided by copyright law. | ||||
|  | ||||
|   You may make, run and propagate covered works that you do not | ||||
| convey, without conditions so long as your license otherwise remains | ||||
| in force.  You may convey covered works to others for the sole purpose | ||||
| of having them make modifications exclusively for you, or provide you | ||||
| with facilities for running those works, provided that you comply with | ||||
| the terms of this License in conveying all material for which you do | ||||
| not control copyright.  Those thus making or running the covered works | ||||
| for you must do so exclusively on your behalf, under your direction | ||||
| and control, on terms that prohibit them from making any copies of | ||||
| your copyrighted material outside their relationship with you. | ||||
|  | ||||
|   Conveying under any other circumstances is permitted solely under | ||||
| the conditions stated below.  Sublicensing is not allowed; section 10 | ||||
| makes it unnecessary. | ||||
|  | ||||
|   3. Protecting Users' Legal Rights From Anti-Circumvention Law. | ||||
|  | ||||
|   No covered work shall be deemed part of an effective technological | ||||
| measure under any applicable law fulfilling obligations under article | ||||
| 11 of the WIPO copyright treaty adopted on 20 December 1996, or | ||||
| similar laws prohibiting or restricting circumvention of such | ||||
| measures. | ||||
|  | ||||
|   When you convey a covered work, you waive any legal power to forbid | ||||
| circumvention of technological measures to the extent such circumvention | ||||
| is effected by exercising rights under this License with respect to | ||||
| the covered work, and you disclaim any intention to limit operation or | ||||
| modification of the work as a means of enforcing, against the work's | ||||
| users, your or third parties' legal rights to forbid circumvention of | ||||
| technological measures. | ||||
|  | ||||
|   4. Conveying Verbatim Copies. | ||||
|  | ||||
|   You may convey verbatim copies of the Program's source code as you | ||||
| receive it, in any medium, provided that you conspicuously and | ||||
| appropriately publish on each copy an appropriate copyright notice; | ||||
| keep intact all notices stating that this License and any | ||||
| non-permissive terms added in accord with section 7 apply to the code; | ||||
| keep intact all notices of the absence of any warranty; and give all | ||||
| recipients a copy of this License along with the Program. | ||||
|  | ||||
|   You may charge any price or no price for each copy that you convey, | ||||
| and you may offer support or warranty protection for a fee. | ||||
|  | ||||
|   5. Conveying Modified Source Versions. | ||||
|  | ||||
|   You may convey a work based on the Program, or the modifications to | ||||
| produce it from the Program, in the form of source code under the | ||||
| terms of section 4, provided that you also meet all of these conditions: | ||||
|  | ||||
|     a) The work must carry prominent notices stating that you modified | ||||
|     it, and giving a relevant date. | ||||
|  | ||||
|     b) The work must carry prominent notices stating that it is | ||||
|     released under this License and any conditions added under section | ||||
|     7.  This requirement modifies the requirement in section 4 to | ||||
|     "keep intact all notices". | ||||
|  | ||||
|     c) You must license the entire work, as a whole, under this | ||||
|     License to anyone who comes into possession of a copy.  This | ||||
|     License will therefore apply, along with any applicable section 7 | ||||
|     additional terms, to the whole of the work, and all its parts, | ||||
|     regardless of how they are packaged.  This License gives no | ||||
|     permission to license the work in any other way, but it does not | ||||
|     invalidate such permission if you have separately received it. | ||||
|  | ||||
|     d) If the work has interactive user interfaces, each must display | ||||
|     Appropriate Legal Notices; however, if the Program has interactive | ||||
|     interfaces that do not display Appropriate Legal Notices, your | ||||
|     work need not make them do so. | ||||
|  | ||||
|   A compilation of a covered work with other separate and independent | ||||
| works, which are not by their nature extensions of the covered work, | ||||
| and which are not combined with it such as to form a larger program, | ||||
| in or on a volume of a storage or distribution medium, is called an | ||||
| "aggregate" if the compilation and its resulting copyright are not | ||||
| used to limit the access or legal rights of the compilation's users | ||||
| beyond what the individual works permit.  Inclusion of a covered work | ||||
| in an aggregate does not cause this License to apply to the other | ||||
| parts of the aggregate. | ||||
|  | ||||
|   6. Conveying Non-Source Forms. | ||||
|  | ||||
|   You may convey a covered work in object code form under the terms | ||||
| of sections 4 and 5, provided that you also convey the | ||||
| machine-readable Corresponding Source under the terms of this License, | ||||
| in one of these ways: | ||||
|  | ||||
|     a) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by the | ||||
|     Corresponding Source fixed on a durable physical medium | ||||
|     customarily used for software interchange. | ||||
|  | ||||
|     b) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by a | ||||
|     written offer, valid for at least three years and valid for as | ||||
|     long as you offer spare parts or customer support for that product | ||||
|     model, to give anyone who possesses the object code either (1) a | ||||
|     copy of the Corresponding Source for all the software in the | ||||
|     product that is covered by this License, on a durable physical | ||||
|     medium customarily used for software interchange, for a price no | ||||
|     more than your reasonable cost of physically performing this | ||||
|     conveying of source, or (2) access to copy the | ||||
|     Corresponding Source from a network server at no charge. | ||||
|  | ||||
|     c) Convey individual copies of the object code with a copy of the | ||||
|     written offer to provide the Corresponding Source.  This | ||||
|     alternative is allowed only occasionally and noncommercially, and | ||||
|     only if you received the object code with such an offer, in accord | ||||
|     with subsection 6b. | ||||
|  | ||||
|     d) Convey the object code by offering access from a designated | ||||
|     place (gratis or for a charge), and offer equivalent access to the | ||||
|     Corresponding Source in the same way through the same place at no | ||||
|     further charge.  You need not require recipients to copy the | ||||
|     Corresponding Source along with the object code.  If the place to | ||||
|     copy the object code is a network server, the Corresponding Source | ||||
|     may be on a different server (operated by you or a third party) | ||||
|     that supports equivalent copying facilities, provided you maintain | ||||
|     clear directions next to the object code saying where to find the | ||||
|     Corresponding Source.  Regardless of what server hosts the | ||||
|     Corresponding Source, you remain obligated to ensure that it is | ||||
|     available for as long as needed to satisfy these requirements. | ||||
|  | ||||
|     e) Convey the object code using peer-to-peer transmission, provided | ||||
|     you inform other peers where the object code and Corresponding | ||||
|     Source of the work are being offered to the general public at no | ||||
|     charge under subsection 6d. | ||||
|  | ||||
|   A separable portion of the object code, whose source code is excluded | ||||
| from the Corresponding Source as a System Library, need not be | ||||
| included in conveying the object code work. | ||||
|  | ||||
|   A "User Product" is either (1) a "consumer product", which means any | ||||
| tangible personal property which is normally used for personal, family, | ||||
| or household purposes, or (2) anything designed or sold for incorporation | ||||
| into a dwelling.  In determining whether a product is a consumer product, | ||||
| doubtful cases shall be resolved in favor of coverage.  For a particular | ||||
| product received by a particular user, "normally used" refers to a | ||||
| typical or common use of that class of product, regardless of the status | ||||
| of the particular user or of the way in which the particular user | ||||
| actually uses, or expects or is expected to use, the product.  A product | ||||
| is a consumer product regardless of whether the product has substantial | ||||
| commercial, industrial or non-consumer uses, unless such uses represent | ||||
| the only significant mode of use of the product. | ||||
|  | ||||
|   "Installation Information" for a User Product means any methods, | ||||
| procedures, authorization keys, or other information required to install | ||||
| and execute modified versions of a covered work in that User Product from | ||||
| a modified version of its Corresponding Source.  The information must | ||||
| suffice to ensure that the continued functioning of the modified object | ||||
| code is in no case prevented or interfered with solely because | ||||
| modification has been made. | ||||
|  | ||||
|   If you convey an object code work under this section in, or with, or | ||||
| specifically for use in, a User Product, and the conveying occurs as | ||||
| part of a transaction in which the right of possession and use of the | ||||
| User Product is transferred to the recipient in perpetuity or for a | ||||
| fixed term (regardless of how the transaction is characterized), the | ||||
| Corresponding Source conveyed under this section must be accompanied | ||||
| by the Installation Information.  But this requirement does not apply | ||||
| if neither you nor any third party retains the ability to install | ||||
| modified object code on the User Product (for example, the work has | ||||
| been installed in ROM). | ||||
|  | ||||
|   The requirement to provide Installation Information does not include a | ||||
| requirement to continue to provide support service, warranty, or updates | ||||
| for a work that has been modified or installed by the recipient, or for | ||||
| the User Product in which it has been modified or installed.  Access to a | ||||
| network may be denied when the modification itself materially and | ||||
| adversely affects the operation of the network or violates the rules and | ||||
| protocols for communication across the network. | ||||
|  | ||||
|   Corresponding Source conveyed, and Installation Information provided, | ||||
| in accord with this section must be in a format that is publicly | ||||
| documented (and with an implementation available to the public in | ||||
| source code form), and must require no special password or key for | ||||
| unpacking, reading or copying. | ||||
|  | ||||
|   7. Additional Terms. | ||||
|  | ||||
|   "Additional permissions" are terms that supplement the terms of this | ||||
| License by making exceptions from one or more of its conditions. | ||||
| Additional permissions that are applicable to the entire Program shall | ||||
| be treated as though they were included in this License, to the extent | ||||
| that they are valid under applicable law.  If additional permissions | ||||
| apply only to part of the Program, that part may be used separately | ||||
| under those permissions, but the entire Program remains governed by | ||||
| this License without regard to the additional permissions. | ||||
|  | ||||
|   When you convey a copy of a covered work, you may at your option | ||||
| remove any additional permissions from that copy, or from any part of | ||||
| it.  (Additional permissions may be written to require their own | ||||
| removal in certain cases when you modify the work.)  You may place | ||||
| additional permissions on material, added by you to a covered work, | ||||
| for which you have or can give appropriate copyright permission. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, for material you | ||||
| add to a covered work, you may (if authorized by the copyright holders of | ||||
| that material) supplement the terms of this License with terms: | ||||
|  | ||||
|     a) Disclaiming warranty or limiting liability differently from the | ||||
|     terms of sections 15 and 16 of this License; or | ||||
|  | ||||
|     b) Requiring preservation of specified reasonable legal notices or | ||||
|     author attributions in that material or in the Appropriate Legal | ||||
|     Notices displayed by works containing it; or | ||||
|  | ||||
|     c) Prohibiting misrepresentation of the origin of that material, or | ||||
|     requiring that modified versions of such material be marked in | ||||
|     reasonable ways as different from the original version; or | ||||
|  | ||||
|     d) Limiting the use for publicity purposes of names of licensors or | ||||
|     authors of the material; or | ||||
|  | ||||
|     e) Declining to grant rights under trademark law for use of some | ||||
|     trade names, trademarks, or service marks; or | ||||
|  | ||||
|     f) Requiring indemnification of licensors and authors of that | ||||
|     material by anyone who conveys the material (or modified versions of | ||||
|     it) with contractual assumptions of liability to the recipient, for | ||||
|     any liability that these contractual assumptions directly impose on | ||||
|     those licensors and authors. | ||||
|  | ||||
|   All other non-permissive additional terms are considered "further | ||||
| restrictions" within the meaning of section 10.  If the Program as you | ||||
| received it, or any part of it, contains a notice stating that it is | ||||
| governed by this License along with a term that is a further | ||||
| restriction, you may remove that term.  If a license document contains | ||||
| a further restriction but permits relicensing or conveying under this | ||||
| License, you may add to a covered work material governed by the terms | ||||
| of that license document, provided that the further restriction does | ||||
| not survive such relicensing or conveying. | ||||
|  | ||||
|   If you add terms to a covered work in accord with this section, you | ||||
| must place, in the relevant source files, a statement of the | ||||
| additional terms that apply to those files, or a notice indicating | ||||
| where to find the applicable terms. | ||||
|  | ||||
|   Additional terms, permissive or non-permissive, may be stated in the | ||||
| form of a separately written license, or stated as exceptions; | ||||
| the above requirements apply either way. | ||||
|  | ||||
|   8. Termination. | ||||
|  | ||||
|   You may not propagate or modify a covered work except as expressly | ||||
| provided under this License.  Any attempt otherwise to propagate or | ||||
| modify it is void, and will automatically terminate your rights under | ||||
| this License (including any patent licenses granted under the third | ||||
| paragraph of section 11). | ||||
|  | ||||
|   However, if you cease all violation of this License, then your | ||||
| license from a particular copyright holder is reinstated (a) | ||||
| provisionally, unless and until the copyright holder explicitly and | ||||
| finally terminates your license, and (b) permanently, if the copyright | ||||
| holder fails to notify you of the violation by some reasonable means | ||||
| prior to 60 days after the cessation. | ||||
|  | ||||
|   Moreover, your license from a particular copyright holder is | ||||
| reinstated permanently if the copyright holder notifies you of the | ||||
| violation by some reasonable means, this is the first time you have | ||||
| received notice of violation of this License (for any work) from that | ||||
| copyright holder, and you cure the violation prior to 30 days after | ||||
| your receipt of the notice. | ||||
|  | ||||
|   Termination of your rights under this section does not terminate the | ||||
| licenses of parties who have received copies or rights from you under | ||||
| this License.  If your rights have been terminated and not permanently | ||||
| reinstated, you do not qualify to receive new licenses for the same | ||||
| material under section 10. | ||||
|  | ||||
|   9. Acceptance Not Required for Having Copies. | ||||
|  | ||||
|   You are not required to accept this License in order to receive or | ||||
| run a copy of the Program.  Ancillary propagation of a covered work | ||||
| occurring solely as a consequence of using peer-to-peer transmission | ||||
| to receive a copy likewise does not require acceptance.  However, | ||||
| nothing other than this License grants you permission to propagate or | ||||
| modify any covered work.  These actions infringe copyright if you do | ||||
| not accept this License.  Therefore, by modifying or propagating a | ||||
| covered work, you indicate your acceptance of this License to do so. | ||||
|  | ||||
|   10. Automatic Licensing of Downstream Recipients. | ||||
|  | ||||
|   Each time you convey a covered work, the recipient automatically | ||||
| receives a license from the original licensors, to run, modify and | ||||
| propagate that work, subject to this License.  You are not responsible | ||||
| for enforcing compliance by third parties with this License. | ||||
|  | ||||
|   An "entity transaction" is a transaction transferring control of an | ||||
| organization, or substantially all assets of one, or subdividing an | ||||
| organization, or merging organizations.  If propagation of a covered | ||||
| work results from an entity transaction, each party to that | ||||
| transaction who receives a copy of the work also receives whatever | ||||
| licenses to the work the party's predecessor in interest had or could | ||||
| give under the previous paragraph, plus a right to possession of the | ||||
| Corresponding Source of the work from the predecessor in interest, if | ||||
| the predecessor has it or can get it with reasonable efforts. | ||||
|  | ||||
|   You may not impose any further restrictions on the exercise of the | ||||
| rights granted or affirmed under this License.  For example, you may | ||||
| not impose a license fee, royalty, or other charge for exercise of | ||||
| rights granted under this License, and you may not initiate litigation | ||||
| (including a cross-claim or counterclaim in a lawsuit) alleging that | ||||
| any patent claim is infringed by making, using, selling, offering for | ||||
| sale, or importing the Program or any portion of it. | ||||
|  | ||||
|   11. Patents. | ||||
|  | ||||
|   A "contributor" is a copyright holder who authorizes use under this | ||||
| License of the Program or a work on which the Program is based.  The | ||||
| work thus licensed is called the contributor's "contributor version". | ||||
|  | ||||
|   A contributor's "essential patent claims" are all patent claims | ||||
| owned or controlled by the contributor, whether already acquired or | ||||
| hereafter acquired, that would be infringed by some manner, permitted | ||||
| by this License, of making, using, or selling its contributor version, | ||||
| but do not include claims that would be infringed only as a | ||||
| consequence of further modification of the contributor version.  For | ||||
| purposes of this definition, "control" includes the right to grant | ||||
| patent sublicenses in a manner consistent with the requirements of | ||||
| this License. | ||||
|  | ||||
|   Each contributor grants you a non-exclusive, worldwide, royalty-free | ||||
| patent license under the contributor's essential patent claims, to | ||||
| make, use, sell, offer for sale, import and otherwise run, modify and | ||||
| propagate the contents of its contributor version. | ||||
|  | ||||
|   In the following three paragraphs, a "patent license" is any express | ||||
| agreement or commitment, however denominated, not to enforce a patent | ||||
| (such as an express permission to practice a patent or covenant not to | ||||
| sue for patent infringement).  To "grant" such a patent license to a | ||||
| party means to make such an agreement or commitment not to enforce a | ||||
| patent against the party. | ||||
|  | ||||
|   If you convey a covered work, knowingly relying on a patent license, | ||||
| and the Corresponding Source of the work is not available for anyone | ||||
| to copy, free of charge and under the terms of this License, through a | ||||
| publicly available network server or other readily accessible means, | ||||
| then you must either (1) cause the Corresponding Source to be so | ||||
| available, or (2) arrange to deprive yourself of the benefit of the | ||||
| patent license for this particular work, or (3) arrange, in a manner | ||||
| consistent with the requirements of this License, to extend the patent | ||||
| license to downstream recipients.  "Knowingly relying" means you have | ||||
| actual knowledge that, but for the patent license, your conveying the | ||||
| covered work in a country, or your recipient's use of the covered work | ||||
| in a country, would infringe one or more identifiable patents in that | ||||
| country that you have reason to believe are valid. | ||||
|  | ||||
|   If, pursuant to or in connection with a single transaction or | ||||
| arrangement, you convey, or propagate by procuring conveyance of, a | ||||
| covered work, and grant a patent license to some of the parties | ||||
| receiving the covered work authorizing them to use, propagate, modify | ||||
| or convey a specific copy of the covered work, then the patent license | ||||
| you grant is automatically extended to all recipients of the covered | ||||
| work and works based on it. | ||||
|  | ||||
|   A patent license is "discriminatory" if it does not include within | ||||
| the scope of its coverage, prohibits the exercise of, or is | ||||
| conditioned on the non-exercise of one or more of the rights that are | ||||
| specifically granted under this License.  You may not convey a covered | ||||
| work if you are a party to an arrangement with a third party that is | ||||
| in the business of distributing software, under which you make payment | ||||
| to the third party based on the extent of your activity of conveying | ||||
| the work, and under which the third party grants, to any of the | ||||
| parties who would receive the covered work from you, a discriminatory | ||||
| patent license (a) in connection with copies of the covered work | ||||
| conveyed by you (or copies made from those copies), or (b) primarily | ||||
| for and in connection with specific products or compilations that | ||||
| contain the covered work, unless you entered into that arrangement, | ||||
| or that patent license was granted, prior to 28 March 2007. | ||||
|  | ||||
|   Nothing in this License shall be construed as excluding or limiting | ||||
| any implied license or other defenses to infringement that may | ||||
| otherwise be available to you under applicable patent law. | ||||
|  | ||||
|   12. No Surrender of Others' Freedom. | ||||
|  | ||||
|   If conditions are imposed on you (whether by court order, agreement or | ||||
| otherwise) that contradict the conditions of this License, they do not | ||||
| excuse you from the conditions of this License.  If you cannot convey a | ||||
| covered work so as to satisfy simultaneously your obligations under this | ||||
| License and any other pertinent obligations, then as a consequence you may | ||||
| not convey it at all.  For example, if you agree to terms that obligate you | ||||
| to collect a royalty for further conveying from those to whom you convey | ||||
| the Program, the only way you could satisfy both those terms and this | ||||
| License would be to refrain entirely from conveying the Program. | ||||
|  | ||||
|   13. Remote Network Interaction; Use with the GNU General Public License. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, if you modify the | ||||
| Program, your modified version must prominently offer all users | ||||
| interacting with it remotely through a computer network (if your version | ||||
| supports such interaction) an opportunity to receive the Corresponding | ||||
| Source of your version by providing access to the Corresponding Source | ||||
| from a network server at no charge, through some standard or customary | ||||
| means of facilitating copying of software.  This Corresponding Source | ||||
| shall include the Corresponding Source for any work covered by version 3 | ||||
| of the GNU General Public License that is incorporated pursuant to the | ||||
| following paragraph. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, you have | ||||
| permission to link or combine any covered work with a work licensed | ||||
| under version 3 of the GNU General Public License into a single | ||||
| combined work, and to convey the resulting work.  The terms of this | ||||
| License will continue to apply to the part which is the covered work, | ||||
| but the work with which it is combined will remain governed by version | ||||
| 3 of the GNU General Public License. | ||||
|  | ||||
|   14. Revised Versions of this License. | ||||
|  | ||||
|   The Free Software Foundation may publish revised and/or new versions of | ||||
| the GNU Affero General Public License from time to time.  Such new versions | ||||
| will be similar in spirit to the present version, but may differ in detail to | ||||
| address new problems or concerns. | ||||
|  | ||||
|   Each version is given a distinguishing version number.  If the | ||||
| Program specifies that a certain numbered version of the GNU Affero General | ||||
| Public License "or any later version" applies to it, you have the | ||||
| option of following the terms and conditions either of that numbered | ||||
| version or of any later version published by the Free Software | ||||
| Foundation.  If the Program does not specify a version number of the | ||||
| GNU Affero General Public License, you may choose any version ever published | ||||
| by the Free Software Foundation. | ||||
|  | ||||
|   If the Program specifies that a proxy can decide which future | ||||
| versions of the GNU Affero General Public License can be used, that proxy's | ||||
| public statement of acceptance of a version permanently authorizes you | ||||
| to choose that version for the Program. | ||||
|  | ||||
|   Later license versions may give you additional or different | ||||
| permissions.  However, no additional obligations are imposed on any | ||||
| author or copyright holder as a result of your choosing to follow a | ||||
| later version. | ||||
|  | ||||
|   15. Disclaimer of Warranty. | ||||
|  | ||||
|   THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY | ||||
| APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT | ||||
| HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY | ||||
| OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, | ||||
| THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||||
| PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM | ||||
| IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF | ||||
| ALL NECESSARY SERVICING, REPAIR OR CORRECTION. | ||||
|  | ||||
|   16. Limitation of Liability. | ||||
|  | ||||
|   IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS | ||||
| THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY | ||||
| GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE | ||||
| USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF | ||||
| DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD | ||||
| PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), | ||||
| EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF | ||||
| SUCH DAMAGES. | ||||
|  | ||||
|   17. Interpretation of Sections 15 and 16. | ||||
|  | ||||
|   If the disclaimer of warranty and limitation of liability provided | ||||
| above cannot be given local legal effect according to their terms, | ||||
| reviewing courts shall apply local law that most closely approximates | ||||
| an absolute waiver of all civil liability in connection with the | ||||
| Program, unless a warranty or assumption of liability accompanies a | ||||
| copy of the Program in return for a fee. | ||||
|  | ||||
|                      END OF TERMS AND CONDITIONS | ||||
|  | ||||
|             How to Apply These Terms to Your New Programs | ||||
|  | ||||
|   If you develop a new program, and you want it to be of the greatest | ||||
| possible use to the public, the best way to achieve this is to make it | ||||
| free software which everyone can redistribute and change under these terms. | ||||
|  | ||||
|   To do so, attach the following notices to the program.  It is safest | ||||
| to attach them to the start of each source file to most effectively | ||||
| state the exclusion of warranty; and each file should have at least | ||||
| the "copyright" line and a pointer to where the full notice is found. | ||||
|  | ||||
|     <one line to give the program's name and a brief idea of what it does.> | ||||
|     Copyright (C) <year>  <name of author> | ||||
|  | ||||
|     This program is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU Affero General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
|  | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU Affero General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU Affero General Public License | ||||
|     along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  | ||||
| Also add information on how to contact you by electronic and paper mail. | ||||
|  | ||||
|   If your software can interact with users remotely through a computer | ||||
| network, you should also make sure that it provides a way for users to | ||||
| get its source.  For example, if your program is a web application, its | ||||
| interface could display a "Source" link that leads users to an archive | ||||
| of the code.  There are many ways you could offer source, and different | ||||
| solutions will be better for different programs; see section 13 for the | ||||
| specific requirements. | ||||
|  | ||||
|   You should also get your employer (if you work as a programmer) or school, | ||||
| if any, to sign a "copyright disclaimer" for the program, if necessary. | ||||
| For more information on this, and how to apply and follow the GNU AGPL, see | ||||
| <http://www.gnu.org/licenses/>. | ||||
							
								
								
									
										288
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/config.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										288
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/config.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,288 @@ | ||||
| // Copyright (C) 2010, Kyle Lemons <kyle@kylelemons.net>.  All rights reserved. | ||||
|  | ||||
| package log4go | ||||
|  | ||||
| import ( | ||||
| 	"encoding/xml" | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"os" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| type xmlProperty struct { | ||||
| 	Name  string `xml:"name,attr"` | ||||
| 	Value string `xml:",chardata"` | ||||
| } | ||||
|  | ||||
| type xmlFilter struct { | ||||
| 	Enabled  string        `xml:"enabled,attr"` | ||||
| 	Tag      string        `xml:"tag"` | ||||
| 	Level    string        `xml:"level"` | ||||
| 	Type     string        `xml:"type"` | ||||
| 	Property []xmlProperty `xml:"property"` | ||||
| } | ||||
|  | ||||
| type xmlLoggerConfig struct { | ||||
| 	Filter []xmlFilter `xml:"filter"` | ||||
| } | ||||
|  | ||||
| // Load XML configuration; see examples/example.xml for documentation | ||||
| func (log Logger) LoadConfiguration(filename string) { | ||||
| 	log.Close() | ||||
|  | ||||
| 	// Open the configuration file | ||||
| 	fd, err := os.Open(filename) | ||||
| 	if err != nil { | ||||
| 		fmt.Fprintf(os.Stderr, "LoadConfiguration: Error: Could not open %q for reading: %s\n", filename, err) | ||||
| 		os.Exit(1) | ||||
| 	} | ||||
|  | ||||
| 	contents, err := ioutil.ReadAll(fd) | ||||
| 	if err != nil { | ||||
| 		fmt.Fprintf(os.Stderr, "LoadConfiguration: Error: Could not read %q: %s\n", filename, err) | ||||
| 		os.Exit(1) | ||||
| 	} | ||||
|  | ||||
| 	xc := new(xmlLoggerConfig) | ||||
| 	if err := xml.Unmarshal(contents, xc); err != nil { | ||||
| 		fmt.Fprintf(os.Stderr, "LoadConfiguration: Error: Could not parse XML configuration in %q: %s\n", filename, err) | ||||
| 		os.Exit(1) | ||||
| 	} | ||||
|  | ||||
| 	for _, xmlfilt := range xc.Filter { | ||||
| 		var filt LogWriter | ||||
| 		var lvl Level | ||||
| 		bad, good, enabled := false, true, false | ||||
|  | ||||
| 		// Check required children | ||||
| 		if len(xmlfilt.Enabled) == 0 { | ||||
| 			fmt.Fprintf(os.Stderr, "LoadConfiguration: Error: Required attribute %s for filter missing in %s\n", "enabled", filename) | ||||
| 			bad = true | ||||
| 		} else { | ||||
| 			enabled = xmlfilt.Enabled != "false" | ||||
| 		} | ||||
| 		if len(xmlfilt.Tag) == 0 { | ||||
| 			fmt.Fprintf(os.Stderr, "LoadConfiguration: Error: Required child <%s> for filter missing in %s\n", "tag", filename) | ||||
| 			bad = true | ||||
| 		} | ||||
| 		if len(xmlfilt.Type) == 0 { | ||||
| 			fmt.Fprintf(os.Stderr, "LoadConfiguration: Error: Required child <%s> for filter missing in %s\n", "type", filename) | ||||
| 			bad = true | ||||
| 		} | ||||
| 		if len(xmlfilt.Level) == 0 { | ||||
| 			fmt.Fprintf(os.Stderr, "LoadConfiguration: Error: Required child <%s> for filter missing in %s\n", "level", filename) | ||||
| 			bad = true | ||||
| 		} | ||||
|  | ||||
| 		switch xmlfilt.Level { | ||||
| 		case "FINEST": | ||||
| 			lvl = FINEST | ||||
| 		case "FINE": | ||||
| 			lvl = FINE | ||||
| 		case "DEBUG": | ||||
| 			lvl = DEBUG | ||||
| 		case "TRACE": | ||||
| 			lvl = TRACE | ||||
| 		case "INFO": | ||||
| 			lvl = INFO | ||||
| 		case "WARNING": | ||||
| 			lvl = WARNING | ||||
| 		case "ERROR": | ||||
| 			lvl = ERROR | ||||
| 		case "CRITICAL": | ||||
| 			lvl = CRITICAL | ||||
| 		default: | ||||
| 			fmt.Fprintf(os.Stderr, "LoadConfiguration: Error: Required child <%s> for filter has unknown value in %s: %s\n", "level", filename, xmlfilt.Level) | ||||
| 			bad = true | ||||
| 		} | ||||
|  | ||||
| 		// Just so all of the required attributes are errored at the same time if missing | ||||
| 		if bad { | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
|  | ||||
| 		switch xmlfilt.Type { | ||||
| 		case "console": | ||||
| 			filt, good = xmlToConsoleLogWriter(filename, xmlfilt.Property, enabled) | ||||
| 		case "file": | ||||
| 			filt, good = xmlToFileLogWriter(filename, xmlfilt.Property, enabled) | ||||
| 		case "xml": | ||||
| 			filt, good = xmlToXMLLogWriter(filename, xmlfilt.Property, enabled) | ||||
| 		case "socket": | ||||
| 			filt, good = xmlToSocketLogWriter(filename, xmlfilt.Property, enabled) | ||||
| 		default: | ||||
| 			fmt.Fprintf(os.Stderr, "LoadConfiguration: Error: Could not load XML configuration in %s: unknown filter type \"%s\"\n", filename, xmlfilt.Type) | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
|  | ||||
| 		// Just so all of the required params are errored at the same time if wrong | ||||
| 		if !good { | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
|  | ||||
| 		// If we're disabled (syntax and correctness checks only), don't add to logger | ||||
| 		if !enabled { | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		log[xmlfilt.Tag] = &Filter{lvl, filt} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func xmlToConsoleLogWriter(filename string, props []xmlProperty, enabled bool) (*ConsoleLogWriter, bool) { | ||||
| 	// Parse properties | ||||
| 	for _, prop := range props { | ||||
| 		switch prop.Name { | ||||
| 		default: | ||||
| 			fmt.Fprintf(os.Stderr, "LoadConfiguration: Warning: Unknown property \"%s\" for console filter in %s\n", prop.Name, filename) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// If it's disabled, we're just checking syntax | ||||
| 	if !enabled { | ||||
| 		return nil, true | ||||
| 	} | ||||
|  | ||||
| 	return NewConsoleLogWriter(), true | ||||
| } | ||||
|  | ||||
| // Parse a number with K/M/G suffixes based on thousands (1000) or 2^10 (1024) | ||||
| func strToNumSuffix(str string, mult int) int { | ||||
| 	num := 1 | ||||
| 	if len(str) > 1 { | ||||
| 		switch str[len(str)-1] { | ||||
| 		case 'G', 'g': | ||||
| 			num *= mult | ||||
| 			fallthrough | ||||
| 		case 'M', 'm': | ||||
| 			num *= mult | ||||
| 			fallthrough | ||||
| 		case 'K', 'k': | ||||
| 			num *= mult | ||||
| 			str = str[0 : len(str)-1] | ||||
| 		} | ||||
| 	} | ||||
| 	parsed, _ := strconv.Atoi(str) | ||||
| 	return parsed * num | ||||
| } | ||||
| func xmlToFileLogWriter(filename string, props []xmlProperty, enabled bool) (*FileLogWriter, bool) { | ||||
| 	file := "" | ||||
| 	format := "[%D %T] [%L] (%S) %M" | ||||
| 	maxlines := 0 | ||||
| 	maxsize := 0 | ||||
| 	daily := false | ||||
| 	rotate := false | ||||
|  | ||||
| 	// Parse properties | ||||
| 	for _, prop := range props { | ||||
| 		switch prop.Name { | ||||
| 		case "filename": | ||||
| 			file = strings.Trim(prop.Value, " \r\n") | ||||
| 		case "format": | ||||
| 			format = strings.Trim(prop.Value, " \r\n") | ||||
| 		case "maxlines": | ||||
| 			maxlines = strToNumSuffix(strings.Trim(prop.Value, " \r\n"), 1000) | ||||
| 		case "maxsize": | ||||
| 			maxsize = strToNumSuffix(strings.Trim(prop.Value, " \r\n"), 1024) | ||||
| 		case "daily": | ||||
| 			daily = strings.Trim(prop.Value, " \r\n") != "false" | ||||
| 		case "rotate": | ||||
| 			rotate = strings.Trim(prop.Value, " \r\n") != "false" | ||||
| 		default: | ||||
| 			fmt.Fprintf(os.Stderr, "LoadConfiguration: Warning: Unknown property \"%s\" for file filter in %s\n", prop.Name, filename) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Check properties | ||||
| 	if len(file) == 0 { | ||||
| 		fmt.Fprintf(os.Stderr, "LoadConfiguration: Error: Required property \"%s\" for file filter missing in %s\n", "filename", filename) | ||||
| 		return nil, false | ||||
| 	} | ||||
|  | ||||
| 	// If it's disabled, we're just checking syntax | ||||
| 	if !enabled { | ||||
| 		return nil, true | ||||
| 	} | ||||
|  | ||||
| 	flw := NewFileLogWriter(file, rotate) | ||||
| 	flw.SetFormat(format) | ||||
| 	flw.SetRotateLines(maxlines) | ||||
| 	flw.SetRotateSize(maxsize) | ||||
| 	flw.SetRotateDaily(daily) | ||||
| 	return flw, true | ||||
| } | ||||
|  | ||||
| func xmlToXMLLogWriter(filename string, props []xmlProperty, enabled bool) (*FileLogWriter, bool) { | ||||
| 	file := "" | ||||
| 	maxrecords := 0 | ||||
| 	maxsize := 0 | ||||
| 	daily := false | ||||
| 	rotate := false | ||||
|  | ||||
| 	// Parse properties | ||||
| 	for _, prop := range props { | ||||
| 		switch prop.Name { | ||||
| 		case "filename": | ||||
| 			file = strings.Trim(prop.Value, " \r\n") | ||||
| 		case "maxrecords": | ||||
| 			maxrecords = strToNumSuffix(strings.Trim(prop.Value, " \r\n"), 1000) | ||||
| 		case "maxsize": | ||||
| 			maxsize = strToNumSuffix(strings.Trim(prop.Value, " \r\n"), 1024) | ||||
| 		case "daily": | ||||
| 			daily = strings.Trim(prop.Value, " \r\n") != "false" | ||||
| 		case "rotate": | ||||
| 			rotate = strings.Trim(prop.Value, " \r\n") != "false" | ||||
| 		default: | ||||
| 			fmt.Fprintf(os.Stderr, "LoadConfiguration: Warning: Unknown property \"%s\" for xml filter in %s\n", prop.Name, filename) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Check properties | ||||
| 	if len(file) == 0 { | ||||
| 		fmt.Fprintf(os.Stderr, "LoadConfiguration: Error: Required property \"%s\" for xml filter missing in %s\n", "filename", filename) | ||||
| 		return nil, false | ||||
| 	} | ||||
|  | ||||
| 	// If it's disabled, we're just checking syntax | ||||
| 	if !enabled { | ||||
| 		return nil, true | ||||
| 	} | ||||
|  | ||||
| 	xlw := NewXMLLogWriter(file, rotate) | ||||
| 	xlw.SetRotateLines(maxrecords) | ||||
| 	xlw.SetRotateSize(maxsize) | ||||
| 	xlw.SetRotateDaily(daily) | ||||
| 	return xlw, true | ||||
| } | ||||
|  | ||||
| func xmlToSocketLogWriter(filename string, props []xmlProperty, enabled bool) (SocketLogWriter, bool) { | ||||
| 	endpoint := "" | ||||
| 	protocol := "udp" | ||||
|  | ||||
| 	// Parse properties | ||||
| 	for _, prop := range props { | ||||
| 		switch prop.Name { | ||||
| 		case "endpoint": | ||||
| 			endpoint = strings.Trim(prop.Value, " \r\n") | ||||
| 		case "protocol": | ||||
| 			protocol = strings.Trim(prop.Value, " \r\n") | ||||
| 		default: | ||||
| 			fmt.Fprintf(os.Stderr, "LoadConfiguration: Warning: Unknown property \"%s\" for file filter in %s\n", prop.Name, filename) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Check properties | ||||
| 	if len(endpoint) == 0 { | ||||
| 		fmt.Fprintf(os.Stderr, "LoadConfiguration: Error: Required property \"%s\" for file filter missing in %s\n", "endpoint", filename) | ||||
| 		return nil, false | ||||
| 	} | ||||
|  | ||||
| 	// If it's disabled, we're just checking syntax | ||||
| 	if !enabled { | ||||
| 		return nil, true | ||||
| 	} | ||||
|  | ||||
| 	return NewSocketLogWriter(protocol, endpoint), true | ||||
| } | ||||
							
								
								
									
										14
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/examples/ConsoleLogWriter_Manual.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/examples/ConsoleLogWriter_Manual.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| import l4g "code.google.com/p/log4go" | ||||
|  | ||||
| func main() { | ||||
| 	log := l4g.NewLogger() | ||||
| 	defer log.Close() | ||||
| 	log.AddFilter("stdout", l4g.DEBUG, l4g.NewConsoleLogWriter()) | ||||
| 	log.Info("The time is now: %s", time.Now().Format("15:04:05 MST 2006/01/02")) | ||||
| } | ||||
							
								
								
									
										57
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/examples/FileLogWriter_Manual.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/examples/FileLogWriter_Manual.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"bufio" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"os" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| import l4g "code.google.com/p/log4go" | ||||
|  | ||||
| const ( | ||||
| 	filename = "flw.log" | ||||
| ) | ||||
|  | ||||
| func main() { | ||||
| 	// Get a new logger instance | ||||
| 	log := l4g.NewLogger() | ||||
|  | ||||
| 	// Create a default logger that is logging messages of FINE or higher | ||||
| 	log.AddFilter("file", l4g.FINE, l4g.NewFileLogWriter(filename, false)) | ||||
| 	log.Close() | ||||
|  | ||||
| 	/* Can also specify manually via the following: (these are the defaults) */ | ||||
| 	flw := l4g.NewFileLogWriter(filename, false) | ||||
| 	flw.SetFormat("[%D %T] [%L] (%S) %M") | ||||
| 	flw.SetRotate(false) | ||||
| 	flw.SetRotateSize(0) | ||||
| 	flw.SetRotateLines(0) | ||||
| 	flw.SetRotateDaily(false) | ||||
| 	log.AddFilter("file", l4g.FINE, flw) | ||||
|  | ||||
| 	// Log some experimental messages | ||||
| 	log.Finest("Everything is created now (notice that I will not be printing to the file)") | ||||
| 	log.Info("The time is now: %s", time.Now().Format("15:04:05 MST 2006/01/02")) | ||||
| 	log.Critical("Time to close out!") | ||||
|  | ||||
| 	// Close the log | ||||
| 	log.Close() | ||||
|  | ||||
| 	// Print what was logged to the file (yes, I know I'm skipping error checking) | ||||
| 	fd, _ := os.Open(filename) | ||||
| 	in := bufio.NewReader(fd) | ||||
| 	fmt.Print("Messages logged to file were: (line numbers not included)\n") | ||||
| 	for lineno := 1; ; lineno++ { | ||||
| 		line, err := in.ReadString('\n') | ||||
| 		if err == io.EOF { | ||||
| 			break | ||||
| 		} | ||||
| 		fmt.Printf("%3d:\t%s", lineno, line) | ||||
| 	} | ||||
| 	fd.Close() | ||||
|  | ||||
| 	// Remove the file so it's not lying around | ||||
| 	os.Remove(filename) | ||||
| } | ||||
							
								
								
									
										42
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/examples/SimpleNetLogServer.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/examples/SimpleNetLogServer.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"flag" | ||||
| 	"fmt" | ||||
| 	"net" | ||||
| 	"os" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	port = flag.String("p", "12124", "Port number to listen on") | ||||
| ) | ||||
|  | ||||
| func e(err error) { | ||||
| 	if err != nil { | ||||
| 		fmt.Printf("Erroring out: %s\n", err) | ||||
| 		os.Exit(1) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func main() { | ||||
| 	flag.Parse() | ||||
|  | ||||
| 	// Bind to the port | ||||
| 	bind, err := net.ResolveUDPAddr("0.0.0.0:" + *port) | ||||
| 	e(err) | ||||
|  | ||||
| 	// Create listener | ||||
| 	listener, err := net.ListenUDP("udp", bind) | ||||
| 	e(err) | ||||
|  | ||||
| 	fmt.Printf("Listening to port %s...\n", *port) | ||||
| 	for { | ||||
| 		// read into a new buffer | ||||
| 		buffer := make([]byte, 1024) | ||||
| 		_, _, err := listener.ReadFrom(buffer) | ||||
| 		e(err) | ||||
|  | ||||
| 		// log to standard output | ||||
| 		fmt.Println(string(buffer)) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										18
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/examples/SocketLogWriter_Manual.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/examples/SocketLogWriter_Manual.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| import l4g "code.google.com/p/log4go" | ||||
|  | ||||
| func main() { | ||||
| 	log := l4g.NewLogger() | ||||
| 	log.AddFilter("network", l4g.FINEST, l4g.NewSocketLogWriter("udp", "192.168.1.255:12124")) | ||||
|  | ||||
| 	// Run `nc -u -l -p 12124` or similar before you run this to see the following message | ||||
| 	log.Info("The time is now: %s", time.Now().Format("15:04:05 MST 2006/01/02")) | ||||
|  | ||||
| 	// This makes sure the output stream buffer is written | ||||
| 	log.Close() | ||||
| } | ||||
							
								
								
									
										13
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/examples/XMLConfigurationExample.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/examples/XMLConfigurationExample.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| package main | ||||
|  | ||||
| import l4g "code.google.com/p/log4go" | ||||
|  | ||||
| func main() { | ||||
| 	// Load the configuration (isn't this easy?) | ||||
| 	l4g.LoadConfiguration("example.xml") | ||||
|  | ||||
| 	// And now we're ready! | ||||
| 	l4g.Finest("This will only go to those of you really cool UDP kids!  If you change enabled=true.") | ||||
| 	l4g.Debug("Oh no!  %d + %d = %d!", 2, 2, 2+2) | ||||
| 	l4g.Info("About that time, eh chaps?") | ||||
| } | ||||
							
								
								
									
										264
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/filelog.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										264
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/filelog.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,264 @@ | ||||
| // Copyright (C) 2010, Kyle Lemons <kyle@kylelemons.net>.  All rights reserved. | ||||
|  | ||||
| package log4go | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| // This log writer sends output to a file | ||||
| type FileLogWriter struct { | ||||
| 	rec chan *LogRecord | ||||
| 	rot chan bool | ||||
|  | ||||
| 	// The opened file | ||||
| 	filename string | ||||
| 	file     *os.File | ||||
|  | ||||
| 	// The logging format | ||||
| 	format string | ||||
|  | ||||
| 	// File header/trailer | ||||
| 	header, trailer string | ||||
|  | ||||
| 	// Rotate at linecount | ||||
| 	maxlines          int | ||||
| 	maxlines_curlines int | ||||
|  | ||||
| 	// Rotate at size | ||||
| 	maxsize         int | ||||
| 	maxsize_cursize int | ||||
|  | ||||
| 	// Rotate daily | ||||
| 	daily          bool | ||||
| 	daily_opendate int | ||||
|  | ||||
| 	// Keep old logfiles (.001, .002, etc) | ||||
| 	rotate    bool | ||||
| 	maxbackup int | ||||
| } | ||||
|  | ||||
| // This is the FileLogWriter's output method | ||||
| func (w *FileLogWriter) LogWrite(rec *LogRecord) { | ||||
| 	w.rec <- rec | ||||
| } | ||||
|  | ||||
| func (w *FileLogWriter) Close() { | ||||
| 	close(w.rec) | ||||
| 	w.file.Sync() | ||||
| } | ||||
|  | ||||
| // NewFileLogWriter creates a new LogWriter which writes to the given file and | ||||
| // has rotation enabled if rotate is true. | ||||
| // | ||||
| // If rotate is true, any time a new log file is opened, the old one is renamed | ||||
| // with a .### extension to preserve it.  The various Set* methods can be used | ||||
| // to configure log rotation based on lines, size, and daily. | ||||
| // | ||||
| // The standard log-line format is: | ||||
| //   [%D %T] [%L] (%S) %M | ||||
| func NewFileLogWriter(fname string, rotate bool) *FileLogWriter { | ||||
| 	w := &FileLogWriter{ | ||||
| 		rec:       make(chan *LogRecord, LogBufferLength), | ||||
| 		rot:       make(chan bool), | ||||
| 		filename:  fname, | ||||
| 		format:    "[%D %T] [%L] (%S) %M", | ||||
| 		rotate:    rotate, | ||||
| 		maxbackup: 999, | ||||
| 	} | ||||
|  | ||||
| 	// open the file for the first time | ||||
| 	if err := w.intRotate(); err != nil { | ||||
| 		fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.filename, err) | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	go func() { | ||||
| 		defer func() { | ||||
| 			if w.file != nil { | ||||
| 				fmt.Fprint(w.file, FormatLogRecord(w.trailer, &LogRecord{Created: time.Now()})) | ||||
| 				w.file.Close() | ||||
| 			} | ||||
| 		}() | ||||
|  | ||||
| 		for { | ||||
| 			select { | ||||
| 			case <-w.rot: | ||||
| 				if err := w.intRotate(); err != nil { | ||||
| 					fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.filename, err) | ||||
| 					return | ||||
| 				} | ||||
| 			case rec, ok := <-w.rec: | ||||
| 				if !ok { | ||||
| 					return | ||||
| 				} | ||||
| 				now := time.Now() | ||||
| 				if (w.maxlines > 0 && w.maxlines_curlines >= w.maxlines) || | ||||
| 					(w.maxsize > 0 && w.maxsize_cursize >= w.maxsize) || | ||||
| 					(w.daily && now.Day() != w.daily_opendate) { | ||||
| 					if err := w.intRotate(); err != nil { | ||||
| 						fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.filename, err) | ||||
| 						return | ||||
| 					} | ||||
| 				} | ||||
|  | ||||
| 				// Perform the write | ||||
| 				n, err := fmt.Fprint(w.file, FormatLogRecord(w.format, rec)) | ||||
| 				if err != nil { | ||||
| 					fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.filename, err) | ||||
| 					return | ||||
| 				} | ||||
|  | ||||
| 				// Update the counts | ||||
| 				w.maxlines_curlines++ | ||||
| 				w.maxsize_cursize += n | ||||
| 			} | ||||
| 		} | ||||
| 	}() | ||||
|  | ||||
| 	return w | ||||
| } | ||||
|  | ||||
| // Request that the logs rotate | ||||
| func (w *FileLogWriter) Rotate() { | ||||
| 	w.rot <- true | ||||
| } | ||||
|  | ||||
| // If this is called in a threaded context, it MUST be synchronized | ||||
| func (w *FileLogWriter) intRotate() error { | ||||
| 	// Close any log file that may be open | ||||
| 	if w.file != nil { | ||||
| 		fmt.Fprint(w.file, FormatLogRecord(w.trailer, &LogRecord{Created: time.Now()})) | ||||
| 		w.file.Close() | ||||
| 	} | ||||
|  | ||||
| 	// If we are keeping log files, move it to the next available number | ||||
| 	if w.rotate { | ||||
| 		_, err := os.Lstat(w.filename) | ||||
| 		if err == nil { // file exists | ||||
| 			// Find the next available number | ||||
| 			num := 1 | ||||
| 			fname := "" | ||||
| 			if w.daily && time.Now().Day() != w.daily_opendate { | ||||
| 				yesterday := time.Now().AddDate(0, 0, -1).Format("2006-01-02") | ||||
|  | ||||
| 				for ; err == nil && num <= 999; num++ { | ||||
| 					fname = w.filename + fmt.Sprintf(".%s.%03d", yesterday, num) | ||||
| 					_, err = os.Lstat(fname) | ||||
| 				} | ||||
| 				// return error if the last file checked still existed | ||||
| 				if err == nil { | ||||
| 					return fmt.Errorf("Rotate: Cannot find free log number to rename %s\n", w.filename) | ||||
| 				} | ||||
| 			} else { | ||||
| 				num = w.maxbackup - 1 | ||||
| 				for ; num >= 1; num-- { | ||||
| 					fname = w.filename + fmt.Sprintf(".%d", num) | ||||
| 					nfname := w.filename + fmt.Sprintf(".%d", num+1) | ||||
| 					_, err = os.Lstat(fname) | ||||
| 					if err == nil { | ||||
| 						os.Rename(fname, nfname) | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			w.file.Close() | ||||
| 			// Rename the file to its newfound home | ||||
| 			err = os.Rename(w.filename, fname) | ||||
| 			if err != nil { | ||||
| 				return fmt.Errorf("Rotate: %s\n", err) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Open the log file | ||||
| 	fd, err := os.OpenFile(w.filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0660) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	w.file = fd | ||||
|  | ||||
| 	now := time.Now() | ||||
| 	fmt.Fprint(w.file, FormatLogRecord(w.header, &LogRecord{Created: now})) | ||||
|  | ||||
| 	// Set the daily open date to the current date | ||||
| 	w.daily_opendate = now.Day() | ||||
|  | ||||
| 	// initialize rotation values | ||||
| 	w.maxlines_curlines = 0 | ||||
| 	w.maxsize_cursize = 0 | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Set the logging format (chainable).  Must be called before the first log | ||||
| // message is written. | ||||
| func (w *FileLogWriter) SetFormat(format string) *FileLogWriter { | ||||
| 	w.format = format | ||||
| 	return w | ||||
| } | ||||
|  | ||||
| // Set the logfile header and footer (chainable).  Must be called before the first log | ||||
| // message is written.  These are formatted similar to the FormatLogRecord (e.g. | ||||
| // you can use %D and %T in your header/footer for date and time). | ||||
| func (w *FileLogWriter) SetHeadFoot(head, foot string) *FileLogWriter { | ||||
| 	w.header, w.trailer = head, foot | ||||
| 	if w.maxlines_curlines == 0 { | ||||
| 		fmt.Fprint(w.file, FormatLogRecord(w.header, &LogRecord{Created: time.Now()})) | ||||
| 	} | ||||
| 	return w | ||||
| } | ||||
|  | ||||
| // Set rotate at linecount (chainable). Must be called before the first log | ||||
| // message is written. | ||||
| func (w *FileLogWriter) SetRotateLines(maxlines int) *FileLogWriter { | ||||
| 	//fmt.Fprintf(os.Stderr, "FileLogWriter.SetRotateLines: %v\n", maxlines) | ||||
| 	w.maxlines = maxlines | ||||
| 	return w | ||||
| } | ||||
|  | ||||
| // Set rotate at size (chainable). Must be called before the first log message | ||||
| // is written. | ||||
| func (w *FileLogWriter) SetRotateSize(maxsize int) *FileLogWriter { | ||||
| 	//fmt.Fprintf(os.Stderr, "FileLogWriter.SetRotateSize: %v\n", maxsize) | ||||
| 	w.maxsize = maxsize | ||||
| 	return w | ||||
| } | ||||
|  | ||||
| // Set rotate daily (chainable). Must be called before the first log message is | ||||
| // written. | ||||
| func (w *FileLogWriter) SetRotateDaily(daily bool) *FileLogWriter { | ||||
| 	//fmt.Fprintf(os.Stderr, "FileLogWriter.SetRotateDaily: %v\n", daily) | ||||
| 	w.daily = daily | ||||
| 	return w | ||||
| } | ||||
|  | ||||
| // Set max backup files. Must be called before the first log message | ||||
| // is written. | ||||
| func (w *FileLogWriter) SetRotateMaxBackup(maxbackup int) *FileLogWriter { | ||||
| 	w.maxbackup = maxbackup | ||||
| 	return w | ||||
| } | ||||
|  | ||||
| // SetRotate changes whether or not the old logs are kept. (chainable) Must be | ||||
| // called before the first log message is written.  If rotate is false, the | ||||
| // files are overwritten; otherwise, they are rotated to another file before the | ||||
| // new log is opened. | ||||
| func (w *FileLogWriter) SetRotate(rotate bool) *FileLogWriter { | ||||
| 	//fmt.Fprintf(os.Stderr, "FileLogWriter.SetRotate: %v\n", rotate) | ||||
| 	w.rotate = rotate | ||||
| 	return w | ||||
| } | ||||
|  | ||||
| // NewXMLLogWriter is a utility method for creating a FileLogWriter set up to | ||||
| // output XML record log messages instead of line-based ones. | ||||
| func NewXMLLogWriter(fname string, rotate bool) *FileLogWriter { | ||||
| 	return NewFileLogWriter(fname, rotate).SetFormat( | ||||
| 		`	<record level="%L"> | ||||
| 		<timestamp>%D %T</timestamp> | ||||
| 		<source>%S</source> | ||||
| 		<message>%M</message> | ||||
| 	</record>`).SetHeadFoot("<log created=\"%D %T\">", "</log>") | ||||
| } | ||||
							
								
								
									
										484
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/log4go.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										484
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/log4go.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,484 @@ | ||||
| // Copyright (C) 2010, Kyle Lemons <kyle@kylelemons.net>.  All rights reserved. | ||||
|  | ||||
| // Package log4go provides level-based and highly configurable logging. | ||||
| // | ||||
| // Enhanced Logging | ||||
| // | ||||
| // This is inspired by the logging functionality in Java.  Essentially, you create a Logger | ||||
| // object and create output filters for it.  You can send whatever you want to the Logger, | ||||
| // and it will filter that based on your settings and send it to the outputs.  This way, you | ||||
| // can put as much debug code in your program as you want, and when you're done you can filter | ||||
| // out the mundane messages so only the important ones show up. | ||||
| // | ||||
| // Utility functions are provided to make life easier. Here is some example code to get started: | ||||
| // | ||||
| // log := log4go.NewLogger() | ||||
| // log.AddFilter("stdout", log4go.DEBUG, log4go.NewConsoleLogWriter()) | ||||
| // log.AddFilter("log",    log4go.FINE,  log4go.NewFileLogWriter("example.log", true)) | ||||
| // log.Info("The time is now: %s", time.LocalTime().Format("15:04:05 MST 2006/01/02")) | ||||
| // | ||||
| // The first two lines can be combined with the utility NewDefaultLogger: | ||||
| // | ||||
| // log := log4go.NewDefaultLogger(log4go.DEBUG) | ||||
| // log.AddFilter("log",    log4go.FINE,  log4go.NewFileLogWriter("example.log", true)) | ||||
| // log.Info("The time is now: %s", time.LocalTime().Format("15:04:05 MST 2006/01/02")) | ||||
| // | ||||
| // Usage notes: | ||||
| // - The ConsoleLogWriter does not display the source of the message to standard | ||||
| //   output, but the FileLogWriter does. | ||||
| // - The utility functions (Info, Debug, Warn, etc) derive their source from the | ||||
| //   calling function, and this incurs extra overhead. | ||||
| // | ||||
| // Changes from 2.0: | ||||
| // - The external interface has remained mostly stable, but a lot of the | ||||
| //   internals have been changed, so if you depended on any of this or created | ||||
| //   your own LogWriter, then you will probably have to update your code.  In | ||||
| //   particular, Logger is now a map and ConsoleLogWriter is now a channel | ||||
| //   behind-the-scenes, and the LogWrite method no longer has return values. | ||||
| // | ||||
| // Future work: (please let me know if you think I should work on any of these particularly) | ||||
| // - Log file rotation | ||||
| // - Logging configuration files ala log4j | ||||
| // - Have the ability to remove filters? | ||||
| // - Have GetInfoChannel, GetDebugChannel, etc return a chan string that allows | ||||
| //   for another method of logging | ||||
| // - Add an XML filter type | ||||
| package log4go | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"runtime" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| // Version information | ||||
| const ( | ||||
| 	L4G_VERSION = "log4go-v3.0.1" | ||||
| 	L4G_MAJOR   = 3 | ||||
| 	L4G_MINOR   = 0 | ||||
| 	L4G_BUILD   = 1 | ||||
| ) | ||||
|  | ||||
| /****** Constants ******/ | ||||
|  | ||||
| // These are the integer logging levels used by the logger | ||||
| type Level int | ||||
|  | ||||
| const ( | ||||
| 	FINEST Level = iota | ||||
| 	FINE | ||||
| 	DEBUG | ||||
| 	TRACE | ||||
| 	INFO | ||||
| 	WARNING | ||||
| 	ERROR | ||||
| 	CRITICAL | ||||
| ) | ||||
|  | ||||
| // Logging level strings | ||||
| var ( | ||||
| 	levelStrings = [...]string{"FNST", "FINE", "DEBG", "TRAC", "INFO", "WARN", "EROR", "CRIT"} | ||||
| ) | ||||
|  | ||||
| func (l Level) String() string { | ||||
| 	if l < 0 || int(l) > len(levelStrings) { | ||||
| 		return "UNKNOWN" | ||||
| 	} | ||||
| 	return levelStrings[int(l)] | ||||
| } | ||||
|  | ||||
| /****** Variables ******/ | ||||
| var ( | ||||
| 	// LogBufferLength specifies how many log messages a particular log4go | ||||
| 	// logger can buffer at a time before writing them. | ||||
| 	LogBufferLength = 32 | ||||
| ) | ||||
|  | ||||
| /****** LogRecord ******/ | ||||
|  | ||||
| // A LogRecord contains all of the pertinent information for each message | ||||
| type LogRecord struct { | ||||
| 	Level   Level     // The log level | ||||
| 	Created time.Time // The time at which the log message was created (nanoseconds) | ||||
| 	Source  string    // The message source | ||||
| 	Message string    // The log message | ||||
| } | ||||
|  | ||||
| /****** LogWriter ******/ | ||||
|  | ||||
| // This is an interface for anything that should be able to write logs | ||||
| type LogWriter interface { | ||||
| 	// This will be called to log a LogRecord message. | ||||
| 	LogWrite(rec *LogRecord) | ||||
|  | ||||
| 	// This should clean up anything lingering about the LogWriter, as it is called before | ||||
| 	// the LogWriter is removed.  LogWrite should not be called after Close. | ||||
| 	Close() | ||||
| } | ||||
|  | ||||
| /****** Logger ******/ | ||||
|  | ||||
| // A Filter represents the log level below which no log records are written to | ||||
| // the associated LogWriter. | ||||
| type Filter struct { | ||||
| 	Level Level | ||||
| 	LogWriter | ||||
| } | ||||
|  | ||||
| // A Logger represents a collection of Filters through which log messages are | ||||
| // written. | ||||
| type Logger map[string]*Filter | ||||
|  | ||||
| // Create a new logger. | ||||
| // | ||||
| // DEPRECATED: Use make(Logger) instead. | ||||
| func NewLogger() Logger { | ||||
| 	os.Stderr.WriteString("warning: use of deprecated NewLogger\n") | ||||
| 	return make(Logger) | ||||
| } | ||||
|  | ||||
| // Create a new logger with a "stdout" filter configured to send log messages at | ||||
| // or above lvl to standard output. | ||||
| // | ||||
| // DEPRECATED: use NewDefaultLogger instead. | ||||
| func NewConsoleLogger(lvl Level) Logger { | ||||
| 	os.Stderr.WriteString("warning: use of deprecated NewConsoleLogger\n") | ||||
| 	return Logger{ | ||||
| 		"stdout": &Filter{lvl, NewConsoleLogWriter()}, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Create a new logger with a "stdout" filter configured to send log messages at | ||||
| // or above lvl to standard output. | ||||
| func NewDefaultLogger(lvl Level) Logger { | ||||
| 	return Logger{ | ||||
| 		"stdout": &Filter{lvl, NewConsoleLogWriter()}, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Closes all log writers in preparation for exiting the program or a | ||||
| // reconfiguration of logging.  Calling this is not really imperative, unless | ||||
| // you want to guarantee that all log messages are written.  Close removes | ||||
| // all filters (and thus all LogWriters) from the logger. | ||||
| func (log Logger) Close() { | ||||
| 	// Close all open loggers | ||||
| 	for name, filt := range log { | ||||
| 		filt.Close() | ||||
| 		delete(log, name) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Add a new LogWriter to the Logger which will only log messages at lvl or | ||||
| // higher.  This function should not be called from multiple goroutines. | ||||
| // Returns the logger for chaining. | ||||
| func (log Logger) AddFilter(name string, lvl Level, writer LogWriter) Logger { | ||||
| 	log[name] = &Filter{lvl, writer} | ||||
| 	return log | ||||
| } | ||||
|  | ||||
| /******* Logging *******/ | ||||
| // Send a formatted log message internally | ||||
| func (log Logger) intLogf(lvl Level, format string, args ...interface{}) { | ||||
| 	skip := true | ||||
|  | ||||
| 	// Determine if any logging will be done | ||||
| 	for _, filt := range log { | ||||
| 		if lvl >= filt.Level { | ||||
| 			skip = false | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 	if skip { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	// Determine caller func | ||||
| 	pc, _, lineno, ok := runtime.Caller(2) | ||||
| 	src := "" | ||||
| 	if ok { | ||||
| 		src = fmt.Sprintf("%s:%d", runtime.FuncForPC(pc).Name(), lineno) | ||||
| 	} | ||||
|  | ||||
| 	msg := format | ||||
| 	if len(args) > 0 { | ||||
| 		msg = fmt.Sprintf(format, args...) | ||||
| 	} | ||||
|  | ||||
| 	// Make the log record | ||||
| 	rec := &LogRecord{ | ||||
| 		Level:   lvl, | ||||
| 		Created: time.Now(), | ||||
| 		Source:  src, | ||||
| 		Message: msg, | ||||
| 	} | ||||
|  | ||||
| 	// Dispatch the logs | ||||
| 	for _, filt := range log { | ||||
| 		if lvl < filt.Level { | ||||
| 			continue | ||||
| 		} | ||||
| 		filt.LogWrite(rec) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Send a closure log message internally | ||||
| func (log Logger) intLogc(lvl Level, closure func() string) { | ||||
| 	skip := true | ||||
|  | ||||
| 	// Determine if any logging will be done | ||||
| 	for _, filt := range log { | ||||
| 		if lvl >= filt.Level { | ||||
| 			skip = false | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 	if skip { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	// Determine caller func | ||||
| 	pc, _, lineno, ok := runtime.Caller(2) | ||||
| 	src := "" | ||||
| 	if ok { | ||||
| 		src = fmt.Sprintf("%s:%d", runtime.FuncForPC(pc).Name(), lineno) | ||||
| 	} | ||||
|  | ||||
| 	// Make the log record | ||||
| 	rec := &LogRecord{ | ||||
| 		Level:   lvl, | ||||
| 		Created: time.Now(), | ||||
| 		Source:  src, | ||||
| 		Message: closure(), | ||||
| 	} | ||||
|  | ||||
| 	// Dispatch the logs | ||||
| 	for _, filt := range log { | ||||
| 		if lvl < filt.Level { | ||||
| 			continue | ||||
| 		} | ||||
| 		filt.LogWrite(rec) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Send a log message with manual level, source, and message. | ||||
| func (log Logger) Log(lvl Level, source, message string) { | ||||
| 	skip := true | ||||
|  | ||||
| 	// Determine if any logging will be done | ||||
| 	for _, filt := range log { | ||||
| 		if lvl >= filt.Level { | ||||
| 			skip = false | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 	if skip { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	// Make the log record | ||||
| 	rec := &LogRecord{ | ||||
| 		Level:   lvl, | ||||
| 		Created: time.Now(), | ||||
| 		Source:  source, | ||||
| 		Message: message, | ||||
| 	} | ||||
|  | ||||
| 	// Dispatch the logs | ||||
| 	for _, filt := range log { | ||||
| 		if lvl < filt.Level { | ||||
| 			continue | ||||
| 		} | ||||
| 		filt.LogWrite(rec) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Logf logs a formatted log message at the given log level, using the caller as | ||||
| // its source. | ||||
| func (log Logger) Logf(lvl Level, format string, args ...interface{}) { | ||||
| 	log.intLogf(lvl, format, args...) | ||||
| } | ||||
|  | ||||
| // Logc logs a string returned by the closure at the given log level, using the caller as | ||||
| // its source.  If no log message would be written, the closure is never called. | ||||
| func (log Logger) Logc(lvl Level, closure func() string) { | ||||
| 	log.intLogc(lvl, closure) | ||||
| } | ||||
|  | ||||
| // Finest logs a message at the finest log level. | ||||
| // See Debug for an explanation of the arguments. | ||||
| func (log Logger) Finest(arg0 interface{}, args ...interface{}) { | ||||
| 	const ( | ||||
| 		lvl = FINEST | ||||
| 	) | ||||
| 	switch first := arg0.(type) { | ||||
| 	case string: | ||||
| 		// Use the string as a format string | ||||
| 		log.intLogf(lvl, first, args...) | ||||
| 	case func() string: | ||||
| 		// Log the closure (no other arguments used) | ||||
| 		log.intLogc(lvl, first) | ||||
| 	default: | ||||
| 		// Build a format string so that it will be similar to Sprint | ||||
| 		log.intLogf(lvl, fmt.Sprint(arg0)+strings.Repeat(" %v", len(args)), args...) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Fine logs a message at the fine log level. | ||||
| // See Debug for an explanation of the arguments. | ||||
| func (log Logger) Fine(arg0 interface{}, args ...interface{}) { | ||||
| 	const ( | ||||
| 		lvl = FINE | ||||
| 	) | ||||
| 	switch first := arg0.(type) { | ||||
| 	case string: | ||||
| 		// Use the string as a format string | ||||
| 		log.intLogf(lvl, first, args...) | ||||
| 	case func() string: | ||||
| 		// Log the closure (no other arguments used) | ||||
| 		log.intLogc(lvl, first) | ||||
| 	default: | ||||
| 		// Build a format string so that it will be similar to Sprint | ||||
| 		log.intLogf(lvl, fmt.Sprint(arg0)+strings.Repeat(" %v", len(args)), args...) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Debug is a utility method for debug log messages. | ||||
| // The behavior of Debug depends on the first argument: | ||||
| // - arg0 is a string | ||||
| //   When given a string as the first argument, this behaves like Logf but with | ||||
| //   the DEBUG log level: the first argument is interpreted as a format for the | ||||
| //   latter arguments. | ||||
| // - arg0 is a func()string | ||||
| //   When given a closure of type func()string, this logs the string returned by | ||||
| //   the closure iff it will be logged.  The closure runs at most one time. | ||||
| // - arg0 is interface{} | ||||
| //   When given anything else, the log message will be each of the arguments | ||||
| //   formatted with %v and separated by spaces (ala Sprint). | ||||
| func (log Logger) Debug(arg0 interface{}, args ...interface{}) { | ||||
| 	const ( | ||||
| 		lvl = DEBUG | ||||
| 	) | ||||
| 	switch first := arg0.(type) { | ||||
| 	case string: | ||||
| 		// Use the string as a format string | ||||
| 		log.intLogf(lvl, first, args...) | ||||
| 	case func() string: | ||||
| 		// Log the closure (no other arguments used) | ||||
| 		log.intLogc(lvl, first) | ||||
| 	default: | ||||
| 		// Build a format string so that it will be similar to Sprint | ||||
| 		log.intLogf(lvl, fmt.Sprint(arg0)+strings.Repeat(" %v", len(args)), args...) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Trace logs a message at the trace log level. | ||||
| // See Debug for an explanation of the arguments. | ||||
| func (log Logger) Trace(arg0 interface{}, args ...interface{}) { | ||||
| 	const ( | ||||
| 		lvl = TRACE | ||||
| 	) | ||||
| 	switch first := arg0.(type) { | ||||
| 	case string: | ||||
| 		// Use the string as a format string | ||||
| 		log.intLogf(lvl, first, args...) | ||||
| 	case func() string: | ||||
| 		// Log the closure (no other arguments used) | ||||
| 		log.intLogc(lvl, first) | ||||
| 	default: | ||||
| 		// Build a format string so that it will be similar to Sprint | ||||
| 		log.intLogf(lvl, fmt.Sprint(arg0)+strings.Repeat(" %v", len(args)), args...) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Info logs a message at the info log level. | ||||
| // See Debug for an explanation of the arguments. | ||||
| func (log Logger) Info(arg0 interface{}, args ...interface{}) { | ||||
| 	const ( | ||||
| 		lvl = INFO | ||||
| 	) | ||||
| 	switch first := arg0.(type) { | ||||
| 	case string: | ||||
| 		// Use the string as a format string | ||||
| 		log.intLogf(lvl, first, args...) | ||||
| 	case func() string: | ||||
| 		// Log the closure (no other arguments used) | ||||
| 		log.intLogc(lvl, first) | ||||
| 	default: | ||||
| 		// Build a format string so that it will be similar to Sprint | ||||
| 		log.intLogf(lvl, fmt.Sprint(arg0)+strings.Repeat(" %v", len(args)), args...) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Warn logs a message at the warning log level and returns the formatted error. | ||||
| // At the warning level and higher, there is no performance benefit if the | ||||
| // message is not actually logged, because all formats are processed and all | ||||
| // closures are executed to format the error message. | ||||
| // See Debug for further explanation of the arguments. | ||||
| func (log Logger) Warn(arg0 interface{}, args ...interface{}) error { | ||||
| 	const ( | ||||
| 		lvl = WARNING | ||||
| 	) | ||||
| 	var msg string | ||||
| 	switch first := arg0.(type) { | ||||
| 	case string: | ||||
| 		// Use the string as a format string | ||||
| 		msg = fmt.Sprintf(first, args...) | ||||
| 	case func() string: | ||||
| 		// Log the closure (no other arguments used) | ||||
| 		msg = first() | ||||
| 	default: | ||||
| 		// Build a format string so that it will be similar to Sprint | ||||
| 		msg = fmt.Sprintf(fmt.Sprint(first)+strings.Repeat(" %v", len(args)), args...) | ||||
| 	} | ||||
| 	log.intLogf(lvl, msg) | ||||
| 	return errors.New(msg) | ||||
| } | ||||
|  | ||||
| // Error logs a message at the error log level and returns the formatted error, | ||||
| // See Warn for an explanation of the performance and Debug for an explanation | ||||
| // of the parameters. | ||||
| func (log Logger) Error(arg0 interface{}, args ...interface{}) error { | ||||
| 	const ( | ||||
| 		lvl = ERROR | ||||
| 	) | ||||
| 	var msg string | ||||
| 	switch first := arg0.(type) { | ||||
| 	case string: | ||||
| 		// Use the string as a format string | ||||
| 		msg = fmt.Sprintf(first, args...) | ||||
| 	case func() string: | ||||
| 		// Log the closure (no other arguments used) | ||||
| 		msg = first() | ||||
| 	default: | ||||
| 		// Build a format string so that it will be similar to Sprint | ||||
| 		msg = fmt.Sprintf(fmt.Sprint(first)+strings.Repeat(" %v", len(args)), args...) | ||||
| 	} | ||||
| 	log.intLogf(lvl, msg) | ||||
| 	return errors.New(msg) | ||||
| } | ||||
|  | ||||
| // Critical logs a message at the critical log level and returns the formatted error, | ||||
| // See Warn for an explanation of the performance and Debug for an explanation | ||||
| // of the parameters. | ||||
| func (log Logger) Critical(arg0 interface{}, args ...interface{}) error { | ||||
| 	const ( | ||||
| 		lvl = CRITICAL | ||||
| 	) | ||||
| 	var msg string | ||||
| 	switch first := arg0.(type) { | ||||
| 	case string: | ||||
| 		// Use the string as a format string | ||||
| 		msg = fmt.Sprintf(first, args...) | ||||
| 	case func() string: | ||||
| 		// Log the closure (no other arguments used) | ||||
| 		msg = first() | ||||
| 	default: | ||||
| 		// Build a format string so that it will be similar to Sprint | ||||
| 		msg = fmt.Sprintf(fmt.Sprint(first)+strings.Repeat(" %v", len(args)), args...) | ||||
| 	} | ||||
| 	log.intLogf(lvl, msg) | ||||
| 	return errors.New(msg) | ||||
| } | ||||
							
								
								
									
										126
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/pattlog.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/pattlog.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,126 @@ | ||||
| // Copyright (C) 2010, Kyle Lemons <kyle@kylelemons.net>.  All rights reserved. | ||||
|  | ||||
| package log4go | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	FORMAT_DEFAULT = "[%D %T] [%L] (%S) %M" | ||||
| 	FORMAT_SHORT   = "[%t %d] [%L] %M" | ||||
| 	FORMAT_ABBREV  = "[%L] %M" | ||||
| ) | ||||
|  | ||||
| type formatCacheType struct { | ||||
| 	LastUpdateSeconds    int64 | ||||
| 	shortTime, shortDate string | ||||
| 	longTime, longDate   string | ||||
| } | ||||
|  | ||||
| var formatCache = &formatCacheType{} | ||||
|  | ||||
| // Known format codes: | ||||
| // %T - Time (15:04:05 MST) | ||||
| // %t - Time (15:04) | ||||
| // %D - Date (2006/01/02) | ||||
| // %d - Date (01/02/06) | ||||
| // %L - Level (FNST, FINE, DEBG, TRAC, WARN, EROR, CRIT) | ||||
| // %S - Source | ||||
| // %M - Message | ||||
| // Ignores unknown formats | ||||
| // Recommended: "[%D %T] [%L] (%S) %M" | ||||
| func FormatLogRecord(format string, rec *LogRecord) string { | ||||
| 	if rec == nil { | ||||
| 		return "<nil>" | ||||
| 	} | ||||
| 	if len(format) == 0 { | ||||
| 		return "" | ||||
| 	} | ||||
|  | ||||
| 	out := bytes.NewBuffer(make([]byte, 0, 64)) | ||||
| 	secs := rec.Created.UnixNano() / 1e9 | ||||
|  | ||||
| 	cache := *formatCache | ||||
| 	if cache.LastUpdateSeconds != secs { | ||||
| 		month, day, year := rec.Created.Month(), rec.Created.Day(), rec.Created.Year() | ||||
| 		hour, minute, second := rec.Created.Hour(), rec.Created.Minute(), rec.Created.Second() | ||||
| 		zone, _ := rec.Created.Zone() | ||||
| 		updated := &formatCacheType{ | ||||
| 			LastUpdateSeconds: secs, | ||||
| 			shortTime:         fmt.Sprintf("%02d:%02d", hour, minute), | ||||
| 			shortDate:         fmt.Sprintf("%02d/%02d/%02d", day, month, year%100), | ||||
| 			longTime:          fmt.Sprintf("%02d:%02d:%02d %s", hour, minute, second, zone), | ||||
| 			longDate:          fmt.Sprintf("%04d/%02d/%02d", year, month, day), | ||||
| 		} | ||||
| 		cache = *updated | ||||
| 		formatCache = updated | ||||
| 	} | ||||
|  | ||||
| 	// Split the string into pieces by % signs | ||||
| 	pieces := bytes.Split([]byte(format), []byte{'%'}) | ||||
|  | ||||
| 	// Iterate over the pieces, replacing known formats | ||||
| 	for i, piece := range pieces { | ||||
| 		if i > 0 && len(piece) > 0 { | ||||
| 			switch piece[0] { | ||||
| 			case 'T': | ||||
| 				out.WriteString(cache.longTime) | ||||
| 			case 't': | ||||
| 				out.WriteString(cache.shortTime) | ||||
| 			case 'D': | ||||
| 				out.WriteString(cache.longDate) | ||||
| 			case 'd': | ||||
| 				out.WriteString(cache.shortDate) | ||||
| 			case 'L': | ||||
| 				out.WriteString(levelStrings[rec.Level]) | ||||
| 			case 'S': | ||||
| 				out.WriteString(rec.Source) | ||||
| 			case 's': | ||||
| 				slice := strings.Split(rec.Source, "/") | ||||
| 				out.WriteString(slice[len(slice)-1]) | ||||
| 			case 'M': | ||||
| 				out.WriteString(rec.Message) | ||||
| 			} | ||||
| 			if len(piece) > 1 { | ||||
| 				out.Write(piece[1:]) | ||||
| 			} | ||||
| 		} else if len(piece) > 0 { | ||||
| 			out.Write(piece) | ||||
| 		} | ||||
| 	} | ||||
| 	out.WriteByte('\n') | ||||
|  | ||||
| 	return out.String() | ||||
| } | ||||
|  | ||||
| // This is the standard writer that prints to standard output. | ||||
| type FormatLogWriter chan *LogRecord | ||||
|  | ||||
| // This creates a new FormatLogWriter | ||||
| func NewFormatLogWriter(out io.Writer, format string) FormatLogWriter { | ||||
| 	records := make(FormatLogWriter, LogBufferLength) | ||||
| 	go records.run(out, format) | ||||
| 	return records | ||||
| } | ||||
|  | ||||
| func (w FormatLogWriter) run(out io.Writer, format string) { | ||||
| 	for rec := range w { | ||||
| 		fmt.Fprint(out, FormatLogRecord(format, rec)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // This is the FormatLogWriter's output method.  This will block if the output | ||||
| // buffer is full. | ||||
| func (w FormatLogWriter) LogWrite(rec *LogRecord) { | ||||
| 	w <- rec | ||||
| } | ||||
|  | ||||
| // Close stops the logger from sending messages to standard output.  Attempts to | ||||
| // send log messages to this logger after a Close have undefined behavior. | ||||
| func (w FormatLogWriter) Close() { | ||||
| 	close(w) | ||||
| } | ||||
							
								
								
									
										57
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/socklog.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/socklog.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| // Copyright (C) 2010, Kyle Lemons <kyle@kylelemons.net>.  All rights reserved. | ||||
|  | ||||
| package log4go | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"net" | ||||
| 	"os" | ||||
| ) | ||||
|  | ||||
| // This log writer sends output to a socket | ||||
| type SocketLogWriter chan *LogRecord | ||||
|  | ||||
| // This is the SocketLogWriter's output method | ||||
| func (w SocketLogWriter) LogWrite(rec *LogRecord) { | ||||
| 	w <- rec | ||||
| } | ||||
|  | ||||
| func (w SocketLogWriter) Close() { | ||||
| 	close(w) | ||||
| } | ||||
|  | ||||
| func NewSocketLogWriter(proto, hostport string) SocketLogWriter { | ||||
| 	sock, err := net.Dial(proto, hostport) | ||||
| 	if err != nil { | ||||
| 		fmt.Fprintf(os.Stderr, "NewSocketLogWriter(%q): %s\n", hostport, err) | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	w := SocketLogWriter(make(chan *LogRecord, LogBufferLength)) | ||||
|  | ||||
| 	go func() { | ||||
| 		defer func() { | ||||
| 			if sock != nil && proto == "tcp" { | ||||
| 				sock.Close() | ||||
| 			} | ||||
| 		}() | ||||
|  | ||||
| 		for rec := range w { | ||||
| 			// Marshall into JSON | ||||
| 			js, err := json.Marshal(rec) | ||||
| 			if err != nil { | ||||
| 				fmt.Fprint(os.Stderr, "SocketLogWriter(%q): %s", hostport, err) | ||||
| 				return | ||||
| 			} | ||||
|  | ||||
| 			_, err = sock.Write(js) | ||||
| 			if err != nil { | ||||
| 				fmt.Fprint(os.Stderr, "SocketLogWriter(%q): %s", hostport, err) | ||||
| 				return | ||||
| 			} | ||||
| 		} | ||||
| 	}() | ||||
|  | ||||
| 	return w | ||||
| } | ||||
							
								
								
									
										49
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/termlog.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/termlog.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | ||||
| // Copyright (C) 2010, Kyle Lemons <kyle@kylelemons.net>.  All rights reserved. | ||||
|  | ||||
| package log4go | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"os" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| var stdout io.Writer = os.Stdout | ||||
|  | ||||
| // This is the standard writer that prints to standard output. | ||||
| type ConsoleLogWriter struct { | ||||
| 	format string | ||||
| 	w      chan *LogRecord | ||||
| } | ||||
|  | ||||
| // This creates a new ConsoleLogWriter | ||||
| func NewConsoleLogWriter() *ConsoleLogWriter { | ||||
| 	consoleWriter := &ConsoleLogWriter{ | ||||
| 		format: "[%T %D] [%L] (%S) %M", | ||||
| 		w:      make(chan *LogRecord, LogBufferLength), | ||||
| 	} | ||||
| 	go consoleWriter.run(stdout) | ||||
| 	return consoleWriter | ||||
| } | ||||
| func (c *ConsoleLogWriter) SetFormat(format string) { | ||||
| 	c.format = format | ||||
| } | ||||
| func (c *ConsoleLogWriter) run(out io.Writer) { | ||||
| 	for rec := range c.w { | ||||
| 		fmt.Fprint(out, FormatLogRecord(c.format, rec)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // This is the ConsoleLogWriter's output method.  This will block if the output | ||||
| // buffer is full. | ||||
| func (c *ConsoleLogWriter) LogWrite(rec *LogRecord) { | ||||
| 	c.w <- rec | ||||
| } | ||||
|  | ||||
| // Close stops the logger from sending messages to standard output.  Attempts to | ||||
| // send log messages to this logger after a Close have undefined behavior. | ||||
| func (c *ConsoleLogWriter) Close() { | ||||
| 	close(c.w) | ||||
| 	time.Sleep(50 * time.Millisecond) // Try to give console I/O time to complete | ||||
| } | ||||
							
								
								
									
										278
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/wrapper.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										278
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/alecthomas/log4go/wrapper.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,278 @@ | ||||
| // Copyright (C) 2010, Kyle Lemons <kyle@kylelemons.net>.  All rights reserved. | ||||
|  | ||||
| package log4go | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	Global Logger | ||||
| ) | ||||
|  | ||||
| func init() { | ||||
| 	Global = NewDefaultLogger(DEBUG) | ||||
| } | ||||
|  | ||||
| // Wrapper for (*Logger).LoadConfiguration | ||||
| func LoadConfiguration(filename string) { | ||||
| 	Global.LoadConfiguration(filename) | ||||
| } | ||||
|  | ||||
| // Wrapper for (*Logger).AddFilter | ||||
| func AddFilter(name string, lvl Level, writer LogWriter) { | ||||
| 	Global.AddFilter(name, lvl, writer) | ||||
| } | ||||
|  | ||||
| // Wrapper for (*Logger).Close (closes and removes all logwriters) | ||||
| func Close() { | ||||
| 	Global.Close() | ||||
| } | ||||
|  | ||||
| func Crash(args ...interface{}) { | ||||
| 	if len(args) > 0 { | ||||
| 		Global.intLogf(CRITICAL, strings.Repeat(" %v", len(args))[1:], args...) | ||||
| 	} | ||||
| 	panic(args) | ||||
| } | ||||
|  | ||||
| // Logs the given message and crashes the program | ||||
| func Crashf(format string, args ...interface{}) { | ||||
| 	Global.intLogf(CRITICAL, format, args...) | ||||
| 	Global.Close() // so that hopefully the messages get logged | ||||
| 	panic(fmt.Sprintf(format, args...)) | ||||
| } | ||||
|  | ||||
| // Compatibility with `log` | ||||
| func Exit(args ...interface{}) { | ||||
| 	if len(args) > 0 { | ||||
| 		Global.intLogf(ERROR, strings.Repeat(" %v", len(args))[1:], args...) | ||||
| 	} | ||||
| 	Global.Close() // so that hopefully the messages get logged | ||||
| 	os.Exit(0) | ||||
| } | ||||
|  | ||||
| // Compatibility with `log` | ||||
| func Exitf(format string, args ...interface{}) { | ||||
| 	Global.intLogf(ERROR, format, args...) | ||||
| 	Global.Close() // so that hopefully the messages get logged | ||||
| 	os.Exit(0) | ||||
| } | ||||
|  | ||||
| // Compatibility with `log` | ||||
| func Stderr(args ...interface{}) { | ||||
| 	if len(args) > 0 { | ||||
| 		Global.intLogf(ERROR, strings.Repeat(" %v", len(args))[1:], args...) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Compatibility with `log` | ||||
| func Stderrf(format string, args ...interface{}) { | ||||
| 	Global.intLogf(ERROR, format, args...) | ||||
| } | ||||
|  | ||||
| // Compatibility with `log` | ||||
| func Stdout(args ...interface{}) { | ||||
| 	if len(args) > 0 { | ||||
| 		Global.intLogf(INFO, strings.Repeat(" %v", len(args))[1:], args...) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Compatibility with `log` | ||||
| func Stdoutf(format string, args ...interface{}) { | ||||
| 	Global.intLogf(INFO, format, args...) | ||||
| } | ||||
|  | ||||
| // Send a log message manually | ||||
| // Wrapper for (*Logger).Log | ||||
| func Log(lvl Level, source, message string) { | ||||
| 	Global.Log(lvl, source, message) | ||||
| } | ||||
|  | ||||
| // Send a formatted log message easily | ||||
| // Wrapper for (*Logger).Logf | ||||
| func Logf(lvl Level, format string, args ...interface{}) { | ||||
| 	Global.intLogf(lvl, format, args...) | ||||
| } | ||||
|  | ||||
| // Send a closure log message | ||||
| // Wrapper for (*Logger).Logc | ||||
| func Logc(lvl Level, closure func() string) { | ||||
| 	Global.intLogc(lvl, closure) | ||||
| } | ||||
|  | ||||
| // Utility for finest log messages (see Debug() for parameter explanation) | ||||
| // Wrapper for (*Logger).Finest | ||||
| func Finest(arg0 interface{}, args ...interface{}) { | ||||
| 	const ( | ||||
| 		lvl = FINEST | ||||
| 	) | ||||
| 	switch first := arg0.(type) { | ||||
| 	case string: | ||||
| 		// Use the string as a format string | ||||
| 		Global.intLogf(lvl, first, args...) | ||||
| 	case func() string: | ||||
| 		// Log the closure (no other arguments used) | ||||
| 		Global.intLogc(lvl, first) | ||||
| 	default: | ||||
| 		// Build a format string so that it will be similar to Sprint | ||||
| 		Global.intLogf(lvl, fmt.Sprint(arg0)+strings.Repeat(" %v", len(args)), args...) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Utility for fine log messages (see Debug() for parameter explanation) | ||||
| // Wrapper for (*Logger).Fine | ||||
| func Fine(arg0 interface{}, args ...interface{}) { | ||||
| 	const ( | ||||
| 		lvl = FINE | ||||
| 	) | ||||
| 	switch first := arg0.(type) { | ||||
| 	case string: | ||||
| 		// Use the string as a format string | ||||
| 		Global.intLogf(lvl, first, args...) | ||||
| 	case func() string: | ||||
| 		// Log the closure (no other arguments used) | ||||
| 		Global.intLogc(lvl, first) | ||||
| 	default: | ||||
| 		// Build a format string so that it will be similar to Sprint | ||||
| 		Global.intLogf(lvl, fmt.Sprint(arg0)+strings.Repeat(" %v", len(args)), args...) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Utility for debug log messages | ||||
| // When given a string as the first argument, this behaves like Logf but with the DEBUG log level (e.g. the first argument is interpreted as a format for the latter arguments) | ||||
| // When given a closure of type func()string, this logs the string returned by the closure iff it will be logged.  The closure runs at most one time. | ||||
| // When given anything else, the log message will be each of the arguments formatted with %v and separated by spaces (ala Sprint). | ||||
| // Wrapper for (*Logger).Debug | ||||
| func Debug(arg0 interface{}, args ...interface{}) { | ||||
| 	const ( | ||||
| 		lvl = DEBUG | ||||
| 	) | ||||
| 	switch first := arg0.(type) { | ||||
| 	case string: | ||||
| 		// Use the string as a format string | ||||
| 		Global.intLogf(lvl, first, args...) | ||||
| 	case func() string: | ||||
| 		// Log the closure (no other arguments used) | ||||
| 		Global.intLogc(lvl, first) | ||||
| 	default: | ||||
| 		// Build a format string so that it will be similar to Sprint | ||||
| 		Global.intLogf(lvl, fmt.Sprint(arg0)+strings.Repeat(" %v", len(args)), args...) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Utility for trace log messages (see Debug() for parameter explanation) | ||||
| // Wrapper for (*Logger).Trace | ||||
| func Trace(arg0 interface{}, args ...interface{}) { | ||||
| 	const ( | ||||
| 		lvl = TRACE | ||||
| 	) | ||||
| 	switch first := arg0.(type) { | ||||
| 	case string: | ||||
| 		// Use the string as a format string | ||||
| 		Global.intLogf(lvl, first, args...) | ||||
| 	case func() string: | ||||
| 		// Log the closure (no other arguments used) | ||||
| 		Global.intLogc(lvl, first) | ||||
| 	default: | ||||
| 		// Build a format string so that it will be similar to Sprint | ||||
| 		Global.intLogf(lvl, fmt.Sprint(arg0)+strings.Repeat(" %v", len(args)), args...) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Utility for info log messages (see Debug() for parameter explanation) | ||||
| // Wrapper for (*Logger).Info | ||||
| func Info(arg0 interface{}, args ...interface{}) { | ||||
| 	const ( | ||||
| 		lvl = INFO | ||||
| 	) | ||||
| 	switch first := arg0.(type) { | ||||
| 	case string: | ||||
| 		// Use the string as a format string | ||||
| 		Global.intLogf(lvl, first, args...) | ||||
| 	case func() string: | ||||
| 		// Log the closure (no other arguments used) | ||||
| 		Global.intLogc(lvl, first) | ||||
| 	default: | ||||
| 		// Build a format string so that it will be similar to Sprint | ||||
| 		Global.intLogf(lvl, fmt.Sprint(arg0)+strings.Repeat(" %v", len(args)), args...) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Utility for warn log messages (returns an error for easy function returns) (see Debug() for parameter explanation) | ||||
| // These functions will execute a closure exactly once, to build the error message for the return | ||||
| // Wrapper for (*Logger).Warn | ||||
| func Warn(arg0 interface{}, args ...interface{}) error { | ||||
| 	const ( | ||||
| 		lvl = WARNING | ||||
| 	) | ||||
| 	switch first := arg0.(type) { | ||||
| 	case string: | ||||
| 		// Use the string as a format string | ||||
| 		Global.intLogf(lvl, first, args...) | ||||
| 		return errors.New(fmt.Sprintf(first, args...)) | ||||
| 	case func() string: | ||||
| 		// Log the closure (no other arguments used) | ||||
| 		str := first() | ||||
| 		Global.intLogf(lvl, "%s", str) | ||||
| 		return errors.New(str) | ||||
| 	default: | ||||
| 		// Build a format string so that it will be similar to Sprint | ||||
| 		Global.intLogf(lvl, fmt.Sprint(first)+strings.Repeat(" %v", len(args)), args...) | ||||
| 		return errors.New(fmt.Sprint(first) + fmt.Sprintf(strings.Repeat(" %v", len(args)), args...)) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Utility for error log messages (returns an error for easy function returns) (see Debug() for parameter explanation) | ||||
| // These functions will execute a closure exactly once, to build the error message for the return | ||||
| // Wrapper for (*Logger).Error | ||||
| func Error(arg0 interface{}, args ...interface{}) error { | ||||
| 	const ( | ||||
| 		lvl = ERROR | ||||
| 	) | ||||
| 	switch first := arg0.(type) { | ||||
| 	case string: | ||||
| 		// Use the string as a format string | ||||
| 		Global.intLogf(lvl, first, args...) | ||||
| 		return errors.New(fmt.Sprintf(first, args...)) | ||||
| 	case func() string: | ||||
| 		// Log the closure (no other arguments used) | ||||
| 		str := first() | ||||
| 		Global.intLogf(lvl, "%s", str) | ||||
| 		return errors.New(str) | ||||
| 	default: | ||||
| 		// Build a format string so that it will be similar to Sprint | ||||
| 		Global.intLogf(lvl, fmt.Sprint(first)+strings.Repeat(" %v", len(args)), args...) | ||||
| 		return errors.New(fmt.Sprint(first) + fmt.Sprintf(strings.Repeat(" %v", len(args)), args...)) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Utility for critical log messages (returns an error for easy function returns) (see Debug() for parameter explanation) | ||||
| // These functions will execute a closure exactly once, to build the error message for the return | ||||
| // Wrapper for (*Logger).Critical | ||||
| func Critical(arg0 interface{}, args ...interface{}) error { | ||||
| 	const ( | ||||
| 		lvl = CRITICAL | ||||
| 	) | ||||
| 	switch first := arg0.(type) { | ||||
| 	case string: | ||||
| 		// Use the string as a format string | ||||
| 		Global.intLogf(lvl, first, args...) | ||||
| 		return errors.New(fmt.Sprintf(first, args...)) | ||||
| 	case func() string: | ||||
| 		// Log the closure (no other arguments used) | ||||
| 		str := first() | ||||
| 		Global.intLogf(lvl, "%s", str) | ||||
| 		return errors.New(str) | ||||
| 	default: | ||||
| 		// Build a format string so that it will be similar to Sprint | ||||
| 		Global.intLogf(lvl, fmt.Sprint(first)+strings.Repeat(" %v", len(args)), args...) | ||||
| 		return errors.New(fmt.Sprint(first) + fmt.Sprintf(strings.Repeat(" %v", len(args)), args...)) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										897
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/LICENSE.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										897
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/LICENSE.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,897 @@ | ||||
| Mattermost Licensing | ||||
|  | ||||
| SOFTWARE LICENSING  | ||||
|  | ||||
| You are licensed to use compiled versions of the Mattermost platform produced by Mattermost, Inc. under an MIT LICENSE  | ||||
|  | ||||
| -	See MIT-COMPILED-LICENSE.md included in compiled versions for details | ||||
|  | ||||
| You may be licensed to use source code to create compiled versions not produced by Mattermost, Inc. in one of two ways: | ||||
|  | ||||
| 1. Under the Free Software Foundation’s GNU AGPL v.3.0, subject to the exceptions outlined in this policy; or  | ||||
| 2. Under a commercial license available from Mattermost, Inc. by contacting commercial@mattermost.com  | ||||
|  | ||||
| You are licensed to use the source code in Admin Tools and Configuration Files (templates/, config/, model/,  | ||||
| webapp/client, webapp/fonts, webapp/i18n, webapp/images and all subdirectories thereof) under the Apache License v2.0. | ||||
|  | ||||
| We promise that we will not enforce the copyleft provisions in AGPL v3.0 against you if your application (a) does not  | ||||
| link to the Mattermost Platform directly, but exclusively uses the Mattermost Admin Tools and Configuration Files, and | ||||
| (b) you have not modified, added to or adapted the source code of Mattermost in a way that results in the creation of  | ||||
| a “modified version” or “work based on” Mattermost as these terms are defined in the AGPL v3.0 license. | ||||
|  | ||||
| MATTERMOST TRADEMARK GUIDELINES | ||||
|  | ||||
| Your use of the mark Mattermost is subject to Mattermost, Inc's prior written approval and our organization’s Trademark  | ||||
| Standards of Use at http://www.mattermost.org/trademark-standards-of-use/. For trademark approval or any questions  | ||||
| you have about using these trademarks, please email trademark@mattermost.com  | ||||
|  | ||||
| ------------------------------------------------------------------------------------------------------------------------------ | ||||
|                                 | ||||
|                                Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "[]" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright [yyyy] [name of copyright owner] | ||||
|  | ||||
|    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. | ||||
|  | ||||
| ------------------------------------------------------------------------------ | ||||
|  | ||||
| The software is released under the terms of the GNU Affero General Public | ||||
| License, version 3. | ||||
|  | ||||
|                     GNU AFFERO GENERAL PUBLIC LICENSE | ||||
|                        Version 3, 19 November 2007 | ||||
|  | ||||
|  Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | ||||
|  Everyone is permitted to copy and distribute verbatim copies | ||||
|  of this license document, but changing it is not allowed. | ||||
|  | ||||
|                             Preamble | ||||
|  | ||||
|   The GNU Affero General Public License is a free, copyleft license for | ||||
| software and other kinds of works, specifically designed to ensure | ||||
| cooperation with the community in the case of network server software. | ||||
|  | ||||
|   The licenses for most software and other practical works are designed | ||||
| to take away your freedom to share and change the works.  By contrast, | ||||
| our General Public Licenses are intended to guarantee your freedom to | ||||
| share and change all versions of a program--to make sure it remains free | ||||
| software for all its users. | ||||
|  | ||||
|   When we speak of free software, we are referring to freedom, not | ||||
| price.  Our General Public Licenses are designed to make sure that you | ||||
| have the freedom to distribute copies of free software (and charge for | ||||
| them if you wish), that you receive source code or can get it if you | ||||
| want it, that you can change the software or use pieces of it in new | ||||
| free programs, and that you know you can do these things. | ||||
|  | ||||
|   Developers that use our General Public Licenses protect your rights | ||||
| with two steps: (1) assert copyright on the software, and (2) offer | ||||
| you this License which gives you legal permission to copy, distribute | ||||
| and/or modify the software. | ||||
|  | ||||
|   A secondary benefit of defending all users' freedom is that | ||||
| improvements made in alternate versions of the program, if they | ||||
| receive widespread use, become available for other developers to | ||||
| incorporate.  Many developers of free software are heartened and | ||||
| encouraged by the resulting cooperation.  However, in the case of | ||||
| software used on network servers, this result may fail to come about. | ||||
| The GNU General Public License permits making a modified version and | ||||
| letting the public access it on a server without ever releasing its | ||||
| source code to the public. | ||||
|  | ||||
|   The GNU Affero General Public License is designed specifically to | ||||
| ensure that, in such cases, the modified source code becomes available | ||||
| to the community.  It requires the operator of a network server to | ||||
| provide the source code of the modified version running there to the | ||||
| users of that server.  Therefore, public use of a modified version, on | ||||
| a publicly accessible server, gives the public access to the source | ||||
| code of the modified version. | ||||
|  | ||||
|   An older license, called the Affero General Public License and | ||||
| published by Affero, was designed to accomplish similar goals.  This is | ||||
| a different license, not a version of the Affero GPL, but Affero has | ||||
| released a new version of the Affero GPL which permits relicensing under | ||||
| this license. | ||||
|  | ||||
|   The precise terms and conditions for copying, distribution and | ||||
| modification follow. | ||||
|  | ||||
|                        TERMS AND CONDITIONS | ||||
|  | ||||
|   0. Definitions. | ||||
|  | ||||
|   "This License" refers to version 3 of the GNU Affero General Public License. | ||||
|  | ||||
|   "Copyright" also means copyright-like laws that apply to other kinds of | ||||
| works, such as semiconductor masks. | ||||
|  | ||||
|   "The Program" refers to any copyrightable work licensed under this | ||||
| License.  Each licensee is addressed as "you".  "Licensees" and | ||||
| "recipients" may be individuals or organizations. | ||||
|  | ||||
|   To "modify" a work means to copy from or adapt all or part of the work | ||||
| in a fashion requiring copyright permission, other than the making of an | ||||
| exact copy.  The resulting work is called a "modified version" of the | ||||
| earlier work or a work "based on" the earlier work. | ||||
|  | ||||
|   A "covered work" means either the unmodified Program or a work based | ||||
| on the Program. | ||||
|  | ||||
|   To "propagate" a work means to do anything with it that, without | ||||
| permission, would make you directly or secondarily liable for | ||||
| infringement under applicable copyright law, except executing it on a | ||||
| computer or modifying a private copy.  Propagation includes copying, | ||||
| distribution (with or without modification), making available to the | ||||
| public, and in some countries other activities as well. | ||||
|  | ||||
|   To "convey" a work means any kind of propagation that enables other | ||||
| parties to make or receive copies.  Mere interaction with a user through | ||||
| a computer network, with no transfer of a copy, is not conveying. | ||||
|  | ||||
|   An interactive user interface displays "Appropriate Legal Notices" | ||||
| to the extent that it includes a convenient and prominently visible | ||||
| feature that (1) displays an appropriate copyright notice, and (2) | ||||
| tells the user that there is no warranty for the work (except to the | ||||
| extent that warranties are provided), that licensees may convey the | ||||
| work under this License, and how to view a copy of this License.  If | ||||
| the interface presents a list of user commands or options, such as a | ||||
| menu, a prominent item in the list meets this criterion. | ||||
|  | ||||
|   1. Source Code. | ||||
|  | ||||
|   The "source code" for a work means the preferred form of the work | ||||
| for making modifications to it.  "Object code" means any non-source | ||||
| form of a work. | ||||
|  | ||||
|   A "Standard Interface" means an interface that either is an official | ||||
| standard defined by a recognized standards body, or, in the case of | ||||
| interfaces specified for a particular programming language, one that | ||||
| is widely used among developers working in that language. | ||||
|  | ||||
|   The "System Libraries" of an executable work include anything, other | ||||
| than the work as a whole, that (a) is included in the normal form of | ||||
| packaging a Major Component, but which is not part of that Major | ||||
| Component, and (b) serves only to enable use of the work with that | ||||
| Major Component, or to implement a Standard Interface for which an | ||||
| implementation is available to the public in source code form.  A | ||||
| "Major Component", in this context, means a major essential component | ||||
| (kernel, window system, and so on) of the specific operating system | ||||
| (if any) on which the executable work runs, or a compiler used to | ||||
| produce the work, or an object code interpreter used to run it. | ||||
|  | ||||
|   The "Corresponding Source" for a work in object code form means all | ||||
| the source code needed to generate, install, and (for an executable | ||||
| work) run the object code and to modify the work, including scripts to | ||||
| control those activities.  However, it does not include the work's | ||||
| System Libraries, or general-purpose tools or generally available free | ||||
| programs which are used unmodified in performing those activities but | ||||
| which are not part of the work.  For example, Corresponding Source | ||||
| includes interface definition files associated with source files for | ||||
| the work, and the source code for shared libraries and dynamically | ||||
| linked subprograms that the work is specifically designed to require, | ||||
| such as by intimate data communication or control flow between those | ||||
| subprograms and other parts of the work. | ||||
|  | ||||
|   The Corresponding Source need not include anything that users | ||||
| can regenerate automatically from other parts of the Corresponding | ||||
| Source. | ||||
|  | ||||
|   The Corresponding Source for a work in source code form is that | ||||
| same work. | ||||
|  | ||||
|   2. Basic Permissions. | ||||
|  | ||||
|   All rights granted under this License are granted for the term of | ||||
| copyright on the Program, and are irrevocable provided the stated | ||||
| conditions are met.  This License explicitly affirms your unlimited | ||||
| permission to run the unmodified Program.  The output from running a | ||||
| covered work is covered by this License only if the output, given its | ||||
| content, constitutes a covered work.  This License acknowledges your | ||||
| rights of fair use or other equivalent, as provided by copyright law. | ||||
|  | ||||
|   You may make, run and propagate covered works that you do not | ||||
| convey, without conditions so long as your license otherwise remains | ||||
| in force.  You may convey covered works to others for the sole purpose | ||||
| of having them make modifications exclusively for you, or provide you | ||||
| with facilities for running those works, provided that you comply with | ||||
| the terms of this License in conveying all material for which you do | ||||
| not control copyright.  Those thus making or running the covered works | ||||
| for you must do so exclusively on your behalf, under your direction | ||||
| and control, on terms that prohibit them from making any copies of | ||||
| your copyrighted material outside their relationship with you. | ||||
|  | ||||
|   Conveying under any other circumstances is permitted solely under | ||||
| the conditions stated below.  Sublicensing is not allowed; section 10 | ||||
| makes it unnecessary. | ||||
|  | ||||
|   3. Protecting Users' Legal Rights From Anti-Circumvention Law. | ||||
|  | ||||
|   No covered work shall be deemed part of an effective technological | ||||
| measure under any applicable law fulfilling obligations under article | ||||
| 11 of the WIPO copyright treaty adopted on 20 December 1996, or | ||||
| similar laws prohibiting or restricting circumvention of such | ||||
| measures. | ||||
|  | ||||
|   When you convey a covered work, you waive any legal power to forbid | ||||
| circumvention of technological measures to the extent such circumvention | ||||
| is effected by exercising rights under this License with respect to | ||||
| the covered work, and you disclaim any intention to limit operation or | ||||
| modification of the work as a means of enforcing, against the work's | ||||
| users, your or third parties' legal rights to forbid circumvention of | ||||
| technological measures. | ||||
|  | ||||
|   4. Conveying Verbatim Copies. | ||||
|  | ||||
|   You may convey verbatim copies of the Program's source code as you | ||||
| receive it, in any medium, provided that you conspicuously and | ||||
| appropriately publish on each copy an appropriate copyright notice; | ||||
| keep intact all notices stating that this License and any | ||||
| non-permissive terms added in accord with section 7 apply to the code; | ||||
| keep intact all notices of the absence of any warranty; and give all | ||||
| recipients a copy of this License along with the Program. | ||||
|  | ||||
|   You may charge any price or no price for each copy that you convey, | ||||
| and you may offer support or warranty protection for a fee. | ||||
|  | ||||
|   5. Conveying Modified Source Versions. | ||||
|  | ||||
|   You may convey a work based on the Program, or the modifications to | ||||
| produce it from the Program, in the form of source code under the | ||||
| terms of section 4, provided that you also meet all of these conditions: | ||||
|  | ||||
|     a) The work must carry prominent notices stating that you modified | ||||
|     it, and giving a relevant date. | ||||
|  | ||||
|     b) The work must carry prominent notices stating that it is | ||||
|     released under this License and any conditions added under section | ||||
|     7.  This requirement modifies the requirement in section 4 to | ||||
|     "keep intact all notices". | ||||
|  | ||||
|     c) You must license the entire work, as a whole, under this | ||||
|     License to anyone who comes into possession of a copy.  This | ||||
|     License will therefore apply, along with any applicable section 7 | ||||
|     additional terms, to the whole of the work, and all its parts, | ||||
|     regardless of how they are packaged.  This License gives no | ||||
|     permission to license the work in any other way, but it does not | ||||
|     invalidate such permission if you have separately received it. | ||||
|  | ||||
|     d) If the work has interactive user interfaces, each must display | ||||
|     Appropriate Legal Notices; however, if the Program has interactive | ||||
|     interfaces that do not display Appropriate Legal Notices, your | ||||
|     work need not make them do so. | ||||
|  | ||||
|   A compilation of a covered work with other separate and independent | ||||
| works, which are not by their nature extensions of the covered work, | ||||
| and which are not combined with it such as to form a larger program, | ||||
| in or on a volume of a storage or distribution medium, is called an | ||||
| "aggregate" if the compilation and its resulting copyright are not | ||||
| used to limit the access or legal rights of the compilation's users | ||||
| beyond what the individual works permit.  Inclusion of a covered work | ||||
| in an aggregate does not cause this License to apply to the other | ||||
| parts of the aggregate. | ||||
|  | ||||
|   6. Conveying Non-Source Forms. | ||||
|  | ||||
|   You may convey a covered work in object code form under the terms | ||||
| of sections 4 and 5, provided that you also convey the | ||||
| machine-readable Corresponding Source under the terms of this License, | ||||
| in one of these ways: | ||||
|  | ||||
|     a) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by the | ||||
|     Corresponding Source fixed on a durable physical medium | ||||
|     customarily used for software interchange. | ||||
|  | ||||
|     b) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by a | ||||
|     written offer, valid for at least three years and valid for as | ||||
|     long as you offer spare parts or customer support for that product | ||||
|     model, to give anyone who possesses the object code either (1) a | ||||
|     copy of the Corresponding Source for all the software in the | ||||
|     product that is covered by this License, on a durable physical | ||||
|     medium customarily used for software interchange, for a price no | ||||
|     more than your reasonable cost of physically performing this | ||||
|     conveying of source, or (2) access to copy the | ||||
|     Corresponding Source from a network server at no charge. | ||||
|  | ||||
|     c) Convey individual copies of the object code with a copy of the | ||||
|     written offer to provide the Corresponding Source.  This | ||||
|     alternative is allowed only occasionally and noncommercially, and | ||||
|     only if you received the object code with such an offer, in accord | ||||
|     with subsection 6b. | ||||
|  | ||||
|     d) Convey the object code by offering access from a designated | ||||
|     place (gratis or for a charge), and offer equivalent access to the | ||||
|     Corresponding Source in the same way through the same place at no | ||||
|     further charge.  You need not require recipients to copy the | ||||
|     Corresponding Source along with the object code.  If the place to | ||||
|     copy the object code is a network server, the Corresponding Source | ||||
|     may be on a different server (operated by you or a third party) | ||||
|     that supports equivalent copying facilities, provided you maintain | ||||
|     clear directions next to the object code saying where to find the | ||||
|     Corresponding Source.  Regardless of what server hosts the | ||||
|     Corresponding Source, you remain obligated to ensure that it is | ||||
|     available for as long as needed to satisfy these requirements. | ||||
|  | ||||
|     e) Convey the object code using peer-to-peer transmission, provided | ||||
|     you inform other peers where the object code and Corresponding | ||||
|     Source of the work are being offered to the general public at no | ||||
|     charge under subsection 6d. | ||||
|  | ||||
|   A separable portion of the object code, whose source code is excluded | ||||
| from the Corresponding Source as a System Library, need not be | ||||
| included in conveying the object code work. | ||||
|  | ||||
|   A "User Product" is either (1) a "consumer product", which means any | ||||
| tangible personal property which is normally used for personal, family, | ||||
| or household purposes, or (2) anything designed or sold for incorporation | ||||
| into a dwelling.  In determining whether a product is a consumer product, | ||||
| doubtful cases shall be resolved in favor of coverage.  For a particular | ||||
| product received by a particular user, "normally used" refers to a | ||||
| typical or common use of that class of product, regardless of the status | ||||
| of the particular user or of the way in which the particular user | ||||
| actually uses, or expects or is expected to use, the product.  A product | ||||
| is a consumer product regardless of whether the product has substantial | ||||
| commercial, industrial or non-consumer uses, unless such uses represent | ||||
| the only significant mode of use of the product. | ||||
|  | ||||
|   "Installation Information" for a User Product means any methods, | ||||
| procedures, authorization keys, or other information required to install | ||||
| and execute modified versions of a covered work in that User Product from | ||||
| a modified version of its Corresponding Source.  The information must | ||||
| suffice to ensure that the continued functioning of the modified object | ||||
| code is in no case prevented or interfered with solely because | ||||
| modification has been made. | ||||
|  | ||||
|   If you convey an object code work under this section in, or with, or | ||||
| specifically for use in, a User Product, and the conveying occurs as | ||||
| part of a transaction in which the right of possession and use of the | ||||
| User Product is transferred to the recipient in perpetuity or for a | ||||
| fixed term (regardless of how the transaction is characterized), the | ||||
| Corresponding Source conveyed under this section must be accompanied | ||||
| by the Installation Information.  But this requirement does not apply | ||||
| if neither you nor any third party retains the ability to install | ||||
| modified object code on the User Product (for example, the work has | ||||
| been installed in ROM). | ||||
|  | ||||
|   The requirement to provide Installation Information does not include a | ||||
| requirement to continue to provide support service, warranty, or updates | ||||
| for a work that has been modified or installed by the recipient, or for | ||||
| the User Product in which it has been modified or installed.  Access to a | ||||
| network may be denied when the modification itself materially and | ||||
| adversely affects the operation of the network or violates the rules and | ||||
| protocols for communication across the network. | ||||
|  | ||||
|   Corresponding Source conveyed, and Installation Information provided, | ||||
| in accord with this section must be in a format that is publicly | ||||
| documented (and with an implementation available to the public in | ||||
| source code form), and must require no special password or key for | ||||
| unpacking, reading or copying. | ||||
|  | ||||
|   7. Additional Terms. | ||||
|  | ||||
|   "Additional permissions" are terms that supplement the terms of this | ||||
| License by making exceptions from one or more of its conditions. | ||||
| Additional permissions that are applicable to the entire Program shall | ||||
| be treated as though they were included in this License, to the extent | ||||
| that they are valid under applicable law.  If additional permissions | ||||
| apply only to part of the Program, that part may be used separately | ||||
| under those permissions, but the entire Program remains governed by | ||||
| this License without regard to the additional permissions. | ||||
|  | ||||
|   When you convey a copy of a covered work, you may at your option | ||||
| remove any additional permissions from that copy, or from any part of | ||||
| it.  (Additional permissions may be written to require their own | ||||
| removal in certain cases when you modify the work.)  You may place | ||||
| additional permissions on material, added by you to a covered work, | ||||
| for which you have or can give appropriate copyright permission. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, for material you | ||||
| add to a covered work, you may (if authorized by the copyright holders of | ||||
| that material) supplement the terms of this License with terms: | ||||
|  | ||||
|     a) Disclaiming warranty or limiting liability differently from the | ||||
|     terms of sections 15 and 16 of this License; or | ||||
|  | ||||
|     b) Requiring preservation of specified reasonable legal notices or | ||||
|     author attributions in that material or in the Appropriate Legal | ||||
|     Notices displayed by works containing it; or | ||||
|  | ||||
|     c) Prohibiting misrepresentation of the origin of that material, or | ||||
|     requiring that modified versions of such material be marked in | ||||
|     reasonable ways as different from the original version; or | ||||
|  | ||||
|     d) Limiting the use for publicity purposes of names of licensors or | ||||
|     authors of the material; or | ||||
|  | ||||
|     e) Declining to grant rights under trademark law for use of some | ||||
|     trade names, trademarks, or service marks; or | ||||
|  | ||||
|     f) Requiring indemnification of licensors and authors of that | ||||
|     material by anyone who conveys the material (or modified versions of | ||||
|     it) with contractual assumptions of liability to the recipient, for | ||||
|     any liability that these contractual assumptions directly impose on | ||||
|     those licensors and authors. | ||||
|  | ||||
|   All other non-permissive additional terms are considered "further | ||||
| restrictions" within the meaning of section 10.  If the Program as you | ||||
| received it, or any part of it, contains a notice stating that it is | ||||
| governed by this License along with a term that is a further | ||||
| restriction, you may remove that term.  If a license document contains | ||||
| a further restriction but permits relicensing or conveying under this | ||||
| License, you may add to a covered work material governed by the terms | ||||
| of that license document, provided that the further restriction does | ||||
| not survive such relicensing or conveying. | ||||
|  | ||||
|   If you add terms to a covered work in accord with this section, you | ||||
| must place, in the relevant source files, a statement of the | ||||
| additional terms that apply to those files, or a notice indicating | ||||
| where to find the applicable terms. | ||||
|  | ||||
|   Additional terms, permissive or non-permissive, may be stated in the | ||||
| form of a separately written license, or stated as exceptions; | ||||
| the above requirements apply either way. | ||||
|  | ||||
|   8. Termination. | ||||
|  | ||||
|   You may not propagate or modify a covered work except as expressly | ||||
| provided under this License.  Any attempt otherwise to propagate or | ||||
| modify it is void, and will automatically terminate your rights under | ||||
| this License (including any patent licenses granted under the third | ||||
| paragraph of section 11). | ||||
|  | ||||
|   However, if you cease all violation of this License, then your | ||||
| license from a particular copyright holder is reinstated (a) | ||||
| provisionally, unless and until the copyright holder explicitly and | ||||
| finally terminates your license, and (b) permanently, if the copyright | ||||
| holder fails to notify you of the violation by some reasonable means | ||||
| prior to 60 days after the cessation. | ||||
|  | ||||
|   Moreover, your license from a particular copyright holder is | ||||
| reinstated permanently if the copyright holder notifies you of the | ||||
| violation by some reasonable means, this is the first time you have | ||||
| received notice of violation of this License (for any work) from that | ||||
| copyright holder, and you cure the violation prior to 30 days after | ||||
| your receipt of the notice. | ||||
|  | ||||
|   Termination of your rights under this section does not terminate the | ||||
| licenses of parties who have received copies or rights from you under | ||||
| this License.  If your rights have been terminated and not permanently | ||||
| reinstated, you do not qualify to receive new licenses for the same | ||||
| material under section 10. | ||||
|  | ||||
|   9. Acceptance Not Required for Having Copies. | ||||
|  | ||||
|   You are not required to accept this License in order to receive or | ||||
| run a copy of the Program.  Ancillary propagation of a covered work | ||||
| occurring solely as a consequence of using peer-to-peer transmission | ||||
| to receive a copy likewise does not require acceptance.  However, | ||||
| nothing other than this License grants you permission to propagate or | ||||
| modify any covered work.  These actions infringe copyright if you do | ||||
| not accept this License.  Therefore, by modifying or propagating a | ||||
| covered work, you indicate your acceptance of this License to do so. | ||||
|  | ||||
|   10. Automatic Licensing of Downstream Recipients. | ||||
|  | ||||
|   Each time you convey a covered work, the recipient automatically | ||||
| receives a license from the original licensors, to run, modify and | ||||
| propagate that work, subject to this License.  You are not responsible | ||||
| for enforcing compliance by third parties with this License. | ||||
|  | ||||
|   An "entity transaction" is a transaction transferring control of an | ||||
| organization, or substantially all assets of one, or subdividing an | ||||
| organization, or merging organizations.  If propagation of a covered | ||||
| work results from an entity transaction, each party to that | ||||
| transaction who receives a copy of the work also receives whatever | ||||
| licenses to the work the party's predecessor in interest had or could | ||||
| give under the previous paragraph, plus a right to possession of the | ||||
| Corresponding Source of the work from the predecessor in interest, if | ||||
| the predecessor has it or can get it with reasonable efforts. | ||||
|  | ||||
|   You may not impose any further restrictions on the exercise of the | ||||
| rights granted or affirmed under this License.  For example, you may | ||||
| not impose a license fee, royalty, or other charge for exercise of | ||||
| rights granted under this License, and you may not initiate litigation | ||||
| (including a cross-claim or counterclaim in a lawsuit) alleging that | ||||
| any patent claim is infringed by making, using, selling, offering for | ||||
| sale, or importing the Program or any portion of it. | ||||
|  | ||||
|   11. Patents. | ||||
|  | ||||
|   A "contributor" is a copyright holder who authorizes use under this | ||||
| License of the Program or a work on which the Program is based.  The | ||||
| work thus licensed is called the contributor's "contributor version". | ||||
|  | ||||
|   A contributor's "essential patent claims" are all patent claims | ||||
| owned or controlled by the contributor, whether already acquired or | ||||
| hereafter acquired, that would be infringed by some manner, permitted | ||||
| by this License, of making, using, or selling its contributor version, | ||||
| but do not include claims that would be infringed only as a | ||||
| consequence of further modification of the contributor version.  For | ||||
| purposes of this definition, "control" includes the right to grant | ||||
| patent sublicenses in a manner consistent with the requirements of | ||||
| this License. | ||||
|  | ||||
|   Each contributor grants you a non-exclusive, worldwide, royalty-free | ||||
| patent license under the contributor's essential patent claims, to | ||||
| make, use, sell, offer for sale, import and otherwise run, modify and | ||||
| propagate the contents of its contributor version. | ||||
|  | ||||
|   In the following three paragraphs, a "patent license" is any express | ||||
| agreement or commitment, however denominated, not to enforce a patent | ||||
| (such as an express permission to practice a patent or covenant not to | ||||
| sue for patent infringement).  To "grant" such a patent license to a | ||||
| party means to make such an agreement or commitment not to enforce a | ||||
| patent against the party. | ||||
|  | ||||
|   If you convey a covered work, knowingly relying on a patent license, | ||||
| and the Corresponding Source of the work is not available for anyone | ||||
| to copy, free of charge and under the terms of this License, through a | ||||
| publicly available network server or other readily accessible means, | ||||
| then you must either (1) cause the Corresponding Source to be so | ||||
| available, or (2) arrange to deprive yourself of the benefit of the | ||||
| patent license for this particular work, or (3) arrange, in a manner | ||||
| consistent with the requirements of this License, to extend the patent | ||||
| license to downstream recipients.  "Knowingly relying" means you have | ||||
| actual knowledge that, but for the patent license, your conveying the | ||||
| covered work in a country, or your recipient's use of the covered work | ||||
| in a country, would infringe one or more identifiable patents in that | ||||
| country that you have reason to believe are valid. | ||||
|  | ||||
|   If, pursuant to or in connection with a single transaction or | ||||
| arrangement, you convey, or propagate by procuring conveyance of, a | ||||
| covered work, and grant a patent license to some of the parties | ||||
| receiving the covered work authorizing them to use, propagate, modify | ||||
| or convey a specific copy of the covered work, then the patent license | ||||
| you grant is automatically extended to all recipients of the covered | ||||
| work and works based on it. | ||||
|  | ||||
|   A patent license is "discriminatory" if it does not include within | ||||
| the scope of its coverage, prohibits the exercise of, or is | ||||
| conditioned on the non-exercise of one or more of the rights that are | ||||
| specifically granted under this License.  You may not convey a covered | ||||
| work if you are a party to an arrangement with a third party that is | ||||
| in the business of distributing software, under which you make payment | ||||
| to the third party based on the extent of your activity of conveying | ||||
| the work, and under which the third party grants, to any of the | ||||
| parties who would receive the covered work from you, a discriminatory | ||||
| patent license (a) in connection with copies of the covered work | ||||
| conveyed by you (or copies made from those copies), or (b) primarily | ||||
| for and in connection with specific products or compilations that | ||||
| contain the covered work, unless you entered into that arrangement, | ||||
| or that patent license was granted, prior to 28 March 2007. | ||||
|  | ||||
|   Nothing in this License shall be construed as excluding or limiting | ||||
| any implied license or other defenses to infringement that may | ||||
| otherwise be available to you under applicable patent law. | ||||
|  | ||||
|   12. No Surrender of Others' Freedom. | ||||
|  | ||||
|   If conditions are imposed on you (whether by court order, agreement or | ||||
| otherwise) that contradict the conditions of this License, they do not | ||||
| excuse you from the conditions of this License.  If you cannot convey a | ||||
| covered work so as to satisfy simultaneously your obligations under this | ||||
| License and any other pertinent obligations, then as a consequence you may | ||||
| not convey it at all.  For example, if you agree to terms that obligate you | ||||
| to collect a royalty for further conveying from those to whom you convey | ||||
| the Program, the only way you could satisfy both those terms and this | ||||
| License would be to refrain entirely from conveying the Program. | ||||
|  | ||||
|   13. Remote Network Interaction; Use with the GNU General Public License. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, if you modify the | ||||
| Program, your modified version must prominently offer all users | ||||
| interacting with it remotely through a computer network (if your version | ||||
| supports such interaction) an opportunity to receive the Corresponding | ||||
| Source of your version by providing access to the Corresponding Source | ||||
| from a network server at no charge, through some standard or customary | ||||
| means of facilitating copying of software.  This Corresponding Source | ||||
| shall include the Corresponding Source for any work covered by version 3 | ||||
| of the GNU General Public License that is incorporated pursuant to the | ||||
| following paragraph. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, you have | ||||
| permission to link or combine any covered work with a work licensed | ||||
| under version 3 of the GNU General Public License into a single | ||||
| combined work, and to convey the resulting work.  The terms of this | ||||
| License will continue to apply to the part which is the covered work, | ||||
| but the work with which it is combined will remain governed by version | ||||
| 3 of the GNU General Public License. | ||||
|  | ||||
|   14. Revised Versions of this License. | ||||
|  | ||||
|   The Free Software Foundation may publish revised and/or new versions of | ||||
| the GNU Affero General Public License from time to time.  Such new versions | ||||
| will be similar in spirit to the present version, but may differ in detail to | ||||
| address new problems or concerns. | ||||
|  | ||||
|   Each version is given a distinguishing version number.  If the | ||||
| Program specifies that a certain numbered version of the GNU Affero General | ||||
| Public License "or any later version" applies to it, you have the | ||||
| option of following the terms and conditions either of that numbered | ||||
| version or of any later version published by the Free Software | ||||
| Foundation.  If the Program does not specify a version number of the | ||||
| GNU Affero General Public License, you may choose any version ever published | ||||
| by the Free Software Foundation. | ||||
|  | ||||
|   If the Program specifies that a proxy can decide which future | ||||
| versions of the GNU Affero General Public License can be used, that proxy's | ||||
| public statement of acceptance of a version permanently authorizes you | ||||
| to choose that version for the Program. | ||||
|  | ||||
|   Later license versions may give you additional or different | ||||
| permissions.  However, no additional obligations are imposed on any | ||||
| author or copyright holder as a result of your choosing to follow a | ||||
| later version. | ||||
|  | ||||
|   15. Disclaimer of Warranty. | ||||
|  | ||||
|   THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY | ||||
| APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT | ||||
| HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY | ||||
| OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, | ||||
| THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||||
| PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM | ||||
| IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF | ||||
| ALL NECESSARY SERVICING, REPAIR OR CORRECTION. | ||||
|  | ||||
|   16. Limitation of Liability. | ||||
|  | ||||
|   IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS | ||||
| THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY | ||||
| GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE | ||||
| USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF | ||||
| DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD | ||||
| PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), | ||||
| EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF | ||||
| SUCH DAMAGES. | ||||
|  | ||||
|   17. Interpretation of Sections 15 and 16. | ||||
|  | ||||
|   If the disclaimer of warranty and limitation of liability provided | ||||
| above cannot be given local legal effect according to their terms, | ||||
| reviewing courts shall apply local law that most closely approximates | ||||
| an absolute waiver of all civil liability in connection with the | ||||
| Program, unless a warranty or assumption of liability accompanies a | ||||
| copy of the Program in return for a fee. | ||||
|  | ||||
|                      END OF TERMS AND CONDITIONS | ||||
|  | ||||
|             How to Apply These Terms to Your New Programs | ||||
|  | ||||
|   If you develop a new program, and you want it to be of the greatest | ||||
| possible use to the public, the best way to achieve this is to make it | ||||
| free software which everyone can redistribute and change under these terms. | ||||
|  | ||||
|   To do so, attach the following notices to the program.  It is safest | ||||
| to attach them to the start of each source file to most effectively | ||||
| state the exclusion of warranty; and each file should have at least | ||||
| the "copyright" line and a pointer to where the full notice is found. | ||||
|  | ||||
|     <one line to give the program's name and a brief idea of what it does.> | ||||
|     Copyright (C) <year>  <name of author> | ||||
|  | ||||
|     This program is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU Affero General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
|  | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU Affero General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU Affero General Public License | ||||
|     along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  | ||||
| Also add information on how to contact you by electronic and paper mail. | ||||
|  | ||||
|   If your software can interact with users remotely through a computer | ||||
| network, you should also make sure that it provides a way for users to | ||||
| get its source.  For example, if your program is a web application, its | ||||
| interface could display a "Source" link that leads users to an archive | ||||
| of the code.  There are many ways you could offer source, and different | ||||
| solutions will be better for different programs; see section 13 for the | ||||
| specific requirements. | ||||
|  | ||||
|   You should also get your employer (if you work as a programmer) or school, | ||||
| if any, to sign a "copyright disclaimer" for the program, if necessary. | ||||
| For more information on this, and how to apply and follow the GNU AGPL, see | ||||
| <http://www.gnu.org/licenses/>. | ||||
							
								
								
									
										420
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/client.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										420
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/client.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,420 @@ | ||||
| // Copyright 2013 The Gorilla WebSocket 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 websocket | ||||
|  | ||||
| import ( | ||||
| 	"bufio" | ||||
| 	"bytes" | ||||
| 	"crypto/tls" | ||||
| 	"encoding/base64" | ||||
| 	"errors" | ||||
| 	"io" | ||||
| 	"io/ioutil" | ||||
| 	"net" | ||||
| 	"net/http" | ||||
| 	"net/url" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| // ErrBadHandshake is returned when the server response to opening handshake is | ||||
| // invalid. | ||||
| var ErrBadHandshake = errors.New("websocket: bad handshake") | ||||
|  | ||||
| var errInvalidCompression = errors.New("websocket: invalid compression negotiation") | ||||
|  | ||||
| // NewClient creates a new client connection using the given net connection. | ||||
| // The URL u specifies the host and request URI. Use requestHeader to specify | ||||
| // the origin (Origin), subprotocols (Sec-WebSocket-Protocol) and cookies | ||||
| // (Cookie). Use the response.Header to get the selected subprotocol | ||||
| // (Sec-WebSocket-Protocol) and cookies (Set-Cookie). | ||||
| // | ||||
| // If the WebSocket handshake fails, ErrBadHandshake is returned along with a | ||||
| // non-nil *http.Response so that callers can handle redirects, authentication, | ||||
| // etc. | ||||
| // | ||||
| // Deprecated: Use Dialer instead. | ||||
| func NewClient(netConn net.Conn, u *url.URL, requestHeader http.Header, readBufSize, writeBufSize int) (c *Conn, response *http.Response, err error) { | ||||
| 	d := Dialer{ | ||||
| 		ReadBufferSize:  readBufSize, | ||||
| 		WriteBufferSize: writeBufSize, | ||||
| 		NetDial: func(net, addr string) (net.Conn, error) { | ||||
| 			return netConn, nil | ||||
| 		}, | ||||
| 	} | ||||
| 	return d.Dial(u.String(), requestHeader) | ||||
| } | ||||
|  | ||||
| // A Dialer contains options for connecting to WebSocket server. | ||||
| type Dialer struct { | ||||
| 	// NetDial specifies the dial function for creating TCP connections. If | ||||
| 	// NetDial is nil, net.Dial is used. | ||||
| 	NetDial func(network, addr string) (net.Conn, error) | ||||
|  | ||||
| 	// Proxy specifies a function to return a proxy for a given | ||||
| 	// Request. If the function returns a non-nil error, the | ||||
| 	// request is aborted with the provided error. | ||||
| 	// If Proxy is nil or returns a nil *URL, no proxy is used. | ||||
| 	Proxy func(*http.Request) (*url.URL, error) | ||||
|  | ||||
| 	// TLSClientConfig specifies the TLS configuration to use with tls.Client. | ||||
| 	// If nil, the default configuration is used. | ||||
| 	TLSClientConfig *tls.Config | ||||
|  | ||||
| 	// HandshakeTimeout specifies the duration for the handshake to complete. | ||||
| 	HandshakeTimeout time.Duration | ||||
|  | ||||
| 	// Input and output buffer sizes. If the buffer size is zero, then a | ||||
| 	// default value of 4096 is used. | ||||
| 	ReadBufferSize, WriteBufferSize int | ||||
|  | ||||
| 	// Subprotocols specifies the client's requested subprotocols. | ||||
| 	Subprotocols []string | ||||
|  | ||||
| 	// EnableCompression specifies if the client should attempt to negotiate | ||||
| 	// per message compression (RFC 7692). Setting this value to true does not | ||||
| 	// guarantee that compression will be supported. Currently only "no context | ||||
| 	// takeover" modes are supported. | ||||
| 	EnableCompression bool | ||||
|  | ||||
| 	// Jar specifies the cookie jar. | ||||
| 	// If Jar is nil, cookies are not sent in requests and ignored | ||||
| 	// in responses. | ||||
| 	Jar http.CookieJar | ||||
| } | ||||
|  | ||||
| var errMalformedURL = errors.New("malformed ws or wss URL") | ||||
|  | ||||
| // parseURL parses the URL. | ||||
| // | ||||
| // This function is a replacement for the standard library url.Parse function. | ||||
| // In Go 1.4 and earlier, url.Parse loses information from the path. | ||||
| func parseURL(s string) (*url.URL, error) { | ||||
| 	// From the RFC: | ||||
| 	// | ||||
| 	// ws-URI = "ws:" "//" host [ ":" port ] path [ "?" query ] | ||||
| 	// wss-URI = "wss:" "//" host [ ":" port ] path [ "?" query ] | ||||
| 	var u url.URL | ||||
| 	switch { | ||||
| 	case strings.HasPrefix(s, "ws://"): | ||||
| 		u.Scheme = "ws" | ||||
| 		s = s[len("ws://"):] | ||||
| 	case strings.HasPrefix(s, "wss://"): | ||||
| 		u.Scheme = "wss" | ||||
| 		s = s[len("wss://"):] | ||||
| 	default: | ||||
| 		return nil, errMalformedURL | ||||
| 	} | ||||
|  | ||||
| 	if i := strings.Index(s, "?"); i >= 0 { | ||||
| 		u.RawQuery = s[i+1:] | ||||
| 		s = s[:i] | ||||
| 	} | ||||
|  | ||||
| 	if i := strings.Index(s, "/"); i >= 0 { | ||||
| 		u.Opaque = s[i:] | ||||
| 		s = s[:i] | ||||
| 	} else { | ||||
| 		u.Opaque = "/" | ||||
| 	} | ||||
|  | ||||
| 	u.Host = s | ||||
|  | ||||
| 	if strings.Contains(u.Host, "@") { | ||||
| 		// Don't bother parsing user information because user information is | ||||
| 		// not allowed in websocket URIs. | ||||
| 		return nil, errMalformedURL | ||||
| 	} | ||||
|  | ||||
| 	return &u, nil | ||||
| } | ||||
|  | ||||
| func hostPortNoPort(u *url.URL) (hostPort, hostNoPort string) { | ||||
| 	hostPort = u.Host | ||||
| 	hostNoPort = u.Host | ||||
| 	if i := strings.LastIndex(u.Host, ":"); i > strings.LastIndex(u.Host, "]") { | ||||
| 		hostNoPort = hostNoPort[:i] | ||||
| 	} else { | ||||
| 		switch u.Scheme { | ||||
| 		case "wss": | ||||
| 			hostPort += ":443" | ||||
| 		case "https": | ||||
| 			hostPort += ":443" | ||||
| 		default: | ||||
| 			hostPort += ":80" | ||||
| 		} | ||||
| 	} | ||||
| 	return hostPort, hostNoPort | ||||
| } | ||||
|  | ||||
| // DefaultDialer is a dialer with all fields set to the default zero values. | ||||
| var DefaultDialer = &Dialer{ | ||||
| 	Proxy: http.ProxyFromEnvironment, | ||||
| } | ||||
|  | ||||
| // Dial creates a new client connection. Use requestHeader to specify the | ||||
| // origin (Origin), subprotocols (Sec-WebSocket-Protocol) and cookies (Cookie). | ||||
| // Use the response.Header to get the selected subprotocol | ||||
| // (Sec-WebSocket-Protocol) and cookies (Set-Cookie). | ||||
| // | ||||
| // If the WebSocket handshake fails, ErrBadHandshake is returned along with a | ||||
| // non-nil *http.Response so that callers can handle redirects, authentication, | ||||
| // etcetera. The response body may not contain the entire response and does not | ||||
| // need to be closed by the application. | ||||
| func (d *Dialer) Dial(urlStr string, requestHeader http.Header) (*Conn, *http.Response, error) { | ||||
|  | ||||
| 	if d == nil { | ||||
| 		d = &Dialer{ | ||||
| 			Proxy: http.ProxyFromEnvironment, | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	challengeKey, err := generateChallengeKey() | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	u, err := parseURL(urlStr) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	switch u.Scheme { | ||||
| 	case "ws": | ||||
| 		u.Scheme = "http" | ||||
| 	case "wss": | ||||
| 		u.Scheme = "https" | ||||
| 	default: | ||||
| 		return nil, nil, errMalformedURL | ||||
| 	} | ||||
|  | ||||
| 	if u.User != nil { | ||||
| 		// User name and password are not allowed in websocket URIs. | ||||
| 		return nil, nil, errMalformedURL | ||||
| 	} | ||||
|  | ||||
| 	req := &http.Request{ | ||||
| 		Method:     "GET", | ||||
| 		URL:        u, | ||||
| 		Proto:      "HTTP/1.1", | ||||
| 		ProtoMajor: 1, | ||||
| 		ProtoMinor: 1, | ||||
| 		Header:     make(http.Header), | ||||
| 		Host:       u.Host, | ||||
| 	} | ||||
|  | ||||
| 	// Set the cookies present in the cookie jar of the dialer | ||||
| 	if d.Jar != nil { | ||||
| 		for _, cookie := range d.Jar.Cookies(u) { | ||||
| 			req.AddCookie(cookie) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Set the request headers using the capitalization for names and values in | ||||
| 	// RFC examples. Although the capitalization shouldn't matter, there are | ||||
| 	// servers that depend on it. The Header.Set method is not used because the | ||||
| 	// method canonicalizes the header names. | ||||
| 	req.Header["Upgrade"] = []string{"websocket"} | ||||
| 	req.Header["Connection"] = []string{"Upgrade"} | ||||
| 	req.Header["Sec-WebSocket-Key"] = []string{challengeKey} | ||||
| 	req.Header["Sec-WebSocket-Version"] = []string{"13"} | ||||
| 	if len(d.Subprotocols) > 0 { | ||||
| 		req.Header["Sec-WebSocket-Protocol"] = []string{strings.Join(d.Subprotocols, ", ")} | ||||
| 	} | ||||
| 	for k, vs := range requestHeader { | ||||
| 		switch { | ||||
| 		case k == "Host": | ||||
| 			if len(vs) > 0 { | ||||
| 				req.Host = vs[0] | ||||
| 			} | ||||
| 		case k == "Upgrade" || | ||||
| 			k == "Connection" || | ||||
| 			k == "Sec-Websocket-Key" || | ||||
| 			k == "Sec-Websocket-Version" || | ||||
| 			k == "Sec-Websocket-Extensions" || | ||||
| 			(k == "Sec-Websocket-Protocol" && len(d.Subprotocols) > 0): | ||||
| 			return nil, nil, errors.New("websocket: duplicate header not allowed: " + k) | ||||
| 		default: | ||||
| 			req.Header[k] = vs | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if d.EnableCompression { | ||||
| 		req.Header.Set("Sec-Websocket-Extensions", "permessage-deflate; server_no_context_takeover; client_no_context_takeover") | ||||
| 	} | ||||
|  | ||||
| 	hostPort, hostNoPort := hostPortNoPort(u) | ||||
|  | ||||
| 	var proxyURL *url.URL | ||||
| 	// Check wether the proxy method has been configured | ||||
| 	if d.Proxy != nil { | ||||
| 		proxyURL, err = d.Proxy(req) | ||||
| 	} | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	var targetHostPort string | ||||
| 	if proxyURL != nil { | ||||
| 		targetHostPort, _ = hostPortNoPort(proxyURL) | ||||
| 	} else { | ||||
| 		targetHostPort = hostPort | ||||
| 	} | ||||
|  | ||||
| 	var deadline time.Time | ||||
| 	if d.HandshakeTimeout != 0 { | ||||
| 		deadline = time.Now().Add(d.HandshakeTimeout) | ||||
| 	} | ||||
|  | ||||
| 	netDial := d.NetDial | ||||
| 	if netDial == nil { | ||||
| 		netDialer := &net.Dialer{Deadline: deadline} | ||||
| 		netDial = netDialer.Dial | ||||
| 	} | ||||
|  | ||||
| 	netConn, err := netDial("tcp", targetHostPort) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	defer func() { | ||||
| 		if netConn != nil { | ||||
| 			netConn.Close() | ||||
| 		} | ||||
| 	}() | ||||
|  | ||||
| 	if err := netConn.SetDeadline(deadline); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	if proxyURL != nil { | ||||
| 		connectHeader := make(http.Header) | ||||
| 		if user := proxyURL.User; user != nil { | ||||
| 			proxyUser := user.Username() | ||||
| 			if proxyPassword, passwordSet := user.Password(); passwordSet { | ||||
| 				credential := base64.StdEncoding.EncodeToString([]byte(proxyUser + ":" + proxyPassword)) | ||||
| 				connectHeader.Set("Proxy-Authorization", "Basic "+credential) | ||||
| 			} | ||||
| 		} | ||||
| 		connectReq := &http.Request{ | ||||
| 			Method: "CONNECT", | ||||
| 			URL:    &url.URL{Opaque: hostPort}, | ||||
| 			Host:   hostPort, | ||||
| 			Header: connectHeader, | ||||
| 		} | ||||
|  | ||||
| 		connectReq.Write(netConn) | ||||
|  | ||||
| 		// Read response. | ||||
| 		// Okay to use and discard buffered reader here, because | ||||
| 		// TLS server will not speak until spoken to. | ||||
| 		br := bufio.NewReader(netConn) | ||||
| 		resp, err := http.ReadResponse(br, connectReq) | ||||
| 		if err != nil { | ||||
| 			return nil, nil, err | ||||
| 		} | ||||
| 		if resp.StatusCode != 200 { | ||||
| 			f := strings.SplitN(resp.Status, " ", 2) | ||||
| 			return nil, nil, errors.New(f[1]) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if u.Scheme == "https" { | ||||
| 		cfg := cloneTLSConfig(d.TLSClientConfig) | ||||
| 		if cfg.ServerName == "" { | ||||
| 			cfg.ServerName = hostNoPort | ||||
| 		} | ||||
| 		tlsConn := tls.Client(netConn, cfg) | ||||
| 		netConn = tlsConn | ||||
| 		if err := tlsConn.Handshake(); err != nil { | ||||
| 			return nil, nil, err | ||||
| 		} | ||||
| 		if !cfg.InsecureSkipVerify { | ||||
| 			if err := tlsConn.VerifyHostname(cfg.ServerName); err != nil { | ||||
| 				return nil, nil, err | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	conn := newConn(netConn, false, d.ReadBufferSize, d.WriteBufferSize) | ||||
|  | ||||
| 	if err := req.Write(netConn); err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	resp, err := http.ReadResponse(conn.br, req) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	if d.Jar != nil { | ||||
| 		if rc := resp.Cookies(); len(rc) > 0 { | ||||
| 			d.Jar.SetCookies(u, rc) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if resp.StatusCode != 101 || | ||||
| 		!strings.EqualFold(resp.Header.Get("Upgrade"), "websocket") || | ||||
| 		!strings.EqualFold(resp.Header.Get("Connection"), "upgrade") || | ||||
| 		resp.Header.Get("Sec-Websocket-Accept") != computeAcceptKey(challengeKey) { | ||||
| 		// Before closing the network connection on return from this | ||||
| 		// function, slurp up some of the response to aid application | ||||
| 		// debugging. | ||||
| 		buf := make([]byte, 1024) | ||||
| 		n, _ := io.ReadFull(resp.Body, buf) | ||||
| 		resp.Body = ioutil.NopCloser(bytes.NewReader(buf[:n])) | ||||
| 		return nil, resp, ErrBadHandshake | ||||
| 	} | ||||
|  | ||||
| 	for _, ext := range parseExtensions(req.Header) { | ||||
| 		if ext[""] != "permessage-deflate" { | ||||
| 			continue | ||||
| 		} | ||||
| 		_, snct := ext["server_no_context_takeover"] | ||||
| 		_, cnct := ext["client_no_context_takeover"] | ||||
| 		if !snct || !cnct { | ||||
| 			return nil, resp, errInvalidCompression | ||||
| 		} | ||||
| 		conn.newCompressionWriter = compressNoContextTakeover | ||||
| 		conn.newDecompressionReader = decompressNoContextTakeover | ||||
| 		break | ||||
| 	} | ||||
|  | ||||
| 	resp.Body = ioutil.NopCloser(bytes.NewReader([]byte{})) | ||||
| 	conn.subprotocol = resp.Header.Get("Sec-Websocket-Protocol") | ||||
|  | ||||
| 	netConn.SetDeadline(time.Time{}) | ||||
| 	netConn = nil // to avoid close in defer. | ||||
| 	return conn, resp, nil | ||||
| } | ||||
|  | ||||
| // cloneTLSConfig clones all public fields except the fields | ||||
| // SessionTicketsDisabled and SessionTicketKey. This avoids copying the | ||||
| // sync.Mutex in the sync.Once and makes it safe to call cloneTLSConfig on a | ||||
| // config in active use. | ||||
| func cloneTLSConfig(cfg *tls.Config) *tls.Config { | ||||
| 	if cfg == nil { | ||||
| 		return &tls.Config{} | ||||
| 	} | ||||
| 	return &tls.Config{ | ||||
| 		Rand:                     cfg.Rand, | ||||
| 		Time:                     cfg.Time, | ||||
| 		Certificates:             cfg.Certificates, | ||||
| 		NameToCertificate:        cfg.NameToCertificate, | ||||
| 		GetCertificate:           cfg.GetCertificate, | ||||
| 		RootCAs:                  cfg.RootCAs, | ||||
| 		NextProtos:               cfg.NextProtos, | ||||
| 		ServerName:               cfg.ServerName, | ||||
| 		ClientAuth:               cfg.ClientAuth, | ||||
| 		ClientCAs:                cfg.ClientCAs, | ||||
| 		InsecureSkipVerify:       cfg.InsecureSkipVerify, | ||||
| 		CipherSuites:             cfg.CipherSuites, | ||||
| 		PreferServerCipherSuites: cfg.PreferServerCipherSuites, | ||||
| 		ClientSessionCache:       cfg.ClientSessionCache, | ||||
| 		MinVersion:               cfg.MinVersion, | ||||
| 		MaxVersion:               cfg.MaxVersion, | ||||
| 		CurvePreferences:         cfg.CurvePreferences, | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										105
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/compression.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/compression.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| // Copyright 2017 The Gorilla WebSocket 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 websocket | ||||
|  | ||||
| import ( | ||||
| 	"compress/flate" | ||||
| 	"errors" | ||||
| 	"io" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	flateWriterPool = sync.Pool{} | ||||
| ) | ||||
|  | ||||
| func decompressNoContextTakeover(r io.Reader) io.Reader { | ||||
| 	const tail = | ||||
| 	// Add four bytes as specified in RFC | ||||
| 	"\x00\x00\xff\xff" + | ||||
| 		// Add final block to squelch unexpected EOF error from flate reader. | ||||
| 		"\x01\x00\x00\xff\xff" | ||||
| 	return flate.NewReader(io.MultiReader(r, strings.NewReader(tail))) | ||||
| } | ||||
|  | ||||
| func compressNoContextTakeover(w io.WriteCloser) (io.WriteCloser, error) { | ||||
| 	tw := &truncWriter{w: w} | ||||
| 	i := flateWriterPool.Get() | ||||
| 	var fw *flate.Writer | ||||
| 	var err error | ||||
| 	if i == nil { | ||||
| 		fw, err = flate.NewWriter(tw, 3) | ||||
| 	} else { | ||||
| 		fw = i.(*flate.Writer) | ||||
| 		fw.Reset(tw) | ||||
| 	} | ||||
| 	return &flateWrapper{fw: fw, tw: tw}, err | ||||
| } | ||||
|  | ||||
| // truncWriter is an io.Writer that writes all but the last four bytes of the | ||||
| // stream to another io.Writer. | ||||
| type truncWriter struct { | ||||
| 	w io.WriteCloser | ||||
| 	n int | ||||
| 	p [4]byte | ||||
| } | ||||
|  | ||||
| func (w *truncWriter) Write(p []byte) (int, error) { | ||||
| 	n := 0 | ||||
|  | ||||
| 	// fill buffer first for simplicity. | ||||
| 	if w.n < len(w.p) { | ||||
| 		n = copy(w.p[w.n:], p) | ||||
| 		p = p[n:] | ||||
| 		w.n += n | ||||
| 		if len(p) == 0 { | ||||
| 			return n, nil | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	m := len(p) | ||||
| 	if m > len(w.p) { | ||||
| 		m = len(w.p) | ||||
| 	} | ||||
|  | ||||
| 	if nn, err := w.w.Write(w.p[:m]); err != nil { | ||||
| 		return n + nn, err | ||||
| 	} | ||||
|  | ||||
| 	copy(w.p[:], w.p[m:]) | ||||
| 	copy(w.p[len(w.p)-m:], p[len(p)-m:]) | ||||
| 	nn, err := w.w.Write(p[:len(p)-m]) | ||||
| 	return n + nn, err | ||||
| } | ||||
|  | ||||
| type flateWrapper struct { | ||||
| 	fw *flate.Writer | ||||
| 	tw *truncWriter | ||||
| } | ||||
|  | ||||
| func (w *flateWrapper) Write(p []byte) (int, error) { | ||||
| 	if w.fw == nil { | ||||
| 		return 0, errWriteClosed | ||||
| 	} | ||||
| 	return w.fw.Write(p) | ||||
| } | ||||
|  | ||||
| func (w *flateWrapper) Close() error { | ||||
| 	if w.fw == nil { | ||||
| 		return errWriteClosed | ||||
| 	} | ||||
| 	err1 := w.fw.Flush() | ||||
| 	flateWriterPool.Put(w.fw) | ||||
| 	w.fw = nil | ||||
| 	if w.tw.p != [4]byte{0, 0, 0xff, 0xff} { | ||||
| 		return errors.New("websocket: internal error, unexpected bytes at end of flate stream") | ||||
| 	} | ||||
| 	err2 := w.tw.w.Close() | ||||
| 	if err1 != nil { | ||||
| 		return err1 | ||||
| 	} | ||||
| 	return err2 | ||||
| } | ||||
							
								
								
									
										1043
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/conn.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1043
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/conn.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										18
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/conn_read.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/conn_read.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| // Copyright 2016 The Gorilla WebSocket Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| // +build go1.5 | ||||
|  | ||||
| package websocket | ||||
|  | ||||
| import "io" | ||||
|  | ||||
| func (c *Conn) read(n int) ([]byte, error) { | ||||
| 	p, err := c.br.Peek(n) | ||||
| 	if err == io.EOF { | ||||
| 		err = errUnexpectedEOF | ||||
| 	} | ||||
| 	c.br.Discard(len(p)) | ||||
| 	return p, err | ||||
| } | ||||
							
								
								
									
										21
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/conn_read_legacy.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/conn_read_legacy.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| // Copyright 2016 The Gorilla WebSocket Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| // +build !go1.5 | ||||
|  | ||||
| package websocket | ||||
|  | ||||
| import "io" | ||||
|  | ||||
| func (c *Conn) read(n int) ([]byte, error) { | ||||
| 	p, err := c.br.Peek(n) | ||||
| 	if err == io.EOF { | ||||
| 		err = errUnexpectedEOF | ||||
| 	} | ||||
| 	if len(p) > 0 { | ||||
| 		// advance over the bytes just read | ||||
| 		io.ReadFull(c.br, p) | ||||
| 	} | ||||
| 	return p, err | ||||
| } | ||||
							
								
								
									
										173
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										173
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,173 @@ | ||||
| // Copyright 2013 The Gorilla WebSocket 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 websocket implements the WebSocket protocol defined in RFC 6455. | ||||
| // | ||||
| // Overview | ||||
| // | ||||
| // The Conn type represents a WebSocket connection. A server application uses | ||||
| // the Upgrade function from an Upgrader object with a HTTP request handler | ||||
| // to get a pointer to a Conn: | ||||
| // | ||||
| //  var upgrader = websocket.Upgrader{ | ||||
| //      ReadBufferSize:  1024, | ||||
| //      WriteBufferSize: 1024, | ||||
| //  } | ||||
| // | ||||
| //  func handler(w http.ResponseWriter, r *http.Request) { | ||||
| //      conn, err := upgrader.Upgrade(w, r, nil) | ||||
| //      if err != nil { | ||||
| //          log.Println(err) | ||||
| //          return | ||||
| //      } | ||||
| //      ... Use conn to send and receive messages. | ||||
| //  } | ||||
| // | ||||
| // Call the connection's WriteMessage and ReadMessage methods to send and | ||||
| // receive messages as a slice of bytes. This snippet of code shows how to echo | ||||
| // messages using these methods: | ||||
| // | ||||
| //  for { | ||||
| //      messageType, p, err := conn.ReadMessage() | ||||
| //      if err != nil { | ||||
| //          return | ||||
| //      } | ||||
| //      if err = conn.WriteMessage(messageType, p); err != nil { | ||||
| //          return err | ||||
| //      } | ||||
| //  } | ||||
| // | ||||
| // In above snippet of code, p is a []byte and messageType is an int with value | ||||
| // websocket.BinaryMessage or websocket.TextMessage. | ||||
| // | ||||
| // An application can also send and receive messages using the io.WriteCloser | ||||
| // and io.Reader interfaces. To send a message, call the connection NextWriter | ||||
| // method to get an io.WriteCloser, write the message to the writer and close | ||||
| // the writer when done. To receive a message, call the connection NextReader | ||||
| // method to get an io.Reader and read until io.EOF is returned. This snippet | ||||
| // shows how to echo messages using the NextWriter and NextReader methods: | ||||
| // | ||||
| //  for { | ||||
| //      messageType, r, err := conn.NextReader() | ||||
| //      if err != nil { | ||||
| //          return | ||||
| //      } | ||||
| //      w, err := conn.NextWriter(messageType) | ||||
| //      if err != nil { | ||||
| //          return err | ||||
| //      } | ||||
| //      if _, err := io.Copy(w, r); err != nil { | ||||
| //          return err | ||||
| //      } | ||||
| //      if err := w.Close(); err != nil { | ||||
| //          return err | ||||
| //      } | ||||
| //  } | ||||
| // | ||||
| // Data Messages | ||||
| // | ||||
| // The WebSocket protocol distinguishes between text and binary data messages. | ||||
| // Text messages are interpreted as UTF-8 encoded text. The interpretation of | ||||
| // binary messages is left to the application. | ||||
| // | ||||
| // This package uses the TextMessage and BinaryMessage integer constants to | ||||
| // identify the two data message types. The ReadMessage and NextReader methods | ||||
| // return the type of the received message. The messageType argument to the | ||||
| // WriteMessage and NextWriter methods specifies the type of a sent message. | ||||
| // | ||||
| // It is the application's responsibility to ensure that text messages are | ||||
| // valid UTF-8 encoded text. | ||||
| // | ||||
| // Control Messages | ||||
| // | ||||
| // The WebSocket protocol defines three types of control messages: close, ping | ||||
| // and pong. Call the connection WriteControl, WriteMessage or NextWriter | ||||
| // methods to send a control message to the peer. | ||||
| // | ||||
| // Connections handle received close messages by sending a close message to the | ||||
| // peer and returning a *CloseError from the the NextReader, ReadMessage or the | ||||
| // message Read method. | ||||
| // | ||||
| // Connections handle received ping and pong messages by invoking callback | ||||
| // functions set with SetPingHandler and SetPongHandler methods. The callback | ||||
| // functions are called from the NextReader, ReadMessage and the message Read | ||||
| // methods. | ||||
| // | ||||
| // The default ping handler sends a pong to the peer. The application's reading | ||||
| // goroutine can block for a short time while the handler writes the pong data | ||||
| // to the connection. | ||||
| // | ||||
| // The application must read the connection to process ping, pong and close | ||||
| // messages sent from the peer. If the application is not otherwise interested | ||||
| // in messages from the peer, then the application should start a goroutine to | ||||
| // read and discard messages from the peer. A simple example is: | ||||
| // | ||||
| //  func readLoop(c *websocket.Conn) { | ||||
| //      for { | ||||
| //          if _, _, err := c.NextReader(); err != nil { | ||||
| //              c.Close() | ||||
| //              break | ||||
| //          } | ||||
| //      } | ||||
| //  } | ||||
| // | ||||
| // Concurrency | ||||
| // | ||||
| // Connections support one concurrent reader and one concurrent writer. | ||||
| // | ||||
| // Applications are responsible for ensuring that no more than one goroutine | ||||
| // calls the write methods (NextWriter, SetWriteDeadline, WriteMessage, | ||||
| // WriteJSON) concurrently and that no more than one goroutine calls the read | ||||
| // methods (NextReader, SetReadDeadline, ReadMessage, ReadJSON, SetPongHandler, | ||||
| // SetPingHandler) concurrently. | ||||
| // | ||||
| // The Close and WriteControl methods can be called concurrently with all other | ||||
| // methods. | ||||
| // | ||||
| // Origin Considerations | ||||
| // | ||||
| // Web browsers allow Javascript applications to open a WebSocket connection to | ||||
| // any host. It's up to the server to enforce an origin policy using the Origin | ||||
| // request header sent by the browser. | ||||
| // | ||||
| // The Upgrader calls the function specified in the CheckOrigin field to check | ||||
| // the origin. If the CheckOrigin function returns false, then the Upgrade | ||||
| // method fails the WebSocket handshake with HTTP status 403. | ||||
| // | ||||
| // If the CheckOrigin field is nil, then the Upgrader uses a safe default: fail | ||||
| // the handshake if the Origin request header is present and not equal to the | ||||
| // Host request header. | ||||
| // | ||||
| // An application can allow connections from any origin by specifying a | ||||
| // function that always returns true: | ||||
| // | ||||
| //  var upgrader = websocket.Upgrader{ | ||||
| //      CheckOrigin: func(r *http.Request) bool { return true }, | ||||
| //  } | ||||
| // | ||||
| // The deprecated Upgrade function does not enforce an origin policy. It's the | ||||
| // application's responsibility to check the Origin header before calling | ||||
| // Upgrade. | ||||
| // | ||||
| // Compression [Experimental] | ||||
| // | ||||
| // Per message compression extensions (RFC 7692) are experimentally supported | ||||
| // by this package in a limited capacity. Setting the EnableCompression option | ||||
| // to true in Dialer or Upgrader will attempt to negotiate per message deflate | ||||
| // support. If compression was successfully negotiated with the connection's | ||||
| // peer, any message received in compressed form will be automatically | ||||
| // decompressed. All Read methods will return uncompressed bytes. | ||||
| // | ||||
| // Per message compression of messages written to a connection can be enabled | ||||
| // or disabled by calling the corresponding Conn method: | ||||
| // | ||||
| // conn.EnableWriteCompression(true) | ||||
| // | ||||
| // Currently this package does not support compression with "context takeover". | ||||
| // This means that messages must be compressed and decompressed in isolation, | ||||
| // without retaining sliding window or dictionary state across messages. For | ||||
| // more details refer to RFC 7692. | ||||
| // | ||||
| // Use of compression is experimental and may result in decreased performance. | ||||
| package websocket | ||||
							
								
								
									
										248
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/examples/autobahn/server.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										248
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/examples/autobahn/server.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,248 @@ | ||||
| // Copyright 2013 The Gorilla WebSocket Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| // Command server is a test server for the Autobahn WebSockets Test Suite. | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"flag" | ||||
| 	"io" | ||||
| 	"log" | ||||
| 	"net/http" | ||||
| 	"time" | ||||
| 	"unicode/utf8" | ||||
|  | ||||
| 	"github.com/gorilla/websocket" | ||||
| ) | ||||
|  | ||||
| var upgrader = websocket.Upgrader{ | ||||
| 	ReadBufferSize:    4096, | ||||
| 	WriteBufferSize:   4096, | ||||
| 	EnableCompression: true, | ||||
| 	CheckOrigin: func(r *http.Request) bool { | ||||
| 		return true | ||||
| 	}, | ||||
| } | ||||
|  | ||||
| // echoCopy echoes messages from the client using io.Copy. | ||||
| func echoCopy(w http.ResponseWriter, r *http.Request, writerOnly bool) { | ||||
| 	conn, err := upgrader.Upgrade(w, r, nil) | ||||
| 	if err != nil { | ||||
| 		log.Println("Upgrade:", err) | ||||
| 		return | ||||
| 	} | ||||
| 	defer conn.Close() | ||||
| 	for { | ||||
| 		mt, r, err := conn.NextReader() | ||||
| 		if err != nil { | ||||
| 			if err != io.EOF { | ||||
| 				log.Println("NextReader:", err) | ||||
| 			} | ||||
| 			return | ||||
| 		} | ||||
| 		if mt == websocket.TextMessage { | ||||
| 			r = &validator{r: r} | ||||
| 		} | ||||
| 		w, err := conn.NextWriter(mt) | ||||
| 		if err != nil { | ||||
| 			log.Println("NextWriter:", err) | ||||
| 			return | ||||
| 		} | ||||
| 		if mt == websocket.TextMessage { | ||||
| 			r = &validator{r: r} | ||||
| 		} | ||||
| 		if writerOnly { | ||||
| 			_, err = io.Copy(struct{ io.Writer }{w}, r) | ||||
| 		} else { | ||||
| 			_, err = io.Copy(w, r) | ||||
| 		} | ||||
| 		if err != nil { | ||||
| 			if err == errInvalidUTF8 { | ||||
| 				conn.WriteControl(websocket.CloseMessage, | ||||
| 					websocket.FormatCloseMessage(websocket.CloseInvalidFramePayloadData, ""), | ||||
| 					time.Time{}) | ||||
| 			} | ||||
| 			log.Println("Copy:", err) | ||||
| 			return | ||||
| 		} | ||||
| 		err = w.Close() | ||||
| 		if err != nil { | ||||
| 			log.Println("Close:", err) | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func echoCopyWriterOnly(w http.ResponseWriter, r *http.Request) { | ||||
| 	echoCopy(w, r, true) | ||||
| } | ||||
|  | ||||
| func echoCopyFull(w http.ResponseWriter, r *http.Request) { | ||||
| 	echoCopy(w, r, false) | ||||
| } | ||||
|  | ||||
| // echoReadAll echoes messages from the client by reading the entire message | ||||
| // with ioutil.ReadAll. | ||||
| func echoReadAll(w http.ResponseWriter, r *http.Request, writeMessage bool) { | ||||
| 	conn, err := upgrader.Upgrade(w, r, nil) | ||||
| 	if err != nil { | ||||
| 		log.Println("Upgrade:", err) | ||||
| 		return | ||||
| 	} | ||||
| 	defer conn.Close() | ||||
| 	for { | ||||
| 		mt, b, err := conn.ReadMessage() | ||||
| 		if err != nil { | ||||
| 			if err != io.EOF { | ||||
| 				log.Println("NextReader:", err) | ||||
| 			} | ||||
| 			return | ||||
| 		} | ||||
| 		if mt == websocket.TextMessage { | ||||
| 			if !utf8.Valid(b) { | ||||
| 				conn.WriteControl(websocket.CloseMessage, | ||||
| 					websocket.FormatCloseMessage(websocket.CloseInvalidFramePayloadData, ""), | ||||
| 					time.Time{}) | ||||
| 				log.Println("ReadAll: invalid utf8") | ||||
| 			} | ||||
| 		} | ||||
| 		if writeMessage { | ||||
| 			err = conn.WriteMessage(mt, b) | ||||
| 			if err != nil { | ||||
| 				log.Println("WriteMessage:", err) | ||||
| 			} | ||||
| 		} else { | ||||
| 			w, err := conn.NextWriter(mt) | ||||
| 			if err != nil { | ||||
| 				log.Println("NextWriter:", err) | ||||
| 				return | ||||
| 			} | ||||
| 			if _, err := w.Write(b); err != nil { | ||||
| 				log.Println("Writer:", err) | ||||
| 				return | ||||
| 			} | ||||
| 			if err := w.Close(); err != nil { | ||||
| 				log.Println("Close:", err) | ||||
| 				return | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func echoReadAllWriter(w http.ResponseWriter, r *http.Request) { | ||||
| 	echoReadAll(w, r, false) | ||||
| } | ||||
|  | ||||
| func echoReadAllWriteMessage(w http.ResponseWriter, r *http.Request) { | ||||
| 	echoReadAll(w, r, true) | ||||
| } | ||||
|  | ||||
| func serveHome(w http.ResponseWriter, r *http.Request) { | ||||
| 	if r.URL.Path != "/" { | ||||
| 		http.Error(w, "Not found.", 404) | ||||
| 		return | ||||
| 	} | ||||
| 	if r.Method != "GET" { | ||||
| 		http.Error(w, "Method not allowed", 405) | ||||
| 		return | ||||
| 	} | ||||
| 	w.Header().Set("Content-Type", "text/html; charset=utf-8") | ||||
| 	io.WriteString(w, "<html><body>Echo Server</body></html>") | ||||
| } | ||||
|  | ||||
| var addr = flag.String("addr", ":9000", "http service address") | ||||
|  | ||||
| func main() { | ||||
| 	flag.Parse() | ||||
| 	http.HandleFunc("/", serveHome) | ||||
| 	http.HandleFunc("/c", echoCopyWriterOnly) | ||||
| 	http.HandleFunc("/f", echoCopyFull) | ||||
| 	http.HandleFunc("/r", echoReadAllWriter) | ||||
| 	http.HandleFunc("/m", echoReadAllWriteMessage) | ||||
| 	err := http.ListenAndServe(*addr, nil) | ||||
| 	if err != nil { | ||||
| 		log.Fatal("ListenAndServe: ", err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| type validator struct { | ||||
| 	state int | ||||
| 	x     rune | ||||
| 	r     io.Reader | ||||
| } | ||||
|  | ||||
| var errInvalidUTF8 = errors.New("invalid utf8") | ||||
|  | ||||
| func (r *validator) Read(p []byte) (int, error) { | ||||
| 	n, err := r.r.Read(p) | ||||
| 	state := r.state | ||||
| 	x := r.x | ||||
| 	for _, b := range p[:n] { | ||||
| 		state, x = decode(state, x, b) | ||||
| 		if state == utf8Reject { | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 	r.state = state | ||||
| 	r.x = x | ||||
| 	if state == utf8Reject || (err == io.EOF && state != utf8Accept) { | ||||
| 		return n, errInvalidUTF8 | ||||
| 	} | ||||
| 	return n, err | ||||
| } | ||||
|  | ||||
| // UTF-8 decoder from http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ | ||||
| // | ||||
| // Copyright (c) 2008-2009 Bjoern Hoehrmann <bjoern@hoehrmann.de> | ||||
| // | ||||
| // Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| // of this software and associated documentation files (the "Software"), to | ||||
| // deal in the Software without restriction, including without limitation the | ||||
| // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | ||||
| // sell copies of the Software, and to permit persons to whom the Software is | ||||
| // furnished to do so, subject to the following conditions: | ||||
| // | ||||
| // The above copyright notice and this permission notice shall be included in | ||||
| // all copies or substantial portions of the Software. | ||||
| // | ||||
| // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||||
| // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | ||||
| // IN THE SOFTWARE. | ||||
| var utf8d = [...]byte{ | ||||
| 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 00..1f | ||||
| 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20..3f | ||||
| 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 40..5f | ||||
| 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 60..7f | ||||
| 	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 80..9f | ||||
| 	7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // a0..bf | ||||
| 	8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // c0..df | ||||
| 	0xa, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x3, 0x3, // e0..ef | ||||
| 	0xb, 0x6, 0x6, 0x6, 0x5, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, // f0..ff | ||||
| 	0x0, 0x1, 0x2, 0x3, 0x5, 0x8, 0x7, 0x1, 0x1, 0x1, 0x4, 0x6, 0x1, 0x1, 0x1, 0x1, // s0..s0 | ||||
| 	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, // s1..s2 | ||||
| 	1, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, // s3..s4 | ||||
| 	1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, // s5..s6 | ||||
| 	1, 3, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // s7..s8 | ||||
| } | ||||
|  | ||||
| const ( | ||||
| 	utf8Accept = 0 | ||||
| 	utf8Reject = 1 | ||||
| ) | ||||
|  | ||||
| func decode(state int, x rune, b byte) (int, rune) { | ||||
| 	t := utf8d[b] | ||||
| 	if state != utf8Accept { | ||||
| 		x = rune(b&0x3f) | (x << 6) | ||||
| 	} else { | ||||
| 		x = rune((0xff >> t) & b) | ||||
| 	} | ||||
| 	state = int(utf8d[256+state*16+int(t)]) | ||||
| 	return state, x | ||||
| } | ||||
							
								
								
									
										134
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/examples/chat/client.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										134
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/examples/chat/client.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,134 @@ | ||||
| // Copyright 2013 The Gorilla WebSocket 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 main | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"log" | ||||
| 	"net/http" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/gorilla/websocket" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	// Time allowed to write a message to the peer. | ||||
| 	writeWait = 10 * time.Second | ||||
|  | ||||
| 	// Time allowed to read the next pong message from the peer. | ||||
| 	pongWait = 60 * time.Second | ||||
|  | ||||
| 	// Send pings to peer with this period. Must be less than pongWait. | ||||
| 	pingPeriod = (pongWait * 9) / 10 | ||||
|  | ||||
| 	// Maximum message size allowed from peer. | ||||
| 	maxMessageSize = 512 | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	newline = []byte{'\n'} | ||||
| 	space   = []byte{' '} | ||||
| ) | ||||
|  | ||||
| var upgrader = websocket.Upgrader{ | ||||
| 	ReadBufferSize:  1024, | ||||
| 	WriteBufferSize: 1024, | ||||
| } | ||||
|  | ||||
| // Client is a middleman between the websocket connection and the hub. | ||||
| type Client struct { | ||||
| 	hub *Hub | ||||
|  | ||||
| 	// The websocket connection. | ||||
| 	conn *websocket.Conn | ||||
|  | ||||
| 	// Buffered channel of outbound messages. | ||||
| 	send chan []byte | ||||
| } | ||||
|  | ||||
| // readPump pumps messages from the websocket connection to the hub. | ||||
| // | ||||
| // The application runs readPump in a per-connection goroutine. The application | ||||
| // ensures that there is at most one reader on a connection by executing all | ||||
| // reads from this goroutine. | ||||
| func (c *Client) readPump() { | ||||
| 	defer func() { | ||||
| 		c.hub.unregister <- c | ||||
| 		c.conn.Close() | ||||
| 	}() | ||||
| 	c.conn.SetReadLimit(maxMessageSize) | ||||
| 	c.conn.SetReadDeadline(time.Now().Add(pongWait)) | ||||
| 	c.conn.SetPongHandler(func(string) error { c.conn.SetReadDeadline(time.Now().Add(pongWait)); return nil }) | ||||
| 	for { | ||||
| 		_, message, err := c.conn.ReadMessage() | ||||
| 		if err != nil { | ||||
| 			if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway) { | ||||
| 				log.Printf("error: %v", err) | ||||
| 			} | ||||
| 			break | ||||
| 		} | ||||
| 		message = bytes.TrimSpace(bytes.Replace(message, newline, space, -1)) | ||||
| 		c.hub.broadcast <- message | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // writePump pumps messages from the hub to the websocket connection. | ||||
| // | ||||
| // A goroutine running writePump is started for each connection. The | ||||
| // application ensures that there is at most one writer to a connection by | ||||
| // executing all writes from this goroutine. | ||||
| func (c *Client) writePump() { | ||||
| 	ticker := time.NewTicker(pingPeriod) | ||||
| 	defer func() { | ||||
| 		ticker.Stop() | ||||
| 		c.conn.Close() | ||||
| 	}() | ||||
| 	for { | ||||
| 		select { | ||||
| 		case message, ok := <-c.send: | ||||
| 			c.conn.SetWriteDeadline(time.Now().Add(writeWait)) | ||||
| 			if !ok { | ||||
| 				// The hub closed the channel. | ||||
| 				c.conn.WriteMessage(websocket.CloseMessage, []byte{}) | ||||
| 				return | ||||
| 			} | ||||
|  | ||||
| 			w, err := c.conn.NextWriter(websocket.TextMessage) | ||||
| 			if err != nil { | ||||
| 				return | ||||
| 			} | ||||
| 			w.Write(message) | ||||
|  | ||||
| 			// Add queued chat messages to the current websocket message. | ||||
| 			n := len(c.send) | ||||
| 			for i := 0; i < n; i++ { | ||||
| 				w.Write(newline) | ||||
| 				w.Write(<-c.send) | ||||
| 			} | ||||
|  | ||||
| 			if err := w.Close(); err != nil { | ||||
| 				return | ||||
| 			} | ||||
| 		case <-ticker.C: | ||||
| 			c.conn.SetWriteDeadline(time.Now().Add(writeWait)) | ||||
| 			if err := c.conn.WriteMessage(websocket.PingMessage, []byte{}); err != nil { | ||||
| 				return | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // serveWs handles websocket requests from the peer. | ||||
| func serveWs(hub *Hub, w http.ResponseWriter, r *http.Request) { | ||||
| 	conn, err := upgrader.Upgrade(w, r, nil) | ||||
| 	if err != nil { | ||||
| 		log.Println(err) | ||||
| 		return | ||||
| 	} | ||||
| 	client := &Client{hub: hub, conn: conn, send: make(chan []byte, 256)} | ||||
| 	client.hub.register <- client | ||||
| 	go client.writePump() | ||||
| 	client.readPump() | ||||
| } | ||||
							
								
								
									
										53
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/examples/chat/hub.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/examples/chat/hub.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| // Copyright 2013 The Gorilla WebSocket 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 main | ||||
|  | ||||
| // hub maintains the set of active clients and broadcasts messages to the | ||||
| // clients. | ||||
| type Hub struct { | ||||
| 	// Registered clients. | ||||
| 	clients map[*Client]bool | ||||
|  | ||||
| 	// Inbound messages from the clients. | ||||
| 	broadcast chan []byte | ||||
|  | ||||
| 	// Register requests from the clients. | ||||
| 	register chan *Client | ||||
|  | ||||
| 	// Unregister requests from clients. | ||||
| 	unregister chan *Client | ||||
| } | ||||
|  | ||||
| func newHub() *Hub { | ||||
| 	return &Hub{ | ||||
| 		broadcast:  make(chan []byte), | ||||
| 		register:   make(chan *Client), | ||||
| 		unregister: make(chan *Client), | ||||
| 		clients:    make(map[*Client]bool), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (h *Hub) run() { | ||||
| 	for { | ||||
| 		select { | ||||
| 		case client := <-h.register: | ||||
| 			h.clients[client] = true | ||||
| 		case client := <-h.unregister: | ||||
| 			if _, ok := h.clients[client]; ok { | ||||
| 				delete(h.clients, client) | ||||
| 				close(client.send) | ||||
| 			} | ||||
| 		case message := <-h.broadcast: | ||||
| 			for client := range h.clients { | ||||
| 				select { | ||||
| 				case client.send <- message: | ||||
| 				default: | ||||
| 					close(client.send) | ||||
| 					delete(h.clients, client) | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										43
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/examples/chat/main.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/examples/chat/main.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| // Copyright 2013 The Gorilla WebSocket 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 main | ||||
|  | ||||
| import ( | ||||
| 	"flag" | ||||
| 	"log" | ||||
| 	"net/http" | ||||
| 	"text/template" | ||||
| ) | ||||
|  | ||||
| var addr = flag.String("addr", ":8080", "http service address") | ||||
| var homeTemplate = template.Must(template.ParseFiles("home.html")) | ||||
|  | ||||
| func serveHome(w http.ResponseWriter, r *http.Request) { | ||||
| 	log.Println(r.URL) | ||||
| 	if r.URL.Path != "/" { | ||||
| 		http.Error(w, "Not found", 404) | ||||
| 		return | ||||
| 	} | ||||
| 	if r.Method != "GET" { | ||||
| 		http.Error(w, "Method not allowed", 405) | ||||
| 		return | ||||
| 	} | ||||
| 	w.Header().Set("Content-Type", "text/html; charset=utf-8") | ||||
| 	homeTemplate.Execute(w, r.Host) | ||||
| } | ||||
|  | ||||
| func main() { | ||||
| 	flag.Parse() | ||||
| 	hub := newHub() | ||||
| 	go hub.run() | ||||
| 	http.HandleFunc("/", serveHome) | ||||
| 	http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) { | ||||
| 		serveWs(hub, w, r) | ||||
| 	}) | ||||
| 	err := http.ListenAndServe(*addr, nil) | ||||
| 	if err != nil { | ||||
| 		log.Fatal("ListenAndServe: ", err) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										196
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/examples/command/main.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										196
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/examples/command/main.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,196 @@ | ||||
| // Copyright 2015 The Gorilla WebSocket 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 main | ||||
|  | ||||
| import ( | ||||
| 	"bufio" | ||||
| 	"flag" | ||||
| 	"io" | ||||
| 	"log" | ||||
| 	"net/http" | ||||
| 	"os" | ||||
| 	"os/exec" | ||||
| 	"text/template" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/gorilla/websocket" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	addr      = flag.String("addr", "127.0.0.1:8080", "http service address") | ||||
| 	cmdPath   string | ||||
| 	homeTempl = template.Must(template.ParseFiles("home.html")) | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	// Time allowed to write a message to the peer. | ||||
| 	writeWait = 10 * time.Second | ||||
|  | ||||
| 	// Maximum message size allowed from peer. | ||||
| 	maxMessageSize = 8192 | ||||
|  | ||||
| 	// Time allowed to read the next pong message from the peer. | ||||
| 	pongWait = 60 * time.Second | ||||
|  | ||||
| 	// Send pings to peer with this period. Must be less than pongWait. | ||||
| 	pingPeriod = (pongWait * 9) / 10 | ||||
|  | ||||
| 	// Time to wait before force close on connection. | ||||
| 	closeGracePeriod = 10 * time.Second | ||||
| ) | ||||
|  | ||||
| func pumpStdin(ws *websocket.Conn, w io.Writer) { | ||||
| 	defer ws.Close() | ||||
| 	ws.SetReadLimit(maxMessageSize) | ||||
| 	ws.SetReadDeadline(time.Now().Add(pongWait)) | ||||
| 	ws.SetPongHandler(func(string) error { ws.SetReadDeadline(time.Now().Add(pongWait)); return nil }) | ||||
| 	for { | ||||
| 		_, message, err := ws.ReadMessage() | ||||
| 		if err != nil { | ||||
| 			break | ||||
| 		} | ||||
| 		message = append(message, '\n') | ||||
| 		if _, err := w.Write(message); err != nil { | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func pumpStdout(ws *websocket.Conn, r io.Reader, done chan struct{}) { | ||||
| 	defer func() { | ||||
| 	}() | ||||
| 	s := bufio.NewScanner(r) | ||||
| 	for s.Scan() { | ||||
| 		ws.SetWriteDeadline(time.Now().Add(writeWait)) | ||||
| 		if err := ws.WriteMessage(websocket.TextMessage, s.Bytes()); err != nil { | ||||
| 			ws.Close() | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 	if s.Err() != nil { | ||||
| 		log.Println("scan:", s.Err()) | ||||
| 	} | ||||
| 	close(done) | ||||
|  | ||||
| 	ws.SetWriteDeadline(time.Now().Add(writeWait)) | ||||
| 	ws.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")) | ||||
| 	time.Sleep(closeGracePeriod) | ||||
| 	ws.Close() | ||||
| } | ||||
|  | ||||
| func ping(ws *websocket.Conn, done chan struct{}) { | ||||
| 	ticker := time.NewTicker(pingPeriod) | ||||
| 	defer ticker.Stop() | ||||
| 	for { | ||||
| 		select { | ||||
| 		case <-ticker.C: | ||||
| 			if err := ws.WriteControl(websocket.PingMessage, []byte{}, time.Now().Add(writeWait)); err != nil { | ||||
| 				log.Println("ping:", err) | ||||
| 			} | ||||
| 		case <-done: | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func internalError(ws *websocket.Conn, msg string, err error) { | ||||
| 	log.Println(msg, err) | ||||
| 	ws.WriteMessage(websocket.TextMessage, []byte("Internal server error.")) | ||||
| } | ||||
|  | ||||
| var upgrader = websocket.Upgrader{} | ||||
|  | ||||
| func serveWs(w http.ResponseWriter, r *http.Request) { | ||||
| 	ws, err := upgrader.Upgrade(w, r, nil) | ||||
| 	if err != nil { | ||||
| 		log.Println("upgrade:", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	defer ws.Close() | ||||
|  | ||||
| 	outr, outw, err := os.Pipe() | ||||
| 	if err != nil { | ||||
| 		internalError(ws, "stdout:", err) | ||||
| 		return | ||||
| 	} | ||||
| 	defer outr.Close() | ||||
| 	defer outw.Close() | ||||
|  | ||||
| 	inr, inw, err := os.Pipe() | ||||
| 	if err != nil { | ||||
| 		internalError(ws, "stdin:", err) | ||||
| 		return | ||||
| 	} | ||||
| 	defer inr.Close() | ||||
| 	defer inw.Close() | ||||
|  | ||||
| 	proc, err := os.StartProcess(cmdPath, flag.Args(), &os.ProcAttr{ | ||||
| 		Files: []*os.File{inr, outw, outw}, | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		internalError(ws, "start:", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	inr.Close() | ||||
| 	outw.Close() | ||||
|  | ||||
| 	stdoutDone := make(chan struct{}) | ||||
| 	go pumpStdout(ws, outr, stdoutDone) | ||||
| 	go ping(ws, stdoutDone) | ||||
|  | ||||
| 	pumpStdin(ws, inw) | ||||
|  | ||||
| 	// Some commands will exit when stdin is closed. | ||||
| 	inw.Close() | ||||
|  | ||||
| 	// Other commands need a bonk on the head. | ||||
| 	if err := proc.Signal(os.Interrupt); err != nil { | ||||
| 		log.Println("inter:", err) | ||||
| 	} | ||||
|  | ||||
| 	select { | ||||
| 	case <-stdoutDone: | ||||
| 	case <-time.After(time.Second): | ||||
| 		// A bigger bonk on the head. | ||||
| 		if err := proc.Signal(os.Kill); err != nil { | ||||
| 			log.Println("term:", err) | ||||
| 		} | ||||
| 		<-stdoutDone | ||||
| 	} | ||||
|  | ||||
| 	if _, err := proc.Wait(); err != nil { | ||||
| 		log.Println("wait:", err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func serveHome(w http.ResponseWriter, r *http.Request) { | ||||
| 	if r.URL.Path != "/" { | ||||
| 		http.Error(w, "Not found", 404) | ||||
| 		return | ||||
| 	} | ||||
| 	if r.Method != "GET" { | ||||
| 		http.Error(w, "Method not allowed", 405) | ||||
| 		return | ||||
| 	} | ||||
| 	w.Header().Set("Content-Type", "text/html; charset=utf-8") | ||||
| 	homeTempl.Execute(w, r.Host) | ||||
| } | ||||
|  | ||||
| func main() { | ||||
| 	flag.Parse() | ||||
| 	if len(flag.Args()) < 1 { | ||||
| 		log.Fatal("must specify at least one argument") | ||||
| 	} | ||||
| 	var err error | ||||
| 	cmdPath, err = exec.LookPath(flag.Args()[0]) | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err) | ||||
| 	} | ||||
| 	http.HandleFunc("/", serveHome) | ||||
| 	http.HandleFunc("/ws", serveWs) | ||||
| 	log.Fatal(http.ListenAndServe(*addr, nil)) | ||||
| } | ||||
							
								
								
									
										81
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/examples/echo/client.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/examples/echo/client.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| // Copyright 2015 The Gorilla WebSocket Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| // +build ignore | ||||
|  | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"flag" | ||||
| 	"log" | ||||
| 	"net/url" | ||||
| 	"os" | ||||
| 	"os/signal" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/gorilla/websocket" | ||||
| ) | ||||
|  | ||||
| var addr = flag.String("addr", "localhost:8080", "http service address") | ||||
|  | ||||
| func main() { | ||||
| 	flag.Parse() | ||||
| 	log.SetFlags(0) | ||||
|  | ||||
| 	interrupt := make(chan os.Signal, 1) | ||||
| 	signal.Notify(interrupt, os.Interrupt) | ||||
|  | ||||
| 	u := url.URL{Scheme: "ws", Host: *addr, Path: "/echo"} | ||||
| 	log.Printf("connecting to %s", u.String()) | ||||
|  | ||||
| 	c, _, err := websocket.DefaultDialer.Dial(u.String(), nil) | ||||
| 	if err != nil { | ||||
| 		log.Fatal("dial:", err) | ||||
| 	} | ||||
| 	defer c.Close() | ||||
|  | ||||
| 	done := make(chan struct{}) | ||||
|  | ||||
| 	go func() { | ||||
| 		defer c.Close() | ||||
| 		defer close(done) | ||||
| 		for { | ||||
| 			_, message, err := c.ReadMessage() | ||||
| 			if err != nil { | ||||
| 				log.Println("read:", err) | ||||
| 				return | ||||
| 			} | ||||
| 			log.Printf("recv: %s", message) | ||||
| 		} | ||||
| 	}() | ||||
|  | ||||
| 	ticker := time.NewTicker(time.Second) | ||||
| 	defer ticker.Stop() | ||||
|  | ||||
| 	for { | ||||
| 		select { | ||||
| 		case t := <-ticker.C: | ||||
| 			err := c.WriteMessage(websocket.TextMessage, []byte(t.String())) | ||||
| 			if err != nil { | ||||
| 				log.Println("write:", err) | ||||
| 				return | ||||
| 			} | ||||
| 		case <-interrupt: | ||||
| 			log.Println("interrupt") | ||||
| 			// To cleanly close a connection, a client should send a close | ||||
| 			// frame and wait for the server to close the connection. | ||||
| 			err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")) | ||||
| 			if err != nil { | ||||
| 				log.Println("write close:", err) | ||||
| 				return | ||||
| 			} | ||||
| 			select { | ||||
| 			case <-done: | ||||
| 			case <-time.After(time.Second): | ||||
| 			} | ||||
| 			c.Close() | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										132
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/examples/echo/server.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/examples/echo/server.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,132 @@ | ||||
| // Copyright 2015 The Gorilla WebSocket Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| // +build ignore | ||||
|  | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"flag" | ||||
| 	"html/template" | ||||
| 	"log" | ||||
| 	"net/http" | ||||
|  | ||||
| 	"github.com/gorilla/websocket" | ||||
| ) | ||||
|  | ||||
| var addr = flag.String("addr", "localhost:8080", "http service address") | ||||
|  | ||||
| var upgrader = websocket.Upgrader{} // use default options | ||||
|  | ||||
| func echo(w http.ResponseWriter, r *http.Request) { | ||||
| 	c, err := upgrader.Upgrade(w, r, nil) | ||||
| 	if err != nil { | ||||
| 		log.Print("upgrade:", err) | ||||
| 		return | ||||
| 	} | ||||
| 	defer c.Close() | ||||
| 	for { | ||||
| 		mt, message, err := c.ReadMessage() | ||||
| 		if err != nil { | ||||
| 			log.Println("read:", err) | ||||
| 			break | ||||
| 		} | ||||
| 		log.Printf("recv: %s", message) | ||||
| 		err = c.WriteMessage(mt, message) | ||||
| 		if err != nil { | ||||
| 			log.Println("write:", err) | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func home(w http.ResponseWriter, r *http.Request) { | ||||
| 	homeTemplate.Execute(w, "ws://"+r.Host+"/echo") | ||||
| } | ||||
|  | ||||
| func main() { | ||||
| 	flag.Parse() | ||||
| 	log.SetFlags(0) | ||||
| 	http.HandleFunc("/echo", echo) | ||||
| 	http.HandleFunc("/", home) | ||||
| 	log.Fatal(http.ListenAndServe(*addr, nil)) | ||||
| } | ||||
|  | ||||
| var homeTemplate = template.Must(template.New("").Parse(` | ||||
| <!DOCTYPE html> | ||||
| <head> | ||||
| <meta charset="utf-8"> | ||||
| <script>   | ||||
| window.addEventListener("load", function(evt) { | ||||
|  | ||||
|     var output = document.getElementById("output"); | ||||
|     var input = document.getElementById("input"); | ||||
|     var ws; | ||||
|  | ||||
|     var print = function(message) { | ||||
|         var d = document.createElement("div"); | ||||
|         d.innerHTML = message; | ||||
|         output.appendChild(d); | ||||
|     }; | ||||
|  | ||||
|     document.getElementById("open").onclick = function(evt) { | ||||
|         if (ws) { | ||||
|             return false; | ||||
|         } | ||||
|         ws = new WebSocket("{{.}}"); | ||||
|         ws.onopen = function(evt) { | ||||
|             print("OPEN"); | ||||
|         } | ||||
|         ws.onclose = function(evt) { | ||||
|             print("CLOSE"); | ||||
|             ws = null; | ||||
|         } | ||||
|         ws.onmessage = function(evt) { | ||||
|             print("RESPONSE: " + evt.data); | ||||
|         } | ||||
|         ws.onerror = function(evt) { | ||||
|             print("ERROR: " + evt.data); | ||||
|         } | ||||
|         return false; | ||||
|     }; | ||||
|  | ||||
|     document.getElementById("send").onclick = function(evt) { | ||||
|         if (!ws) { | ||||
|             return false; | ||||
|         } | ||||
|         print("SEND: " + input.value); | ||||
|         ws.send(input.value); | ||||
|         return false; | ||||
|     }; | ||||
|  | ||||
|     document.getElementById("close").onclick = function(evt) { | ||||
|         if (!ws) { | ||||
|             return false; | ||||
|         } | ||||
|         ws.close(); | ||||
|         return false; | ||||
|     }; | ||||
|  | ||||
| }); | ||||
| </script> | ||||
| </head> | ||||
| <body> | ||||
| <table> | ||||
| <tr><td valign="top" width="50%"> | ||||
| <p>Click "Open" to create a connection to the server,  | ||||
| "Send" to send a message to the server and "Close" to close the connection.  | ||||
| You can change the message and send multiple times. | ||||
| <p> | ||||
| <form> | ||||
| <button id="open">Open</button> | ||||
| <button id="close">Close</button> | ||||
| <p><input id="input" type="text" value="Hello world!"> | ||||
| <button id="send">Send</button> | ||||
| </form> | ||||
| </td><td valign="top" width="50%"> | ||||
| <div id="output"></div> | ||||
| </td></tr></table> | ||||
| </body> | ||||
| </html> | ||||
| `)) | ||||
							
								
								
									
										193
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/examples/filewatch/main.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										193
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/examples/filewatch/main.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,193 @@ | ||||
| // Copyright 2013 The Gorilla WebSocket 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 main | ||||
|  | ||||
| import ( | ||||
| 	"flag" | ||||
| 	"io/ioutil" | ||||
| 	"log" | ||||
| 	"net/http" | ||||
| 	"os" | ||||
| 	"strconv" | ||||
| 	"text/template" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/gorilla/websocket" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	// Time allowed to write the file to the client. | ||||
| 	writeWait = 10 * time.Second | ||||
|  | ||||
| 	// Time allowed to read the next pong message from the client. | ||||
| 	pongWait = 60 * time.Second | ||||
|  | ||||
| 	// Send pings to client with this period. Must be less than pongWait. | ||||
| 	pingPeriod = (pongWait * 9) / 10 | ||||
|  | ||||
| 	// Poll file for changes with this period. | ||||
| 	filePeriod = 10 * time.Second | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	addr      = flag.String("addr", ":8080", "http service address") | ||||
| 	homeTempl = template.Must(template.New("").Parse(homeHTML)) | ||||
| 	filename  string | ||||
| 	upgrader  = websocket.Upgrader{ | ||||
| 		ReadBufferSize:  1024, | ||||
| 		WriteBufferSize: 1024, | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| func readFileIfModified(lastMod time.Time) ([]byte, time.Time, error) { | ||||
| 	fi, err := os.Stat(filename) | ||||
| 	if err != nil { | ||||
| 		return nil, lastMod, err | ||||
| 	} | ||||
| 	if !fi.ModTime().After(lastMod) { | ||||
| 		return nil, lastMod, nil | ||||
| 	} | ||||
| 	p, err := ioutil.ReadFile(filename) | ||||
| 	if err != nil { | ||||
| 		return nil, fi.ModTime(), err | ||||
| 	} | ||||
| 	return p, fi.ModTime(), nil | ||||
| } | ||||
|  | ||||
| func reader(ws *websocket.Conn) { | ||||
| 	defer ws.Close() | ||||
| 	ws.SetReadLimit(512) | ||||
| 	ws.SetReadDeadline(time.Now().Add(pongWait)) | ||||
| 	ws.SetPongHandler(func(string) error { ws.SetReadDeadline(time.Now().Add(pongWait)); return nil }) | ||||
| 	for { | ||||
| 		_, _, err := ws.ReadMessage() | ||||
| 		if err != nil { | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func writer(ws *websocket.Conn, lastMod time.Time) { | ||||
| 	lastError := "" | ||||
| 	pingTicker := time.NewTicker(pingPeriod) | ||||
| 	fileTicker := time.NewTicker(filePeriod) | ||||
| 	defer func() { | ||||
| 		pingTicker.Stop() | ||||
| 		fileTicker.Stop() | ||||
| 		ws.Close() | ||||
| 	}() | ||||
| 	for { | ||||
| 		select { | ||||
| 		case <-fileTicker.C: | ||||
| 			var p []byte | ||||
| 			var err error | ||||
|  | ||||
| 			p, lastMod, err = readFileIfModified(lastMod) | ||||
|  | ||||
| 			if err != nil { | ||||
| 				if s := err.Error(); s != lastError { | ||||
| 					lastError = s | ||||
| 					p = []byte(lastError) | ||||
| 				} | ||||
| 			} else { | ||||
| 				lastError = "" | ||||
| 			} | ||||
|  | ||||
| 			if p != nil { | ||||
| 				ws.SetWriteDeadline(time.Now().Add(writeWait)) | ||||
| 				if err := ws.WriteMessage(websocket.TextMessage, p); err != nil { | ||||
| 					return | ||||
| 				} | ||||
| 			} | ||||
| 		case <-pingTicker.C: | ||||
| 			ws.SetWriteDeadline(time.Now().Add(writeWait)) | ||||
| 			if err := ws.WriteMessage(websocket.PingMessage, []byte{}); err != nil { | ||||
| 				return | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func serveWs(w http.ResponseWriter, r *http.Request) { | ||||
| 	ws, err := upgrader.Upgrade(w, r, nil) | ||||
| 	if err != nil { | ||||
| 		if _, ok := err.(websocket.HandshakeError); !ok { | ||||
| 			log.Println(err) | ||||
| 		} | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	var lastMod time.Time | ||||
| 	if n, err := strconv.ParseInt(r.FormValue("lastMod"), 16, 64); err == nil { | ||||
| 		lastMod = time.Unix(0, n) | ||||
| 	} | ||||
|  | ||||
| 	go writer(ws, lastMod) | ||||
| 	reader(ws) | ||||
| } | ||||
|  | ||||
| func serveHome(w http.ResponseWriter, r *http.Request) { | ||||
| 	if r.URL.Path != "/" { | ||||
| 		http.Error(w, "Not found", 404) | ||||
| 		return | ||||
| 	} | ||||
| 	if r.Method != "GET" { | ||||
| 		http.Error(w, "Method not allowed", 405) | ||||
| 		return | ||||
| 	} | ||||
| 	w.Header().Set("Content-Type", "text/html; charset=utf-8") | ||||
| 	p, lastMod, err := readFileIfModified(time.Time{}) | ||||
| 	if err != nil { | ||||
| 		p = []byte(err.Error()) | ||||
| 		lastMod = time.Unix(0, 0) | ||||
| 	} | ||||
| 	var v = struct { | ||||
| 		Host    string | ||||
| 		Data    string | ||||
| 		LastMod string | ||||
| 	}{ | ||||
| 		r.Host, | ||||
| 		string(p), | ||||
| 		strconv.FormatInt(lastMod.UnixNano(), 16), | ||||
| 	} | ||||
| 	homeTempl.Execute(w, &v) | ||||
| } | ||||
|  | ||||
| func main() { | ||||
| 	flag.Parse() | ||||
| 	if flag.NArg() != 1 { | ||||
| 		log.Fatal("filename not specified") | ||||
| 	} | ||||
| 	filename = flag.Args()[0] | ||||
| 	http.HandleFunc("/", serveHome) | ||||
| 	http.HandleFunc("/ws", serveWs) | ||||
| 	if err := http.ListenAndServe(*addr, nil); err != nil { | ||||
| 		log.Fatal(err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const homeHTML = `<!DOCTYPE html> | ||||
| <html lang="en"> | ||||
|     <head> | ||||
|         <title>WebSocket Example</title> | ||||
|     </head> | ||||
|     <body> | ||||
|         <pre id="fileData">{{.Data}}</pre> | ||||
|         <script type="text/javascript"> | ||||
|             (function() { | ||||
|                 var data = document.getElementById("fileData"); | ||||
|                 var conn = new WebSocket("ws://{{.Host}}/ws?lastMod={{.LastMod}}"); | ||||
|                 conn.onclose = function(evt) { | ||||
|                     data.textContent = 'Connection closed'; | ||||
|                 } | ||||
|                 conn.onmessage = function(evt) { | ||||
|                     console.log('file updated'); | ||||
|                     data.textContent = evt.data; | ||||
|                 } | ||||
|             })(); | ||||
|         </script> | ||||
|     </body> | ||||
| </html> | ||||
| ` | ||||
							
								
								
									
										55
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/json.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/json.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| // Copyright 2013 The Gorilla WebSocket 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 websocket | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"io" | ||||
| ) | ||||
|  | ||||
| // WriteJSON is deprecated, use c.WriteJSON instead. | ||||
| func WriteJSON(c *Conn, v interface{}) error { | ||||
| 	return c.WriteJSON(v) | ||||
| } | ||||
|  | ||||
| // WriteJSON writes the JSON encoding of v to the connection. | ||||
| // | ||||
| // See the documentation for encoding/json Marshal for details about the | ||||
| // conversion of Go values to JSON. | ||||
| func (c *Conn) WriteJSON(v interface{}) error { | ||||
| 	w, err := c.NextWriter(TextMessage) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	err1 := json.NewEncoder(w).Encode(v) | ||||
| 	err2 := w.Close() | ||||
| 	if err1 != nil { | ||||
| 		return err1 | ||||
| 	} | ||||
| 	return err2 | ||||
| } | ||||
|  | ||||
| // ReadJSON is deprecated, use c.ReadJSON instead. | ||||
| func ReadJSON(c *Conn, v interface{}) error { | ||||
| 	return c.ReadJSON(v) | ||||
| } | ||||
|  | ||||
| // ReadJSON reads the next JSON-encoded message from the connection and stores | ||||
| // it in the value pointed to by v. | ||||
| // | ||||
| // See the documentation for the encoding/json Unmarshal function for details | ||||
| // about the conversion of JSON to a Go value. | ||||
| func (c *Conn) ReadJSON(v interface{}) error { | ||||
| 	_, r, err := c.NextReader() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	err = json.NewDecoder(r).Decode(v) | ||||
| 	if err == io.EOF { | ||||
| 		// One value is expected in the message. | ||||
| 		err = io.ErrUnexpectedEOF | ||||
| 	} | ||||
| 	return err | ||||
| } | ||||
							
								
								
									
										61
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/mask.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/mask.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | ||||
| // Copyright 2016 The Gorilla WebSocket 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 websocket | ||||
|  | ||||
| import ( | ||||
| 	"math/rand" | ||||
| 	"unsafe" | ||||
| ) | ||||
|  | ||||
| const wordSize = int(unsafe.Sizeof(uintptr(0))) | ||||
|  | ||||
| func newMaskKey() [4]byte { | ||||
| 	n := rand.Uint32() | ||||
| 	return [4]byte{byte(n), byte(n >> 8), byte(n >> 16), byte(n >> 24)} | ||||
| } | ||||
|  | ||||
| func maskBytes(key [4]byte, pos int, b []byte) int { | ||||
|  | ||||
| 	// Mask one byte at a time for small buffers. | ||||
| 	if len(b) < 2*wordSize { | ||||
| 		for i := range b { | ||||
| 			b[i] ^= key[pos&3] | ||||
| 			pos++ | ||||
| 		} | ||||
| 		return pos & 3 | ||||
| 	} | ||||
|  | ||||
| 	// Mask one byte at a time to word boundary. | ||||
| 	if n := int(uintptr(unsafe.Pointer(&b[0]))) % wordSize; n != 0 { | ||||
| 		n = wordSize - n | ||||
| 		for i := range b[:n] { | ||||
| 			b[i] ^= key[pos&3] | ||||
| 			pos++ | ||||
| 		} | ||||
| 		b = b[n:] | ||||
| 	} | ||||
|  | ||||
| 	// Create aligned word size key. | ||||
| 	var k [wordSize]byte | ||||
| 	for i := range k { | ||||
| 		k[i] = key[(pos+i)&3] | ||||
| 	} | ||||
| 	kw := *(*uintptr)(unsafe.Pointer(&k)) | ||||
|  | ||||
| 	// Mask one word at a time. | ||||
| 	n := (len(b) / wordSize) * wordSize | ||||
| 	for i := 0; i < n; i += wordSize { | ||||
| 		*(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&b[0])) + uintptr(i))) ^= kw | ||||
| 	} | ||||
|  | ||||
| 	// Mask one byte at a time for remaining bytes. | ||||
| 	b = b[n:] | ||||
| 	for i := range b { | ||||
| 		b[i] ^= key[pos&3] | ||||
| 		pos++ | ||||
| 	} | ||||
|  | ||||
| 	return pos & 3 | ||||
| } | ||||
							
								
								
									
										292
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/server.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										292
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/server.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,292 @@ | ||||
| // Copyright 2013 The Gorilla WebSocket 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 websocket | ||||
|  | ||||
| import ( | ||||
| 	"bufio" | ||||
| 	"errors" | ||||
| 	"net" | ||||
| 	"net/http" | ||||
| 	"net/url" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| // HandshakeError describes an error with the handshake from the peer. | ||||
| type HandshakeError struct { | ||||
| 	message string | ||||
| } | ||||
|  | ||||
| func (e HandshakeError) Error() string { return e.message } | ||||
|  | ||||
| // Upgrader specifies parameters for upgrading an HTTP connection to a | ||||
| // WebSocket connection. | ||||
| type Upgrader struct { | ||||
| 	// HandshakeTimeout specifies the duration for the handshake to complete. | ||||
| 	HandshakeTimeout time.Duration | ||||
|  | ||||
| 	// ReadBufferSize and WriteBufferSize specify I/O buffer sizes. If a buffer | ||||
| 	// size is zero, then a default value of 4096 is used. The I/O buffer sizes | ||||
| 	// do not limit the size of the messages that can be sent or received. | ||||
| 	ReadBufferSize, WriteBufferSize int | ||||
|  | ||||
| 	// Subprotocols specifies the server's supported protocols in order of | ||||
| 	// preference. If this field is set, then the Upgrade method negotiates a | ||||
| 	// subprotocol by selecting the first match in this list with a protocol | ||||
| 	// requested by the client. | ||||
| 	Subprotocols []string | ||||
|  | ||||
| 	// Error specifies the function for generating HTTP error responses. If Error | ||||
| 	// is nil, then http.Error is used to generate the HTTP response. | ||||
| 	Error func(w http.ResponseWriter, r *http.Request, status int, reason error) | ||||
|  | ||||
| 	// CheckOrigin returns true if the request Origin header is acceptable. If | ||||
| 	// CheckOrigin is nil, the host in the Origin header must not be set or | ||||
| 	// must match the host of the request. | ||||
| 	CheckOrigin func(r *http.Request) bool | ||||
|  | ||||
| 	// EnableCompression specify if the server should attempt to negotiate per | ||||
| 	// message compression (RFC 7692). Setting this value to true does not | ||||
| 	// guarantee that compression will be supported. Currently only "no context | ||||
| 	// takeover" modes are supported. | ||||
| 	EnableCompression bool | ||||
| } | ||||
|  | ||||
| func (u *Upgrader) returnError(w http.ResponseWriter, r *http.Request, status int, reason string) (*Conn, error) { | ||||
| 	err := HandshakeError{reason} | ||||
| 	if u.Error != nil { | ||||
| 		u.Error(w, r, status, err) | ||||
| 	} else { | ||||
| 		w.Header().Set("Sec-Websocket-Version", "13") | ||||
| 		http.Error(w, http.StatusText(status), status) | ||||
| 	} | ||||
| 	return nil, err | ||||
| } | ||||
|  | ||||
| // checkSameOrigin returns true if the origin is not set or is equal to the request host. | ||||
| func checkSameOrigin(r *http.Request) bool { | ||||
| 	origin := r.Header["Origin"] | ||||
| 	if len(origin) == 0 { | ||||
| 		return true | ||||
| 	} | ||||
| 	u, err := url.Parse(origin[0]) | ||||
| 	if err != nil { | ||||
| 		return false | ||||
| 	} | ||||
| 	return u.Host == r.Host | ||||
| } | ||||
|  | ||||
| func (u *Upgrader) selectSubprotocol(r *http.Request, responseHeader http.Header) string { | ||||
| 	if u.Subprotocols != nil { | ||||
| 		clientProtocols := Subprotocols(r) | ||||
| 		for _, serverProtocol := range u.Subprotocols { | ||||
| 			for _, clientProtocol := range clientProtocols { | ||||
| 				if clientProtocol == serverProtocol { | ||||
| 					return clientProtocol | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} else if responseHeader != nil { | ||||
| 		return responseHeader.Get("Sec-Websocket-Protocol") | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| // Upgrade upgrades the HTTP server connection to the WebSocket protocol. | ||||
| // | ||||
| // The responseHeader is included in the response to the client's upgrade | ||||
| // request. Use the responseHeader to specify cookies (Set-Cookie) and the | ||||
| // application negotiated subprotocol (Sec-Websocket-Protocol). | ||||
| // | ||||
| // If the upgrade fails, then Upgrade replies to the client with an HTTP error | ||||
| // response. | ||||
| func (u *Upgrader) Upgrade(w http.ResponseWriter, r *http.Request, responseHeader http.Header) (*Conn, error) { | ||||
| 	if r.Method != "GET" { | ||||
| 		return u.returnError(w, r, http.StatusMethodNotAllowed, "websocket: method not GET") | ||||
| 	} | ||||
|  | ||||
| 	if _, ok := responseHeader["Sec-Websocket-Extensions"]; ok { | ||||
| 		return u.returnError(w, r, http.StatusInternalServerError, "websocket: application specific Sec-Websocket-Extensions headers are unsupported") | ||||
| 	} | ||||
|  | ||||
| 	if !tokenListContainsValue(r.Header, "Sec-Websocket-Version", "13") { | ||||
| 		return u.returnError(w, r, http.StatusBadRequest, "websocket: version != 13") | ||||
| 	} | ||||
|  | ||||
| 	if !tokenListContainsValue(r.Header, "Connection", "upgrade") { | ||||
| 		return u.returnError(w, r, http.StatusBadRequest, "websocket: could not find connection header with token 'upgrade'") | ||||
| 	} | ||||
|  | ||||
| 	if !tokenListContainsValue(r.Header, "Upgrade", "websocket") { | ||||
| 		return u.returnError(w, r, http.StatusBadRequest, "websocket: could not find upgrade header with token 'websocket'") | ||||
| 	} | ||||
|  | ||||
| 	checkOrigin := u.CheckOrigin | ||||
| 	if checkOrigin == nil { | ||||
| 		checkOrigin = checkSameOrigin | ||||
| 	} | ||||
| 	if !checkOrigin(r) { | ||||
| 		return u.returnError(w, r, http.StatusForbidden, "websocket: origin not allowed") | ||||
| 	} | ||||
|  | ||||
| 	challengeKey := r.Header.Get("Sec-Websocket-Key") | ||||
| 	if challengeKey == "" { | ||||
| 		return u.returnError(w, r, http.StatusBadRequest, "websocket: key missing or blank") | ||||
| 	} | ||||
|  | ||||
| 	subprotocol := u.selectSubprotocol(r, responseHeader) | ||||
|  | ||||
| 	// Negotiate PMCE | ||||
| 	var compress bool | ||||
| 	if u.EnableCompression { | ||||
| 		for _, ext := range parseExtensions(r.Header) { | ||||
| 			if ext[""] != "permessage-deflate" { | ||||
| 				continue | ||||
| 			} | ||||
| 			compress = true | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	var ( | ||||
| 		netConn net.Conn | ||||
| 		br      *bufio.Reader | ||||
| 		err     error | ||||
| 	) | ||||
|  | ||||
| 	h, ok := w.(http.Hijacker) | ||||
| 	if !ok { | ||||
| 		return u.returnError(w, r, http.StatusInternalServerError, "websocket: response does not implement http.Hijacker") | ||||
| 	} | ||||
| 	var rw *bufio.ReadWriter | ||||
| 	netConn, rw, err = h.Hijack() | ||||
| 	if err != nil { | ||||
| 		return u.returnError(w, r, http.StatusInternalServerError, err.Error()) | ||||
| 	} | ||||
| 	br = rw.Reader | ||||
|  | ||||
| 	if br.Buffered() > 0 { | ||||
| 		netConn.Close() | ||||
| 		return nil, errors.New("websocket: client sent data before handshake is complete") | ||||
| 	} | ||||
|  | ||||
| 	c := newConn(netConn, true, u.ReadBufferSize, u.WriteBufferSize) | ||||
| 	c.subprotocol = subprotocol | ||||
|  | ||||
| 	if compress { | ||||
| 		c.newCompressionWriter = compressNoContextTakeover | ||||
| 		c.newDecompressionReader = decompressNoContextTakeover | ||||
| 	} | ||||
|  | ||||
| 	p := c.writeBuf[:0] | ||||
| 	p = append(p, "HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: "...) | ||||
| 	p = append(p, computeAcceptKey(challengeKey)...) | ||||
| 	p = append(p, "\r\n"...) | ||||
| 	if c.subprotocol != "" { | ||||
| 		p = append(p, "Sec-Websocket-Protocol: "...) | ||||
| 		p = append(p, c.subprotocol...) | ||||
| 		p = append(p, "\r\n"...) | ||||
| 	} | ||||
| 	if compress { | ||||
| 		p = append(p, "Sec-Websocket-Extensions: permessage-deflate; server_no_context_takeover; client_no_context_takeover\r\n"...) | ||||
| 	} | ||||
| 	for k, vs := range responseHeader { | ||||
| 		if k == "Sec-Websocket-Protocol" { | ||||
| 			continue | ||||
| 		} | ||||
| 		for _, v := range vs { | ||||
| 			p = append(p, k...) | ||||
| 			p = append(p, ": "...) | ||||
| 			for i := 0; i < len(v); i++ { | ||||
| 				b := v[i] | ||||
| 				if b <= 31 { | ||||
| 					// prevent response splitting. | ||||
| 					b = ' ' | ||||
| 				} | ||||
| 				p = append(p, b) | ||||
| 			} | ||||
| 			p = append(p, "\r\n"...) | ||||
| 		} | ||||
| 	} | ||||
| 	p = append(p, "\r\n"...) | ||||
|  | ||||
| 	// Clear deadlines set by HTTP server. | ||||
| 	netConn.SetDeadline(time.Time{}) | ||||
|  | ||||
| 	if u.HandshakeTimeout > 0 { | ||||
| 		netConn.SetWriteDeadline(time.Now().Add(u.HandshakeTimeout)) | ||||
| 	} | ||||
| 	if _, err = netConn.Write(p); err != nil { | ||||
| 		netConn.Close() | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if u.HandshakeTimeout > 0 { | ||||
| 		netConn.SetWriteDeadline(time.Time{}) | ||||
| 	} | ||||
|  | ||||
| 	return c, nil | ||||
| } | ||||
|  | ||||
| // Upgrade upgrades the HTTP server connection to the WebSocket protocol. | ||||
| // | ||||
| // This function is deprecated, use websocket.Upgrader instead. | ||||
| // | ||||
| // The application is responsible for checking the request origin before | ||||
| // calling Upgrade. An example implementation of the same origin policy is: | ||||
| // | ||||
| //	if req.Header.Get("Origin") != "http://"+req.Host { | ||||
| //		http.Error(w, "Origin not allowed", 403) | ||||
| //		return | ||||
| //	} | ||||
| // | ||||
| // If the endpoint supports subprotocols, then the application is responsible | ||||
| // for negotiating the protocol used on the connection. Use the Subprotocols() | ||||
| // function to get the subprotocols requested by the client. Use the | ||||
| // Sec-Websocket-Protocol response header to specify the subprotocol selected | ||||
| // by the application. | ||||
| // | ||||
| // The responseHeader is included in the response to the client's upgrade | ||||
| // request. Use the responseHeader to specify cookies (Set-Cookie) and the | ||||
| // negotiated subprotocol (Sec-Websocket-Protocol). | ||||
| // | ||||
| // The connection buffers IO to the underlying network connection. The | ||||
| // readBufSize and writeBufSize parameters specify the size of the buffers to | ||||
| // use. Messages can be larger than the buffers. | ||||
| // | ||||
| // If the request is not a valid WebSocket handshake, then Upgrade returns an | ||||
| // error of type HandshakeError. Applications should handle this error by | ||||
| // replying to the client with an HTTP error response. | ||||
| func Upgrade(w http.ResponseWriter, r *http.Request, responseHeader http.Header, readBufSize, writeBufSize int) (*Conn, error) { | ||||
| 	u := Upgrader{ReadBufferSize: readBufSize, WriteBufferSize: writeBufSize} | ||||
| 	u.Error = func(w http.ResponseWriter, r *http.Request, status int, reason error) { | ||||
| 		// don't return errors to maintain backwards compatibility | ||||
| 	} | ||||
| 	u.CheckOrigin = func(r *http.Request) bool { | ||||
| 		// allow all connections by default | ||||
| 		return true | ||||
| 	} | ||||
| 	return u.Upgrade(w, r, responseHeader) | ||||
| } | ||||
|  | ||||
| // Subprotocols returns the subprotocols requested by the client in the | ||||
| // Sec-Websocket-Protocol header. | ||||
| func Subprotocols(r *http.Request) []string { | ||||
| 	h := strings.TrimSpace(r.Header.Get("Sec-Websocket-Protocol")) | ||||
| 	if h == "" { | ||||
| 		return nil | ||||
| 	} | ||||
| 	protocols := strings.Split(h, ",") | ||||
| 	for i := range protocols { | ||||
| 		protocols[i] = strings.TrimSpace(protocols[i]) | ||||
| 	} | ||||
| 	return protocols | ||||
| } | ||||
|  | ||||
| // IsWebSocketUpgrade returns true if the client requested upgrade to the | ||||
| // WebSocket protocol. | ||||
| func IsWebSocketUpgrade(r *http.Request) bool { | ||||
| 	return tokenListContainsValue(r.Header, "Connection", "upgrade") && | ||||
| 		tokenListContainsValue(r.Header, "Upgrade", "websocket") | ||||
| } | ||||
							
								
								
									
										214
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/util.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										214
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/gorilla/websocket/util.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,214 @@ | ||||
| // Copyright 2013 The Gorilla WebSocket 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 websocket | ||||
|  | ||||
| import ( | ||||
| 	"crypto/rand" | ||||
| 	"crypto/sha1" | ||||
| 	"encoding/base64" | ||||
| 	"io" | ||||
| 	"net/http" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| var keyGUID = []byte("258EAFA5-E914-47DA-95CA-C5AB0DC85B11") | ||||
|  | ||||
| func computeAcceptKey(challengeKey string) string { | ||||
| 	h := sha1.New() | ||||
| 	h.Write([]byte(challengeKey)) | ||||
| 	h.Write(keyGUID) | ||||
| 	return base64.StdEncoding.EncodeToString(h.Sum(nil)) | ||||
| } | ||||
|  | ||||
| func generateChallengeKey() (string, error) { | ||||
| 	p := make([]byte, 16) | ||||
| 	if _, err := io.ReadFull(rand.Reader, p); err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	return base64.StdEncoding.EncodeToString(p), nil | ||||
| } | ||||
|  | ||||
| // Octet types from RFC 2616. | ||||
| var octetTypes [256]byte | ||||
|  | ||||
| const ( | ||||
| 	isTokenOctet = 1 << iota | ||||
| 	isSpaceOctet | ||||
| ) | ||||
|  | ||||
| func init() { | ||||
| 	// From RFC 2616 | ||||
| 	// | ||||
| 	// OCTET      = <any 8-bit sequence of data> | ||||
| 	// CHAR       = <any US-ASCII character (octets 0 - 127)> | ||||
| 	// CTL        = <any US-ASCII control character (octets 0 - 31) and DEL (127)> | ||||
| 	// CR         = <US-ASCII CR, carriage return (13)> | ||||
| 	// LF         = <US-ASCII LF, linefeed (10)> | ||||
| 	// SP         = <US-ASCII SP, space (32)> | ||||
| 	// HT         = <US-ASCII HT, horizontal-tab (9)> | ||||
| 	// <">        = <US-ASCII double-quote mark (34)> | ||||
| 	// CRLF       = CR LF | ||||
| 	// LWS        = [CRLF] 1*( SP | HT ) | ||||
| 	// TEXT       = <any OCTET except CTLs, but including LWS> | ||||
| 	// separators = "(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\" | <"> | ||||
| 	//              | "/" | "[" | "]" | "?" | "=" | "{" | "}" | SP | HT | ||||
| 	// token      = 1*<any CHAR except CTLs or separators> | ||||
| 	// qdtext     = <any TEXT except <">> | ||||
|  | ||||
| 	for c := 0; c < 256; c++ { | ||||
| 		var t byte | ||||
| 		isCtl := c <= 31 || c == 127 | ||||
| 		isChar := 0 <= c && c <= 127 | ||||
| 		isSeparator := strings.IndexRune(" \t\"(),/:;<=>?@[]\\{}", rune(c)) >= 0 | ||||
| 		if strings.IndexRune(" \t\r\n", rune(c)) >= 0 { | ||||
| 			t |= isSpaceOctet | ||||
| 		} | ||||
| 		if isChar && !isCtl && !isSeparator { | ||||
| 			t |= isTokenOctet | ||||
| 		} | ||||
| 		octetTypes[c] = t | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func skipSpace(s string) (rest string) { | ||||
| 	i := 0 | ||||
| 	for ; i < len(s); i++ { | ||||
| 		if octetTypes[s[i]]&isSpaceOctet == 0 { | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 	return s[i:] | ||||
| } | ||||
|  | ||||
| func nextToken(s string) (token, rest string) { | ||||
| 	i := 0 | ||||
| 	for ; i < len(s); i++ { | ||||
| 		if octetTypes[s[i]]&isTokenOctet == 0 { | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 	return s[:i], s[i:] | ||||
| } | ||||
|  | ||||
| func nextTokenOrQuoted(s string) (value string, rest string) { | ||||
| 	if !strings.HasPrefix(s, "\"") { | ||||
| 		return nextToken(s) | ||||
| 	} | ||||
| 	s = s[1:] | ||||
| 	for i := 0; i < len(s); i++ { | ||||
| 		switch s[i] { | ||||
| 		case '"': | ||||
| 			return s[:i], s[i+1:] | ||||
| 		case '\\': | ||||
| 			p := make([]byte, len(s)-1) | ||||
| 			j := copy(p, s[:i]) | ||||
| 			escape := true | ||||
| 			for i = i + 1; i < len(s); i++ { | ||||
| 				b := s[i] | ||||
| 				switch { | ||||
| 				case escape: | ||||
| 					escape = false | ||||
| 					p[j] = b | ||||
| 					j += 1 | ||||
| 				case b == '\\': | ||||
| 					escape = true | ||||
| 				case b == '"': | ||||
| 					return string(p[:j]), s[i+1:] | ||||
| 				default: | ||||
| 					p[j] = b | ||||
| 					j += 1 | ||||
| 				} | ||||
| 			} | ||||
| 			return "", "" | ||||
| 		} | ||||
| 	} | ||||
| 	return "", "" | ||||
| } | ||||
|  | ||||
| // tokenListContainsValue returns true if the 1#token header with the given | ||||
| // name contains token. | ||||
| func tokenListContainsValue(header http.Header, name string, value string) bool { | ||||
| headers: | ||||
| 	for _, s := range header[name] { | ||||
| 		for { | ||||
| 			var t string | ||||
| 			t, s = nextToken(skipSpace(s)) | ||||
| 			if t == "" { | ||||
| 				continue headers | ||||
| 			} | ||||
| 			s = skipSpace(s) | ||||
| 			if s != "" && s[0] != ',' { | ||||
| 				continue headers | ||||
| 			} | ||||
| 			if strings.EqualFold(t, value) { | ||||
| 				return true | ||||
| 			} | ||||
| 			if s == "" { | ||||
| 				continue headers | ||||
| 			} | ||||
| 			s = s[1:] | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // parseExtensiosn parses WebSocket extensions from a header. | ||||
| func parseExtensions(header http.Header) []map[string]string { | ||||
|  | ||||
| 	// From RFC 6455: | ||||
| 	// | ||||
| 	//  Sec-WebSocket-Extensions = extension-list | ||||
| 	//  extension-list = 1#extension | ||||
| 	//  extension = extension-token *( ";" extension-param ) | ||||
| 	//  extension-token = registered-token | ||||
| 	//  registered-token = token | ||||
| 	//  extension-param = token [ "=" (token | quoted-string) ] | ||||
| 	//     ;When using the quoted-string syntax variant, the value | ||||
| 	//     ;after quoted-string unescaping MUST conform to the | ||||
| 	//     ;'token' ABNF. | ||||
|  | ||||
| 	var result []map[string]string | ||||
| headers: | ||||
| 	for _, s := range header["Sec-Websocket-Extensions"] { | ||||
| 		for { | ||||
| 			var t string | ||||
| 			t, s = nextToken(skipSpace(s)) | ||||
| 			if t == "" { | ||||
| 				continue headers | ||||
| 			} | ||||
| 			ext := map[string]string{"": t} | ||||
| 			for { | ||||
| 				s = skipSpace(s) | ||||
| 				if !strings.HasPrefix(s, ";") { | ||||
| 					break | ||||
| 				} | ||||
| 				var k string | ||||
| 				k, s = nextToken(skipSpace(s[1:])) | ||||
| 				if k == "" { | ||||
| 					continue headers | ||||
| 				} | ||||
| 				s = skipSpace(s) | ||||
| 				var v string | ||||
| 				if strings.HasPrefix(s, "=") { | ||||
| 					v, s = nextTokenOrQuoted(skipSpace(s[1:])) | ||||
| 					s = skipSpace(s) | ||||
| 				} | ||||
| 				if s != "" && s[0] != ',' && s[0] != ';' { | ||||
| 					continue headers | ||||
| 				} | ||||
| 				ext[k] = v | ||||
| 			} | ||||
| 			if s != "" && s[0] != ',' { | ||||
| 				continue headers | ||||
| 			} | ||||
| 			result = append(result, ext) | ||||
| 			if s == "" { | ||||
| 				continue headers | ||||
| 			} | ||||
| 			s = s[1:] | ||||
| 		} | ||||
| 	} | ||||
| 	return result | ||||
| } | ||||
							
								
								
									
										897
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/LICENSE.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										897
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/LICENSE.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,897 @@ | ||||
| Mattermost Licensing | ||||
|  | ||||
| SOFTWARE LICENSING  | ||||
|  | ||||
| You are licensed to use compiled versions of the Mattermost platform produced by Mattermost, Inc. under an MIT LICENSE  | ||||
|  | ||||
| -	See MIT-COMPILED-LICENSE.md included in compiled versions for details | ||||
|  | ||||
| You may be licensed to use source code to create compiled versions not produced by Mattermost, Inc. in one of two ways: | ||||
|  | ||||
| 1. Under the Free Software Foundation’s GNU AGPL v.3.0, subject to the exceptions outlined in this policy; or  | ||||
| 2. Under a commercial license available from Mattermost, Inc. by contacting commercial@mattermost.com  | ||||
|  | ||||
| You are licensed to use the source code in Admin Tools and Configuration Files (templates/, config/, model/,  | ||||
| webapp/client, webapp/fonts, webapp/i18n, webapp/images and all subdirectories thereof) under the Apache License v2.0. | ||||
|  | ||||
| We promise that we will not enforce the copyleft provisions in AGPL v3.0 against you if your application (a) does not  | ||||
| link to the Mattermost Platform directly, but exclusively uses the Mattermost Admin Tools and Configuration Files, and | ||||
| (b) you have not modified, added to or adapted the source code of Mattermost in a way that results in the creation of  | ||||
| a “modified version” or “work based on” Mattermost as these terms are defined in the AGPL v3.0 license. | ||||
|  | ||||
| MATTERMOST TRADEMARK GUIDELINES | ||||
|  | ||||
| Your use of the mark Mattermost is subject to Mattermost, Inc's prior written approval and our organization’s Trademark  | ||||
| Standards of Use at http://www.mattermost.org/trademark-standards-of-use/. For trademark approval or any questions  | ||||
| you have about using these trademarks, please email trademark@mattermost.com  | ||||
|  | ||||
| ------------------------------------------------------------------------------------------------------------------------------ | ||||
|                                 | ||||
|                                Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "[]" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright [yyyy] [name of copyright owner] | ||||
|  | ||||
|    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. | ||||
|  | ||||
| ------------------------------------------------------------------------------ | ||||
|  | ||||
| The software is released under the terms of the GNU Affero General Public | ||||
| License, version 3. | ||||
|  | ||||
|                     GNU AFFERO GENERAL PUBLIC LICENSE | ||||
|                        Version 3, 19 November 2007 | ||||
|  | ||||
|  Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | ||||
|  Everyone is permitted to copy and distribute verbatim copies | ||||
|  of this license document, but changing it is not allowed. | ||||
|  | ||||
|                             Preamble | ||||
|  | ||||
|   The GNU Affero General Public License is a free, copyleft license for | ||||
| software and other kinds of works, specifically designed to ensure | ||||
| cooperation with the community in the case of network server software. | ||||
|  | ||||
|   The licenses for most software and other practical works are designed | ||||
| to take away your freedom to share and change the works.  By contrast, | ||||
| our General Public Licenses are intended to guarantee your freedom to | ||||
| share and change all versions of a program--to make sure it remains free | ||||
| software for all its users. | ||||
|  | ||||
|   When we speak of free software, we are referring to freedom, not | ||||
| price.  Our General Public Licenses are designed to make sure that you | ||||
| have the freedom to distribute copies of free software (and charge for | ||||
| them if you wish), that you receive source code or can get it if you | ||||
| want it, that you can change the software or use pieces of it in new | ||||
| free programs, and that you know you can do these things. | ||||
|  | ||||
|   Developers that use our General Public Licenses protect your rights | ||||
| with two steps: (1) assert copyright on the software, and (2) offer | ||||
| you this License which gives you legal permission to copy, distribute | ||||
| and/or modify the software. | ||||
|  | ||||
|   A secondary benefit of defending all users' freedom is that | ||||
| improvements made in alternate versions of the program, if they | ||||
| receive widespread use, become available for other developers to | ||||
| incorporate.  Many developers of free software are heartened and | ||||
| encouraged by the resulting cooperation.  However, in the case of | ||||
| software used on network servers, this result may fail to come about. | ||||
| The GNU General Public License permits making a modified version and | ||||
| letting the public access it on a server without ever releasing its | ||||
| source code to the public. | ||||
|  | ||||
|   The GNU Affero General Public License is designed specifically to | ||||
| ensure that, in such cases, the modified source code becomes available | ||||
| to the community.  It requires the operator of a network server to | ||||
| provide the source code of the modified version running there to the | ||||
| users of that server.  Therefore, public use of a modified version, on | ||||
| a publicly accessible server, gives the public access to the source | ||||
| code of the modified version. | ||||
|  | ||||
|   An older license, called the Affero General Public License and | ||||
| published by Affero, was designed to accomplish similar goals.  This is | ||||
| a different license, not a version of the Affero GPL, but Affero has | ||||
| released a new version of the Affero GPL which permits relicensing under | ||||
| this license. | ||||
|  | ||||
|   The precise terms and conditions for copying, distribution and | ||||
| modification follow. | ||||
|  | ||||
|                        TERMS AND CONDITIONS | ||||
|  | ||||
|   0. Definitions. | ||||
|  | ||||
|   "This License" refers to version 3 of the GNU Affero General Public License. | ||||
|  | ||||
|   "Copyright" also means copyright-like laws that apply to other kinds of | ||||
| works, such as semiconductor masks. | ||||
|  | ||||
|   "The Program" refers to any copyrightable work licensed under this | ||||
| License.  Each licensee is addressed as "you".  "Licensees" and | ||||
| "recipients" may be individuals or organizations. | ||||
|  | ||||
|   To "modify" a work means to copy from or adapt all or part of the work | ||||
| in a fashion requiring copyright permission, other than the making of an | ||||
| exact copy.  The resulting work is called a "modified version" of the | ||||
| earlier work or a work "based on" the earlier work. | ||||
|  | ||||
|   A "covered work" means either the unmodified Program or a work based | ||||
| on the Program. | ||||
|  | ||||
|   To "propagate" a work means to do anything with it that, without | ||||
| permission, would make you directly or secondarily liable for | ||||
| infringement under applicable copyright law, except executing it on a | ||||
| computer or modifying a private copy.  Propagation includes copying, | ||||
| distribution (with or without modification), making available to the | ||||
| public, and in some countries other activities as well. | ||||
|  | ||||
|   To "convey" a work means any kind of propagation that enables other | ||||
| parties to make or receive copies.  Mere interaction with a user through | ||||
| a computer network, with no transfer of a copy, is not conveying. | ||||
|  | ||||
|   An interactive user interface displays "Appropriate Legal Notices" | ||||
| to the extent that it includes a convenient and prominently visible | ||||
| feature that (1) displays an appropriate copyright notice, and (2) | ||||
| tells the user that there is no warranty for the work (except to the | ||||
| extent that warranties are provided), that licensees may convey the | ||||
| work under this License, and how to view a copy of this License.  If | ||||
| the interface presents a list of user commands or options, such as a | ||||
| menu, a prominent item in the list meets this criterion. | ||||
|  | ||||
|   1. Source Code. | ||||
|  | ||||
|   The "source code" for a work means the preferred form of the work | ||||
| for making modifications to it.  "Object code" means any non-source | ||||
| form of a work. | ||||
|  | ||||
|   A "Standard Interface" means an interface that either is an official | ||||
| standard defined by a recognized standards body, or, in the case of | ||||
| interfaces specified for a particular programming language, one that | ||||
| is widely used among developers working in that language. | ||||
|  | ||||
|   The "System Libraries" of an executable work include anything, other | ||||
| than the work as a whole, that (a) is included in the normal form of | ||||
| packaging a Major Component, but which is not part of that Major | ||||
| Component, and (b) serves only to enable use of the work with that | ||||
| Major Component, or to implement a Standard Interface for which an | ||||
| implementation is available to the public in source code form.  A | ||||
| "Major Component", in this context, means a major essential component | ||||
| (kernel, window system, and so on) of the specific operating system | ||||
| (if any) on which the executable work runs, or a compiler used to | ||||
| produce the work, or an object code interpreter used to run it. | ||||
|  | ||||
|   The "Corresponding Source" for a work in object code form means all | ||||
| the source code needed to generate, install, and (for an executable | ||||
| work) run the object code and to modify the work, including scripts to | ||||
| control those activities.  However, it does not include the work's | ||||
| System Libraries, or general-purpose tools or generally available free | ||||
| programs which are used unmodified in performing those activities but | ||||
| which are not part of the work.  For example, Corresponding Source | ||||
| includes interface definition files associated with source files for | ||||
| the work, and the source code for shared libraries and dynamically | ||||
| linked subprograms that the work is specifically designed to require, | ||||
| such as by intimate data communication or control flow between those | ||||
| subprograms and other parts of the work. | ||||
|  | ||||
|   The Corresponding Source need not include anything that users | ||||
| can regenerate automatically from other parts of the Corresponding | ||||
| Source. | ||||
|  | ||||
|   The Corresponding Source for a work in source code form is that | ||||
| same work. | ||||
|  | ||||
|   2. Basic Permissions. | ||||
|  | ||||
|   All rights granted under this License are granted for the term of | ||||
| copyright on the Program, and are irrevocable provided the stated | ||||
| conditions are met.  This License explicitly affirms your unlimited | ||||
| permission to run the unmodified Program.  The output from running a | ||||
| covered work is covered by this License only if the output, given its | ||||
| content, constitutes a covered work.  This License acknowledges your | ||||
| rights of fair use or other equivalent, as provided by copyright law. | ||||
|  | ||||
|   You may make, run and propagate covered works that you do not | ||||
| convey, without conditions so long as your license otherwise remains | ||||
| in force.  You may convey covered works to others for the sole purpose | ||||
| of having them make modifications exclusively for you, or provide you | ||||
| with facilities for running those works, provided that you comply with | ||||
| the terms of this License in conveying all material for which you do | ||||
| not control copyright.  Those thus making or running the covered works | ||||
| for you must do so exclusively on your behalf, under your direction | ||||
| and control, on terms that prohibit them from making any copies of | ||||
| your copyrighted material outside their relationship with you. | ||||
|  | ||||
|   Conveying under any other circumstances is permitted solely under | ||||
| the conditions stated below.  Sublicensing is not allowed; section 10 | ||||
| makes it unnecessary. | ||||
|  | ||||
|   3. Protecting Users' Legal Rights From Anti-Circumvention Law. | ||||
|  | ||||
|   No covered work shall be deemed part of an effective technological | ||||
| measure under any applicable law fulfilling obligations under article | ||||
| 11 of the WIPO copyright treaty adopted on 20 December 1996, or | ||||
| similar laws prohibiting or restricting circumvention of such | ||||
| measures. | ||||
|  | ||||
|   When you convey a covered work, you waive any legal power to forbid | ||||
| circumvention of technological measures to the extent such circumvention | ||||
| is effected by exercising rights under this License with respect to | ||||
| the covered work, and you disclaim any intention to limit operation or | ||||
| modification of the work as a means of enforcing, against the work's | ||||
| users, your or third parties' legal rights to forbid circumvention of | ||||
| technological measures. | ||||
|  | ||||
|   4. Conveying Verbatim Copies. | ||||
|  | ||||
|   You may convey verbatim copies of the Program's source code as you | ||||
| receive it, in any medium, provided that you conspicuously and | ||||
| appropriately publish on each copy an appropriate copyright notice; | ||||
| keep intact all notices stating that this License and any | ||||
| non-permissive terms added in accord with section 7 apply to the code; | ||||
| keep intact all notices of the absence of any warranty; and give all | ||||
| recipients a copy of this License along with the Program. | ||||
|  | ||||
|   You may charge any price or no price for each copy that you convey, | ||||
| and you may offer support or warranty protection for a fee. | ||||
|  | ||||
|   5. Conveying Modified Source Versions. | ||||
|  | ||||
|   You may convey a work based on the Program, or the modifications to | ||||
| produce it from the Program, in the form of source code under the | ||||
| terms of section 4, provided that you also meet all of these conditions: | ||||
|  | ||||
|     a) The work must carry prominent notices stating that you modified | ||||
|     it, and giving a relevant date. | ||||
|  | ||||
|     b) The work must carry prominent notices stating that it is | ||||
|     released under this License and any conditions added under section | ||||
|     7.  This requirement modifies the requirement in section 4 to | ||||
|     "keep intact all notices". | ||||
|  | ||||
|     c) You must license the entire work, as a whole, under this | ||||
|     License to anyone who comes into possession of a copy.  This | ||||
|     License will therefore apply, along with any applicable section 7 | ||||
|     additional terms, to the whole of the work, and all its parts, | ||||
|     regardless of how they are packaged.  This License gives no | ||||
|     permission to license the work in any other way, but it does not | ||||
|     invalidate such permission if you have separately received it. | ||||
|  | ||||
|     d) If the work has interactive user interfaces, each must display | ||||
|     Appropriate Legal Notices; however, if the Program has interactive | ||||
|     interfaces that do not display Appropriate Legal Notices, your | ||||
|     work need not make them do so. | ||||
|  | ||||
|   A compilation of a covered work with other separate and independent | ||||
| works, which are not by their nature extensions of the covered work, | ||||
| and which are not combined with it such as to form a larger program, | ||||
| in or on a volume of a storage or distribution medium, is called an | ||||
| "aggregate" if the compilation and its resulting copyright are not | ||||
| used to limit the access or legal rights of the compilation's users | ||||
| beyond what the individual works permit.  Inclusion of a covered work | ||||
| in an aggregate does not cause this License to apply to the other | ||||
| parts of the aggregate. | ||||
|  | ||||
|   6. Conveying Non-Source Forms. | ||||
|  | ||||
|   You may convey a covered work in object code form under the terms | ||||
| of sections 4 and 5, provided that you also convey the | ||||
| machine-readable Corresponding Source under the terms of this License, | ||||
| in one of these ways: | ||||
|  | ||||
|     a) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by the | ||||
|     Corresponding Source fixed on a durable physical medium | ||||
|     customarily used for software interchange. | ||||
|  | ||||
|     b) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by a | ||||
|     written offer, valid for at least three years and valid for as | ||||
|     long as you offer spare parts or customer support for that product | ||||
|     model, to give anyone who possesses the object code either (1) a | ||||
|     copy of the Corresponding Source for all the software in the | ||||
|     product that is covered by this License, on a durable physical | ||||
|     medium customarily used for software interchange, for a price no | ||||
|     more than your reasonable cost of physically performing this | ||||
|     conveying of source, or (2) access to copy the | ||||
|     Corresponding Source from a network server at no charge. | ||||
|  | ||||
|     c) Convey individual copies of the object code with a copy of the | ||||
|     written offer to provide the Corresponding Source.  This | ||||
|     alternative is allowed only occasionally and noncommercially, and | ||||
|     only if you received the object code with such an offer, in accord | ||||
|     with subsection 6b. | ||||
|  | ||||
|     d) Convey the object code by offering access from a designated | ||||
|     place (gratis or for a charge), and offer equivalent access to the | ||||
|     Corresponding Source in the same way through the same place at no | ||||
|     further charge.  You need not require recipients to copy the | ||||
|     Corresponding Source along with the object code.  If the place to | ||||
|     copy the object code is a network server, the Corresponding Source | ||||
|     may be on a different server (operated by you or a third party) | ||||
|     that supports equivalent copying facilities, provided you maintain | ||||
|     clear directions next to the object code saying where to find the | ||||
|     Corresponding Source.  Regardless of what server hosts the | ||||
|     Corresponding Source, you remain obligated to ensure that it is | ||||
|     available for as long as needed to satisfy these requirements. | ||||
|  | ||||
|     e) Convey the object code using peer-to-peer transmission, provided | ||||
|     you inform other peers where the object code and Corresponding | ||||
|     Source of the work are being offered to the general public at no | ||||
|     charge under subsection 6d. | ||||
|  | ||||
|   A separable portion of the object code, whose source code is excluded | ||||
| from the Corresponding Source as a System Library, need not be | ||||
| included in conveying the object code work. | ||||
|  | ||||
|   A "User Product" is either (1) a "consumer product", which means any | ||||
| tangible personal property which is normally used for personal, family, | ||||
| or household purposes, or (2) anything designed or sold for incorporation | ||||
| into a dwelling.  In determining whether a product is a consumer product, | ||||
| doubtful cases shall be resolved in favor of coverage.  For a particular | ||||
| product received by a particular user, "normally used" refers to a | ||||
| typical or common use of that class of product, regardless of the status | ||||
| of the particular user or of the way in which the particular user | ||||
| actually uses, or expects or is expected to use, the product.  A product | ||||
| is a consumer product regardless of whether the product has substantial | ||||
| commercial, industrial or non-consumer uses, unless such uses represent | ||||
| the only significant mode of use of the product. | ||||
|  | ||||
|   "Installation Information" for a User Product means any methods, | ||||
| procedures, authorization keys, or other information required to install | ||||
| and execute modified versions of a covered work in that User Product from | ||||
| a modified version of its Corresponding Source.  The information must | ||||
| suffice to ensure that the continued functioning of the modified object | ||||
| code is in no case prevented or interfered with solely because | ||||
| modification has been made. | ||||
|  | ||||
|   If you convey an object code work under this section in, or with, or | ||||
| specifically for use in, a User Product, and the conveying occurs as | ||||
| part of a transaction in which the right of possession and use of the | ||||
| User Product is transferred to the recipient in perpetuity or for a | ||||
| fixed term (regardless of how the transaction is characterized), the | ||||
| Corresponding Source conveyed under this section must be accompanied | ||||
| by the Installation Information.  But this requirement does not apply | ||||
| if neither you nor any third party retains the ability to install | ||||
| modified object code on the User Product (for example, the work has | ||||
| been installed in ROM). | ||||
|  | ||||
|   The requirement to provide Installation Information does not include a | ||||
| requirement to continue to provide support service, warranty, or updates | ||||
| for a work that has been modified or installed by the recipient, or for | ||||
| the User Product in which it has been modified or installed.  Access to a | ||||
| network may be denied when the modification itself materially and | ||||
| adversely affects the operation of the network or violates the rules and | ||||
| protocols for communication across the network. | ||||
|  | ||||
|   Corresponding Source conveyed, and Installation Information provided, | ||||
| in accord with this section must be in a format that is publicly | ||||
| documented (and with an implementation available to the public in | ||||
| source code form), and must require no special password or key for | ||||
| unpacking, reading or copying. | ||||
|  | ||||
|   7. Additional Terms. | ||||
|  | ||||
|   "Additional permissions" are terms that supplement the terms of this | ||||
| License by making exceptions from one or more of its conditions. | ||||
| Additional permissions that are applicable to the entire Program shall | ||||
| be treated as though they were included in this License, to the extent | ||||
| that they are valid under applicable law.  If additional permissions | ||||
| apply only to part of the Program, that part may be used separately | ||||
| under those permissions, but the entire Program remains governed by | ||||
| this License without regard to the additional permissions. | ||||
|  | ||||
|   When you convey a copy of a covered work, you may at your option | ||||
| remove any additional permissions from that copy, or from any part of | ||||
| it.  (Additional permissions may be written to require their own | ||||
| removal in certain cases when you modify the work.)  You may place | ||||
| additional permissions on material, added by you to a covered work, | ||||
| for which you have or can give appropriate copyright permission. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, for material you | ||||
| add to a covered work, you may (if authorized by the copyright holders of | ||||
| that material) supplement the terms of this License with terms: | ||||
|  | ||||
|     a) Disclaiming warranty or limiting liability differently from the | ||||
|     terms of sections 15 and 16 of this License; or | ||||
|  | ||||
|     b) Requiring preservation of specified reasonable legal notices or | ||||
|     author attributions in that material or in the Appropriate Legal | ||||
|     Notices displayed by works containing it; or | ||||
|  | ||||
|     c) Prohibiting misrepresentation of the origin of that material, or | ||||
|     requiring that modified versions of such material be marked in | ||||
|     reasonable ways as different from the original version; or | ||||
|  | ||||
|     d) Limiting the use for publicity purposes of names of licensors or | ||||
|     authors of the material; or | ||||
|  | ||||
|     e) Declining to grant rights under trademark law for use of some | ||||
|     trade names, trademarks, or service marks; or | ||||
|  | ||||
|     f) Requiring indemnification of licensors and authors of that | ||||
|     material by anyone who conveys the material (or modified versions of | ||||
|     it) with contractual assumptions of liability to the recipient, for | ||||
|     any liability that these contractual assumptions directly impose on | ||||
|     those licensors and authors. | ||||
|  | ||||
|   All other non-permissive additional terms are considered "further | ||||
| restrictions" within the meaning of section 10.  If the Program as you | ||||
| received it, or any part of it, contains a notice stating that it is | ||||
| governed by this License along with a term that is a further | ||||
| restriction, you may remove that term.  If a license document contains | ||||
| a further restriction but permits relicensing or conveying under this | ||||
| License, you may add to a covered work material governed by the terms | ||||
| of that license document, provided that the further restriction does | ||||
| not survive such relicensing or conveying. | ||||
|  | ||||
|   If you add terms to a covered work in accord with this section, you | ||||
| must place, in the relevant source files, a statement of the | ||||
| additional terms that apply to those files, or a notice indicating | ||||
| where to find the applicable terms. | ||||
|  | ||||
|   Additional terms, permissive or non-permissive, may be stated in the | ||||
| form of a separately written license, or stated as exceptions; | ||||
| the above requirements apply either way. | ||||
|  | ||||
|   8. Termination. | ||||
|  | ||||
|   You may not propagate or modify a covered work except as expressly | ||||
| provided under this License.  Any attempt otherwise to propagate or | ||||
| modify it is void, and will automatically terminate your rights under | ||||
| this License (including any patent licenses granted under the third | ||||
| paragraph of section 11). | ||||
|  | ||||
|   However, if you cease all violation of this License, then your | ||||
| license from a particular copyright holder is reinstated (a) | ||||
| provisionally, unless and until the copyright holder explicitly and | ||||
| finally terminates your license, and (b) permanently, if the copyright | ||||
| holder fails to notify you of the violation by some reasonable means | ||||
| prior to 60 days after the cessation. | ||||
|  | ||||
|   Moreover, your license from a particular copyright holder is | ||||
| reinstated permanently if the copyright holder notifies you of the | ||||
| violation by some reasonable means, this is the first time you have | ||||
| received notice of violation of this License (for any work) from that | ||||
| copyright holder, and you cure the violation prior to 30 days after | ||||
| your receipt of the notice. | ||||
|  | ||||
|   Termination of your rights under this section does not terminate the | ||||
| licenses of parties who have received copies or rights from you under | ||||
| this License.  If your rights have been terminated and not permanently | ||||
| reinstated, you do not qualify to receive new licenses for the same | ||||
| material under section 10. | ||||
|  | ||||
|   9. Acceptance Not Required for Having Copies. | ||||
|  | ||||
|   You are not required to accept this License in order to receive or | ||||
| run a copy of the Program.  Ancillary propagation of a covered work | ||||
| occurring solely as a consequence of using peer-to-peer transmission | ||||
| to receive a copy likewise does not require acceptance.  However, | ||||
| nothing other than this License grants you permission to propagate or | ||||
| modify any covered work.  These actions infringe copyright if you do | ||||
| not accept this License.  Therefore, by modifying or propagating a | ||||
| covered work, you indicate your acceptance of this License to do so. | ||||
|  | ||||
|   10. Automatic Licensing of Downstream Recipients. | ||||
|  | ||||
|   Each time you convey a covered work, the recipient automatically | ||||
| receives a license from the original licensors, to run, modify and | ||||
| propagate that work, subject to this License.  You are not responsible | ||||
| for enforcing compliance by third parties with this License. | ||||
|  | ||||
|   An "entity transaction" is a transaction transferring control of an | ||||
| organization, or substantially all assets of one, or subdividing an | ||||
| organization, or merging organizations.  If propagation of a covered | ||||
| work results from an entity transaction, each party to that | ||||
| transaction who receives a copy of the work also receives whatever | ||||
| licenses to the work the party's predecessor in interest had or could | ||||
| give under the previous paragraph, plus a right to possession of the | ||||
| Corresponding Source of the work from the predecessor in interest, if | ||||
| the predecessor has it or can get it with reasonable efforts. | ||||
|  | ||||
|   You may not impose any further restrictions on the exercise of the | ||||
| rights granted or affirmed under this License.  For example, you may | ||||
| not impose a license fee, royalty, or other charge for exercise of | ||||
| rights granted under this License, and you may not initiate litigation | ||||
| (including a cross-claim or counterclaim in a lawsuit) alleging that | ||||
| any patent claim is infringed by making, using, selling, offering for | ||||
| sale, or importing the Program or any portion of it. | ||||
|  | ||||
|   11. Patents. | ||||
|  | ||||
|   A "contributor" is a copyright holder who authorizes use under this | ||||
| License of the Program or a work on which the Program is based.  The | ||||
| work thus licensed is called the contributor's "contributor version". | ||||
|  | ||||
|   A contributor's "essential patent claims" are all patent claims | ||||
| owned or controlled by the contributor, whether already acquired or | ||||
| hereafter acquired, that would be infringed by some manner, permitted | ||||
| by this License, of making, using, or selling its contributor version, | ||||
| but do not include claims that would be infringed only as a | ||||
| consequence of further modification of the contributor version.  For | ||||
| purposes of this definition, "control" includes the right to grant | ||||
| patent sublicenses in a manner consistent with the requirements of | ||||
| this License. | ||||
|  | ||||
|   Each contributor grants you a non-exclusive, worldwide, royalty-free | ||||
| patent license under the contributor's essential patent claims, to | ||||
| make, use, sell, offer for sale, import and otherwise run, modify and | ||||
| propagate the contents of its contributor version. | ||||
|  | ||||
|   In the following three paragraphs, a "patent license" is any express | ||||
| agreement or commitment, however denominated, not to enforce a patent | ||||
| (such as an express permission to practice a patent or covenant not to | ||||
| sue for patent infringement).  To "grant" such a patent license to a | ||||
| party means to make such an agreement or commitment not to enforce a | ||||
| patent against the party. | ||||
|  | ||||
|   If you convey a covered work, knowingly relying on a patent license, | ||||
| and the Corresponding Source of the work is not available for anyone | ||||
| to copy, free of charge and under the terms of this License, through a | ||||
| publicly available network server or other readily accessible means, | ||||
| then you must either (1) cause the Corresponding Source to be so | ||||
| available, or (2) arrange to deprive yourself of the benefit of the | ||||
| patent license for this particular work, or (3) arrange, in a manner | ||||
| consistent with the requirements of this License, to extend the patent | ||||
| license to downstream recipients.  "Knowingly relying" means you have | ||||
| actual knowledge that, but for the patent license, your conveying the | ||||
| covered work in a country, or your recipient's use of the covered work | ||||
| in a country, would infringe one or more identifiable patents in that | ||||
| country that you have reason to believe are valid. | ||||
|  | ||||
|   If, pursuant to or in connection with a single transaction or | ||||
| arrangement, you convey, or propagate by procuring conveyance of, a | ||||
| covered work, and grant a patent license to some of the parties | ||||
| receiving the covered work authorizing them to use, propagate, modify | ||||
| or convey a specific copy of the covered work, then the patent license | ||||
| you grant is automatically extended to all recipients of the covered | ||||
| work and works based on it. | ||||
|  | ||||
|   A patent license is "discriminatory" if it does not include within | ||||
| the scope of its coverage, prohibits the exercise of, or is | ||||
| conditioned on the non-exercise of one or more of the rights that are | ||||
| specifically granted under this License.  You may not convey a covered | ||||
| work if you are a party to an arrangement with a third party that is | ||||
| in the business of distributing software, under which you make payment | ||||
| to the third party based on the extent of your activity of conveying | ||||
| the work, and under which the third party grants, to any of the | ||||
| parties who would receive the covered work from you, a discriminatory | ||||
| patent license (a) in connection with copies of the covered work | ||||
| conveyed by you (or copies made from those copies), or (b) primarily | ||||
| for and in connection with specific products or compilations that | ||||
| contain the covered work, unless you entered into that arrangement, | ||||
| or that patent license was granted, prior to 28 March 2007. | ||||
|  | ||||
|   Nothing in this License shall be construed as excluding or limiting | ||||
| any implied license or other defenses to infringement that may | ||||
| otherwise be available to you under applicable patent law. | ||||
|  | ||||
|   12. No Surrender of Others' Freedom. | ||||
|  | ||||
|   If conditions are imposed on you (whether by court order, agreement or | ||||
| otherwise) that contradict the conditions of this License, they do not | ||||
| excuse you from the conditions of this License.  If you cannot convey a | ||||
| covered work so as to satisfy simultaneously your obligations under this | ||||
| License and any other pertinent obligations, then as a consequence you may | ||||
| not convey it at all.  For example, if you agree to terms that obligate you | ||||
| to collect a royalty for further conveying from those to whom you convey | ||||
| the Program, the only way you could satisfy both those terms and this | ||||
| License would be to refrain entirely from conveying the Program. | ||||
|  | ||||
|   13. Remote Network Interaction; Use with the GNU General Public License. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, if you modify the | ||||
| Program, your modified version must prominently offer all users | ||||
| interacting with it remotely through a computer network (if your version | ||||
| supports such interaction) an opportunity to receive the Corresponding | ||||
| Source of your version by providing access to the Corresponding Source | ||||
| from a network server at no charge, through some standard or customary | ||||
| means of facilitating copying of software.  This Corresponding Source | ||||
| shall include the Corresponding Source for any work covered by version 3 | ||||
| of the GNU General Public License that is incorporated pursuant to the | ||||
| following paragraph. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, you have | ||||
| permission to link or combine any covered work with a work licensed | ||||
| under version 3 of the GNU General Public License into a single | ||||
| combined work, and to convey the resulting work.  The terms of this | ||||
| License will continue to apply to the part which is the covered work, | ||||
| but the work with which it is combined will remain governed by version | ||||
| 3 of the GNU General Public License. | ||||
|  | ||||
|   14. Revised Versions of this License. | ||||
|  | ||||
|   The Free Software Foundation may publish revised and/or new versions of | ||||
| the GNU Affero General Public License from time to time.  Such new versions | ||||
| will be similar in spirit to the present version, but may differ in detail to | ||||
| address new problems or concerns. | ||||
|  | ||||
|   Each version is given a distinguishing version number.  If the | ||||
| Program specifies that a certain numbered version of the GNU Affero General | ||||
| Public License "or any later version" applies to it, you have the | ||||
| option of following the terms and conditions either of that numbered | ||||
| version or of any later version published by the Free Software | ||||
| Foundation.  If the Program does not specify a version number of the | ||||
| GNU Affero General Public License, you may choose any version ever published | ||||
| by the Free Software Foundation. | ||||
|  | ||||
|   If the Program specifies that a proxy can decide which future | ||||
| versions of the GNU Affero General Public License can be used, that proxy's | ||||
| public statement of acceptance of a version permanently authorizes you | ||||
| to choose that version for the Program. | ||||
|  | ||||
|   Later license versions may give you additional or different | ||||
| permissions.  However, no additional obligations are imposed on any | ||||
| author or copyright holder as a result of your choosing to follow a | ||||
| later version. | ||||
|  | ||||
|   15. Disclaimer of Warranty. | ||||
|  | ||||
|   THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY | ||||
| APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT | ||||
| HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY | ||||
| OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, | ||||
| THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||||
| PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM | ||||
| IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF | ||||
| ALL NECESSARY SERVICING, REPAIR OR CORRECTION. | ||||
|  | ||||
|   16. Limitation of Liability. | ||||
|  | ||||
|   IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS | ||||
| THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY | ||||
| GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE | ||||
| USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF | ||||
| DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD | ||||
| PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), | ||||
| EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF | ||||
| SUCH DAMAGES. | ||||
|  | ||||
|   17. Interpretation of Sections 15 and 16. | ||||
|  | ||||
|   If the disclaimer of warranty and limitation of liability provided | ||||
| above cannot be given local legal effect according to their terms, | ||||
| reviewing courts shall apply local law that most closely approximates | ||||
| an absolute waiver of all civil liability in connection with the | ||||
| Program, unless a warranty or assumption of liability accompanies a | ||||
| copy of the Program in return for a fee. | ||||
|  | ||||
|                      END OF TERMS AND CONDITIONS | ||||
|  | ||||
|             How to Apply These Terms to Your New Programs | ||||
|  | ||||
|   If you develop a new program, and you want it to be of the greatest | ||||
| possible use to the public, the best way to achieve this is to make it | ||||
| free software which everyone can redistribute and change under these terms. | ||||
|  | ||||
|   To do so, attach the following notices to the program.  It is safest | ||||
| to attach them to the start of each source file to most effectively | ||||
| state the exclusion of warranty; and each file should have at least | ||||
| the "copyright" line and a pointer to where the full notice is found. | ||||
|  | ||||
|     <one line to give the program's name and a brief idea of what it does.> | ||||
|     Copyright (C) <year>  <name of author> | ||||
|  | ||||
|     This program is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU Affero General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
|  | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU Affero General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU Affero General Public License | ||||
|     along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  | ||||
| Also add information on how to contact you by electronic and paper mail. | ||||
|  | ||||
|   If your software can interact with users remotely through a computer | ||||
| network, you should also make sure that it provides a way for users to | ||||
| get its source.  For example, if your program is a web application, its | ||||
| interface could display a "Source" link that leads users to an archive | ||||
| of the code.  There are many ways you could offer source, and different | ||||
| solutions will be better for different programs; see section 13 for the | ||||
| specific requirements. | ||||
|  | ||||
|   You should also get your employer (if you work as a programmer) or school, | ||||
| if any, to sign a "copyright disclaimer" for the program, if necessary. | ||||
| For more information on this, and how to apply and follow the GNU AGPL, see | ||||
| <http://www.gnu.org/licenses/>. | ||||
							
								
								
									
										344
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/bundle/bundle.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										344
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/bundle/bundle.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,344 @@ | ||||
| // Package bundle manages translations for multiple languages. | ||||
| package bundle | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"path/filepath" | ||||
| 	"reflect" | ||||
| 	"sync" | ||||
|  | ||||
| 	"github.com/nicksnyder/go-i18n/i18n/language" | ||||
| 	"github.com/nicksnyder/go-i18n/i18n/translation" | ||||
| 	"gopkg.in/yaml.v2" | ||||
| ) | ||||
|  | ||||
| // TranslateFunc is a copy of i18n.TranslateFunc to avoid a circular dependency. | ||||
| type TranslateFunc func(translationID string, args ...interface{}) string | ||||
|  | ||||
| // Bundle stores the translations for multiple languages. | ||||
| type Bundle struct { | ||||
| 	// The primary translations for a language tag and translation id. | ||||
| 	translations map[string]map[string]translation.Translation | ||||
|  | ||||
| 	// Translations that can be used when an exact language match is not possible. | ||||
| 	fallbackTranslations map[string]map[string]translation.Translation | ||||
|  | ||||
| 	sync.RWMutex | ||||
| } | ||||
|  | ||||
| // New returns an empty bundle. | ||||
| func New() *Bundle { | ||||
| 	return &Bundle{ | ||||
| 		translations:         make(map[string]map[string]translation.Translation), | ||||
| 		fallbackTranslations: make(map[string]map[string]translation.Translation), | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // MustLoadTranslationFile is similar to LoadTranslationFile | ||||
| // except it panics if an error happens. | ||||
| func (b *Bundle) MustLoadTranslationFile(filename string) { | ||||
| 	if err := b.LoadTranslationFile(filename); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // LoadTranslationFile loads the translations from filename into memory. | ||||
| // | ||||
| // The language that the translations are associated with is parsed from the filename (e.g. en-US.json). | ||||
| // | ||||
| // Generally you should load translation files once during your program's initialization. | ||||
| func (b *Bundle) LoadTranslationFile(filename string) error { | ||||
| 	buf, err := ioutil.ReadFile(filename) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return b.ParseTranslationFileBytes(filename, buf) | ||||
| } | ||||
|  | ||||
| // ParseTranslationFileBytes is similar to LoadTranslationFile except it parses the bytes in buf. | ||||
| // | ||||
| // It is useful for parsing translation files embedded with go-bindata. | ||||
| func (b *Bundle) ParseTranslationFileBytes(filename string, buf []byte) error { | ||||
| 	basename := filepath.Base(filename) | ||||
| 	langs := language.Parse(basename) | ||||
| 	switch l := len(langs); { | ||||
| 	case l == 0: | ||||
| 		return fmt.Errorf("no language found in %q", basename) | ||||
| 	case l > 1: | ||||
| 		return fmt.Errorf("multiple languages found in filename %q: %v; expected one", basename, langs) | ||||
| 	} | ||||
| 	translations, err := parseTranslations(filename, buf) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	b.AddTranslation(langs[0], translations...) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func parseTranslations(filename string, buf []byte) ([]translation.Translation, error) { | ||||
| 	var unmarshalFunc func([]byte, interface{}) error | ||||
| 	switch format := filepath.Ext(filename); format { | ||||
| 	case ".json": | ||||
| 		unmarshalFunc = json.Unmarshal | ||||
| 	case ".yaml": | ||||
| 		unmarshalFunc = yaml.Unmarshal | ||||
| 	default: | ||||
| 		return nil, fmt.Errorf("unsupported file extension %s", format) | ||||
| 	} | ||||
|  | ||||
| 	var translationsData []map[string]interface{} | ||||
| 	if len(buf) > 0 { | ||||
| 		if err := unmarshalFunc(buf, &translationsData); err != nil { | ||||
| 			return nil, fmt.Errorf("failed to load %s because %s", filename, err) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	translations := make([]translation.Translation, 0, len(translationsData)) | ||||
| 	for i, translationData := range translationsData { | ||||
| 		t, err := translation.NewTranslation(translationData) | ||||
| 		if err != nil { | ||||
| 			return nil, fmt.Errorf("unable to parse translation #%d in %s because %s\n%v", i, filename, err, translationData) | ||||
| 		} | ||||
| 		translations = append(translations, t) | ||||
| 	} | ||||
| 	return translations, nil | ||||
| } | ||||
|  | ||||
| // AddTranslation adds translations for a language. | ||||
| // | ||||
| // It is useful if your translations are in a format not supported by LoadTranslationFile. | ||||
| func (b *Bundle) AddTranslation(lang *language.Language, translations ...translation.Translation) { | ||||
| 	b.Lock() | ||||
| 	defer b.Unlock() | ||||
| 	if b.translations[lang.Tag] == nil { | ||||
| 		b.translations[lang.Tag] = make(map[string]translation.Translation, len(translations)) | ||||
| 	} | ||||
| 	currentTranslations := b.translations[lang.Tag] | ||||
| 	for _, newTranslation := range translations { | ||||
| 		if currentTranslation := currentTranslations[newTranslation.ID()]; currentTranslation != nil { | ||||
| 			currentTranslations[newTranslation.ID()] = currentTranslation.Merge(newTranslation) | ||||
| 		} else { | ||||
| 			currentTranslations[newTranslation.ID()] = newTranslation | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// lang can provide translations for less specific language tags. | ||||
| 	for _, tag := range lang.MatchingTags() { | ||||
| 		b.fallbackTranslations[tag] = currentTranslations | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Translations returns all translations in the bundle. | ||||
| func (b *Bundle) Translations() map[string]map[string]translation.Translation { | ||||
| 	t := make(map[string]map[string]translation.Translation) | ||||
| 	b.RLock() | ||||
| 	for tag, translations := range b.translations { | ||||
| 		t[tag] = make(map[string]translation.Translation) | ||||
| 		for id, translation := range translations { | ||||
| 			t[tag][id] = translation | ||||
| 		} | ||||
| 	} | ||||
| 	b.RUnlock() | ||||
| 	return t | ||||
| } | ||||
|  | ||||
| // LanguageTags returns the tags of all languages that that have been added. | ||||
| func (b *Bundle) LanguageTags() []string { | ||||
| 	var tags []string | ||||
| 	b.RLock() | ||||
| 	for k := range b.translations { | ||||
| 		tags = append(tags, k) | ||||
| 	} | ||||
| 	b.RUnlock() | ||||
| 	return tags | ||||
| } | ||||
|  | ||||
| // LanguageTranslationIDs returns the ids of all translations that have been added for a given language. | ||||
| func (b *Bundle) LanguageTranslationIDs(languageTag string) []string { | ||||
| 	var ids []string | ||||
| 	b.RLock() | ||||
| 	for id := range b.translations[languageTag] { | ||||
| 		ids = append(ids, id) | ||||
| 	} | ||||
| 	b.RUnlock() | ||||
| 	return ids | ||||
| } | ||||
|  | ||||
| // MustTfunc is similar to Tfunc except it panics if an error happens. | ||||
| func (b *Bundle) MustTfunc(pref string, prefs ...string) TranslateFunc { | ||||
| 	tfunc, err := b.Tfunc(pref, prefs...) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return tfunc | ||||
| } | ||||
|  | ||||
| // MustTfuncAndLanguage is similar to TfuncAndLanguage except it panics if an error happens. | ||||
| func (b *Bundle) MustTfuncAndLanguage(pref string, prefs ...string) (TranslateFunc, *language.Language) { | ||||
| 	tfunc, language, err := b.TfuncAndLanguage(pref, prefs...) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return tfunc, language | ||||
| } | ||||
|  | ||||
| // Tfunc is similar to TfuncAndLanguage except is doesn't return the Language. | ||||
| func (b *Bundle) Tfunc(pref string, prefs ...string) (TranslateFunc, error) { | ||||
| 	tfunc, _, err := b.TfuncAndLanguage(pref, prefs...) | ||||
| 	return tfunc, err | ||||
| } | ||||
|  | ||||
| // TfuncAndLanguage returns a TranslateFunc for the first Language that | ||||
| // has a non-zero number of translations in the bundle. | ||||
| // | ||||
| // The returned Language matches the the first language preference that could be satisfied, | ||||
| // but this may not strictly match the language of the translations used to satisfy that preference. | ||||
| // | ||||
| // For example, the user may request "zh". If there are no translations for "zh" but there are translations | ||||
| // for "zh-cn", then the translations for "zh-cn" will be used but the returned Language will be "zh". | ||||
| // | ||||
| // It can parse languages from Accept-Language headers (RFC 2616), | ||||
| // but it assumes weights are monotonically decreasing. | ||||
| func (b *Bundle) TfuncAndLanguage(pref string, prefs ...string) (TranslateFunc, *language.Language, error) { | ||||
| 	lang := b.supportedLanguage(pref, prefs...) | ||||
| 	var err error | ||||
| 	if lang == nil { | ||||
| 		err = fmt.Errorf("no supported languages found %#v", append(prefs, pref)) | ||||
| 	} | ||||
| 	return func(translationID string, args ...interface{}) string { | ||||
| 		return b.translate(lang, translationID, args...) | ||||
| 	}, lang, err | ||||
| } | ||||
|  | ||||
| // supportedLanguage returns the first language which | ||||
| // has a non-zero number of translations in the bundle. | ||||
| func (b *Bundle) supportedLanguage(pref string, prefs ...string) *language.Language { | ||||
| 	lang := b.translatedLanguage(pref) | ||||
| 	if lang == nil { | ||||
| 		for _, pref := range prefs { | ||||
| 			lang = b.translatedLanguage(pref) | ||||
| 			if lang != nil { | ||||
| 				break | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return lang | ||||
| } | ||||
|  | ||||
| func (b *Bundle) translatedLanguage(src string) *language.Language { | ||||
| 	langs := language.Parse(src) | ||||
| 	b.RLock() | ||||
| 	defer b.RUnlock() | ||||
| 	for _, lang := range langs { | ||||
| 		if len(b.translations[lang.Tag]) > 0 || | ||||
| 			len(b.fallbackTranslations[lang.Tag]) > 0 { | ||||
| 			return lang | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (b *Bundle) translate(lang *language.Language, translationID string, args ...interface{}) string { | ||||
| 	if lang == nil { | ||||
| 		return translationID | ||||
| 	} | ||||
|  | ||||
| 	translation := b.translation(lang, translationID) | ||||
| 	if translation == nil { | ||||
| 		return translationID | ||||
| 	} | ||||
|  | ||||
| 	var data interface{} | ||||
| 	var count interface{} | ||||
| 	if argc := len(args); argc > 0 { | ||||
| 		if isNumber(args[0]) { | ||||
| 			count = args[0] | ||||
| 			if argc > 1 { | ||||
| 				data = args[1] | ||||
| 			} | ||||
| 		} else { | ||||
| 			data = args[0] | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if count != nil { | ||||
| 		if data == nil { | ||||
| 			data = map[string]interface{}{"Count": count} | ||||
| 		} else { | ||||
| 			dataMap := toMap(data) | ||||
| 			dataMap["Count"] = count | ||||
| 			data = dataMap | ||||
| 		} | ||||
| 	} else { | ||||
| 		dataMap := toMap(data) | ||||
| 		if c, ok := dataMap["Count"]; ok { | ||||
| 			count = c | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	p, _ := lang.Plural(count) | ||||
| 	template := translation.Template(p) | ||||
| 	if template == nil { | ||||
| 		return translationID | ||||
| 	} | ||||
|  | ||||
| 	s := template.Execute(data) | ||||
| 	if s == "" { | ||||
| 		return translationID | ||||
| 	} | ||||
| 	return s | ||||
| } | ||||
|  | ||||
| func (b *Bundle) translation(lang *language.Language, translationID string) translation.Translation { | ||||
| 	b.RLock() | ||||
| 	defer b.RUnlock() | ||||
| 	translations := b.translations[lang.Tag] | ||||
| 	if translations == nil { | ||||
| 		translations = b.fallbackTranslations[lang.Tag] | ||||
| 		if translations == nil { | ||||
| 			return nil | ||||
| 		} | ||||
| 	} | ||||
| 	return translations[translationID] | ||||
| } | ||||
|  | ||||
| func isNumber(n interface{}) bool { | ||||
| 	switch n.(type) { | ||||
| 	case int, int8, int16, int32, int64, string: | ||||
| 		return true | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func toMap(input interface{}) map[string]interface{} { | ||||
| 	if data, ok := input.(map[string]interface{}); ok { | ||||
| 		return data | ||||
| 	} | ||||
| 	v := reflect.ValueOf(input) | ||||
| 	switch v.Kind() { | ||||
| 	case reflect.Ptr: | ||||
| 		return toMap(v.Elem().Interface()) | ||||
| 	case reflect.Struct: | ||||
| 		return structToMap(v) | ||||
| 	default: | ||||
| 		return nil | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Converts the top level of a struct to a map[string]interface{}. | ||||
| // Code inspired by github.com/fatih/structs. | ||||
| func structToMap(v reflect.Value) map[string]interface{} { | ||||
| 	out := make(map[string]interface{}) | ||||
| 	t := v.Type() | ||||
| 	for i := 0; i < t.NumField(); i++ { | ||||
| 		field := t.Field(i) | ||||
| 		if field.PkgPath != "" { | ||||
| 			// unexported field. skip. | ||||
| 			continue | ||||
| 		} | ||||
| 		out[field.Name] = v.FieldByName(field.Name).Interface() | ||||
| 	} | ||||
| 	return out | ||||
| } | ||||
							
								
								
									
										158
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/i18n.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/i18n.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,158 @@ | ||||
| // Package i18n supports string translations with variable substitution and CLDR pluralization. | ||||
| // It is intended to be used in conjunction with the goi18n command, although that is not strictly required. | ||||
| // | ||||
| // Initialization | ||||
| // | ||||
| // Your Go program should load translations during its initialization. | ||||
| //     i18n.MustLoadTranslationFile("path/to/fr-FR.all.json") | ||||
| // If your translations are in a file format not supported by (Must)?LoadTranslationFile, | ||||
| // then you can use the AddTranslation function to manually add translations. | ||||
| // | ||||
| // Fetching a translation | ||||
| // | ||||
| // Use Tfunc or MustTfunc to fetch a TranslateFunc that will return the translated string for a specific language. | ||||
| //     func handleRequest(w http.ResponseWriter, r *http.Request) { | ||||
| //         cookieLang := r.Cookie("lang") | ||||
| //         acceptLang := r.Header.Get("Accept-Language") | ||||
| //         defaultLang = "en-US"  // known valid language | ||||
| //         T, err := i18n.Tfunc(cookieLang, acceptLang, defaultLang) | ||||
| //         fmt.Println(T("Hello world")) | ||||
| //     } | ||||
| // | ||||
| // Usually it is a good idea to identify strings by a generic id rather than the English translation, | ||||
| // but the rest of this documentation will continue to use the English translation for readability. | ||||
| //     T("Hello world")     // ok | ||||
| //     T("programGreeting") // better! | ||||
| // | ||||
| // Variables | ||||
| // | ||||
| // TranslateFunc supports strings that have variables using the text/template syntax. | ||||
| //     T("Hello {{.Person}}", map[string]interface{}{ | ||||
| //         "Person": "Bob", | ||||
| //     }) | ||||
| // | ||||
| // Pluralization | ||||
| // | ||||
| // TranslateFunc supports the pluralization of strings using the CLDR pluralization rules defined here: | ||||
| // http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html | ||||
| //     T("You have {{.Count}} unread emails.", 2) | ||||
| //     T("I am {{.Count}} meters tall.", "1.7") | ||||
| // | ||||
| // Plural strings may also have variables. | ||||
| //     T("{{.Person}} has {{.Count}} unread emails", 2, map[string]interface{}{ | ||||
| //         "Person": "Bob", | ||||
| //     }) | ||||
| // | ||||
| // Sentences with multiple plural components can be supported with nesting. | ||||
| //     T("{{.Person}} has {{.Count}} unread emails in the past {{.Timeframe}}.", 3, map[string]interface{}{ | ||||
| //         "Person":    "Bob", | ||||
| //         "Timeframe": T("{{.Count}} days", 2), | ||||
| //     }) | ||||
| // | ||||
| // Templates | ||||
| // | ||||
| // You can use the .Funcs() method of a text/template or html/template to register a TranslateFunc | ||||
| // for usage inside of that template. | ||||
| package i18n | ||||
|  | ||||
| import ( | ||||
| 	"github.com/nicksnyder/go-i18n/i18n/bundle" | ||||
| 	"github.com/nicksnyder/go-i18n/i18n/language" | ||||
| 	"github.com/nicksnyder/go-i18n/i18n/translation" | ||||
| ) | ||||
|  | ||||
| // TranslateFunc returns the translation of the string identified by translationID. | ||||
| // | ||||
| // If there is no translation for translationID, then the translationID itself is returned. | ||||
| // This makes it easy to identify missing translations in your app. | ||||
| // | ||||
| // If translationID is a non-plural form, then the first variadic argument may be a map[string]interface{} | ||||
| // or struct that contains template data. | ||||
| // | ||||
| // If translationID is a plural form, the function accepts two parameter signatures | ||||
| // 1. T(count int, data struct{}) | ||||
| // The first variadic argument must be an integer type | ||||
| // (int, int8, int16, int32, int64) or a float formatted as a string (e.g. "123.45"). | ||||
| // The second variadic argument may be a map[string]interface{} or struct{} that contains template data. | ||||
| // 2. T(data struct{}) | ||||
| // data must be a struct{} or map[string]interface{} that contains a Count field and the template data, | ||||
| // Count field must be an integer type (int, int8, int16, int32, int64) | ||||
| // or a float formatted as a string (e.g. "123.45"). | ||||
| type TranslateFunc func(translationID string, args ...interface{}) string | ||||
|  | ||||
| // IdentityTfunc returns a TranslateFunc that always returns the translationID passed to it. | ||||
| // | ||||
| // It is a useful placeholder when parsing a text/template or html/template | ||||
| // before the actual Tfunc is available. | ||||
| func IdentityTfunc() TranslateFunc { | ||||
| 	return func(translationID string, args ...interface{}) string { | ||||
| 		return translationID | ||||
| 	} | ||||
| } | ||||
|  | ||||
| var defaultBundle = bundle.New() | ||||
|  | ||||
| // MustLoadTranslationFile is similar to LoadTranslationFile | ||||
| // except it panics if an error happens. | ||||
| func MustLoadTranslationFile(filename string) { | ||||
| 	defaultBundle.MustLoadTranslationFile(filename) | ||||
| } | ||||
|  | ||||
| // LoadTranslationFile loads the translations from filename into memory. | ||||
| // | ||||
| // The language that the translations are associated with is parsed from the filename (e.g. en-US.json). | ||||
| // | ||||
| // Generally you should load translation files once during your program's initialization. | ||||
| func LoadTranslationFile(filename string) error { | ||||
| 	return defaultBundle.LoadTranslationFile(filename) | ||||
| } | ||||
|  | ||||
| // ParseTranslationFileBytes is similar to LoadTranslationFile except it parses the bytes in buf. | ||||
| // | ||||
| // It is useful for parsing translation files embedded with go-bindata. | ||||
| func ParseTranslationFileBytes(filename string, buf []byte) error { | ||||
| 	return defaultBundle.ParseTranslationFileBytes(filename, buf) | ||||
| } | ||||
|  | ||||
| // AddTranslation adds translations for a language. | ||||
| // | ||||
| // It is useful if your translations are in a format not supported by LoadTranslationFile. | ||||
| func AddTranslation(lang *language.Language, translations ...translation.Translation) { | ||||
| 	defaultBundle.AddTranslation(lang, translations...) | ||||
| } | ||||
|  | ||||
| // LanguageTags returns the tags of all languages that have been added. | ||||
| func LanguageTags() []string { | ||||
| 	return defaultBundle.LanguageTags() | ||||
| } | ||||
|  | ||||
| // LanguageTranslationIDs returns the ids of all translations that have been added for a given language. | ||||
| func LanguageTranslationIDs(languageTag string) []string { | ||||
| 	return defaultBundle.LanguageTranslationIDs(languageTag) | ||||
| } | ||||
|  | ||||
| // MustTfunc is similar to Tfunc except it panics if an error happens. | ||||
| func MustTfunc(languageSource string, languageSources ...string) TranslateFunc { | ||||
| 	return TranslateFunc(defaultBundle.MustTfunc(languageSource, languageSources...)) | ||||
| } | ||||
|  | ||||
| // Tfunc returns a TranslateFunc that will be bound to the first language which | ||||
| // has a non-zero number of translations. | ||||
| // | ||||
| // It can parse languages from Accept-Language headers (RFC 2616). | ||||
| func Tfunc(languageSource string, languageSources ...string) (TranslateFunc, error) { | ||||
| 	tfunc, err := defaultBundle.Tfunc(languageSource, languageSources...) | ||||
| 	return TranslateFunc(tfunc), err | ||||
| } | ||||
|  | ||||
| // MustTfuncAndLanguage is similar to TfuncAndLanguage except it panics if an error happens. | ||||
| func MustTfuncAndLanguage(languageSource string, languageSources ...string) (TranslateFunc, *language.Language) { | ||||
| 	tfunc, lang := defaultBundle.MustTfuncAndLanguage(languageSource, languageSources...) | ||||
| 	return TranslateFunc(tfunc), lang | ||||
| } | ||||
|  | ||||
| // TfuncAndLanguage is similar to Tfunc except it also returns the language which TranslateFunc is bound to. | ||||
| func TfuncAndLanguage(languageSource string, languageSources ...string) (TranslateFunc, *language.Language, error) { | ||||
| 	tfunc, lang, err := defaultBundle.TfuncAndLanguage(languageSource, languageSources...) | ||||
| 	return TranslateFunc(tfunc), lang, err | ||||
| } | ||||
							
								
								
									
										132
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/language/codegen/main.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/language/codegen/main.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,132 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"encoding/xml" | ||||
| 	"flag" | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"os" | ||||
| 	"text/template" | ||||
| ) | ||||
|  | ||||
| var usage = `%[1]s generates Go code to support CLDR plural rules. | ||||
|  | ||||
| Usage: %[1]s [options] | ||||
|  | ||||
| Options: | ||||
|  | ||||
| ` | ||||
|  | ||||
| func main() { | ||||
| 	flag.Usage = func() { | ||||
| 		fmt.Fprintf(os.Stderr, usage, os.Args[0]) | ||||
| 		flag.PrintDefaults() | ||||
| 	} | ||||
| 	var in, cout, tout string | ||||
| 	flag.StringVar(&in, "i", "plurals.xml", "the input XML file containing CLDR plural rules") | ||||
| 	flag.StringVar(&cout, "cout", "", "the code output file") | ||||
| 	flag.StringVar(&tout, "tout", "", "the test output file") | ||||
| 	flag.BoolVar(&verbose, "v", false, "verbose output") | ||||
| 	flag.Parse() | ||||
|  | ||||
| 	buf, err := ioutil.ReadFile(in) | ||||
| 	if err != nil { | ||||
| 		fatalf("failed to read file: %s", err) | ||||
| 	} | ||||
|  | ||||
| 	var data SupplementalData | ||||
| 	if err := xml.Unmarshal(buf, &data); err != nil { | ||||
| 		fatalf("failed to unmarshal xml: %s", err) | ||||
| 	} | ||||
|  | ||||
| 	count := 0 | ||||
| 	for _, pg := range data.PluralGroups { | ||||
| 		count += len(pg.SplitLocales()) | ||||
| 	} | ||||
| 	infof("parsed %d locales", count) | ||||
|  | ||||
| 	if cout != "" { | ||||
| 		file := openWritableFile(cout) | ||||
| 		if err := codeTemplate.Execute(file, data); err != nil { | ||||
| 			fatalf("unable to execute code template because %s", err) | ||||
| 		} else { | ||||
| 			infof("generated %s", cout) | ||||
| 		} | ||||
| 	} else { | ||||
| 		infof("not generating code file (use -cout)") | ||||
| 	} | ||||
|  | ||||
| 	if tout != "" { | ||||
| 		file := openWritableFile(tout) | ||||
| 		if err := testTemplate.Execute(file, data); err != nil { | ||||
| 			fatalf("unable to execute test template because %s", err) | ||||
| 		} else { | ||||
| 			infof("generated %s", tout) | ||||
| 		} | ||||
| 	} else { | ||||
| 		infof("not generating test file (use -tout)") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func openWritableFile(name string) *os.File { | ||||
| 	file, err := os.OpenFile(name, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) | ||||
| 	if err != nil { | ||||
| 		fatalf("failed to write file %s because %s", name, err) | ||||
| 	} | ||||
| 	return file | ||||
| } | ||||
|  | ||||
| var codeTemplate = template.Must(template.New("spec").Parse(`package language | ||||
| // This file is generated by i18n/language/codegen/generate.sh | ||||
|  | ||||
| func init() { | ||||
| {{range .PluralGroups}} | ||||
| 	registerPluralSpec({{printf "%#v" .SplitLocales}}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet({{range $i, $e := .PluralRules}}{{if $i}}, {{end}}{{$e.CountTitle}}{{end}}), | ||||
| 		PluralFunc: func(ops *operands) Plural { {{range .PluralRules}}{{if .GoCondition}} | ||||
| 			// {{.Condition}} | ||||
| 			if {{.GoCondition}} { | ||||
| 				return {{.CountTitle}} | ||||
| 			}{{end}}{{end}} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}){{end}} | ||||
| } | ||||
| `)) | ||||
|  | ||||
| var testTemplate = template.Must(template.New("spec").Parse(`package language | ||||
| // This file is generated by i18n/language/codegen/generate.sh | ||||
|  | ||||
| import "testing" | ||||
|  | ||||
| {{range .PluralGroups}} | ||||
| func Test{{.Name}}(t *testing.T) { | ||||
| 	var tests []pluralTest | ||||
| 	{{range .PluralRules}} | ||||
| 	{{if .IntegerExamples}}tests = appendIntegerTests(tests, {{.CountTitle}}, {{printf "%#v" .IntegerExamples}}){{end}} | ||||
| 	{{if .DecimalExamples}}tests = appendDecimalTests(tests, {{.CountTitle}}, {{printf "%#v" .DecimalExamples}}){{end}} | ||||
| 	{{end}} | ||||
| 	locales := {{printf "%#v" .SplitLocales}} | ||||
| 	for _, locale := range locales { | ||||
| 	  runTests(t, locale, tests) | ||||
|   } | ||||
| } | ||||
| {{end}} | ||||
| `)) | ||||
|  | ||||
| func infof(format string, args ...interface{}) { | ||||
| 	fmt.Fprintf(os.Stderr, format+"\n", args...) | ||||
| } | ||||
|  | ||||
| var verbose bool | ||||
|  | ||||
| func verbosef(format string, args ...interface{}) { | ||||
| 	if verbose { | ||||
| 		infof(format, args...) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func fatalf(format string, args ...interface{}) { | ||||
| 	infof("fatal: "+format+"\n", args...) | ||||
| 	os.Exit(1) | ||||
| } | ||||
							
								
								
									
										143
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/language/codegen/xml.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/language/codegen/xml.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,143 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"encoding/xml" | ||||
| 	"fmt" | ||||
| 	"regexp" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // SupplementalData is the top level struct of plural.xml | ||||
| type SupplementalData struct { | ||||
| 	XMLName      xml.Name      `xml:"supplementalData"` | ||||
| 	PluralGroups []PluralGroup `xml:"plurals>pluralRules"` | ||||
| } | ||||
|  | ||||
| // PluralGroup is a group of locales with the same plural rules. | ||||
| type PluralGroup struct { | ||||
| 	Locales     string       `xml:"locales,attr"` | ||||
| 	PluralRules []PluralRule `xml:"pluralRule"` | ||||
| } | ||||
|  | ||||
| // Name returns a unique name for this plural group. | ||||
| func (pg *PluralGroup) Name() string { | ||||
| 	n := strings.Title(pg.Locales) | ||||
| 	return strings.Replace(n, " ", "", -1) | ||||
| } | ||||
|  | ||||
| // SplitLocales returns all the locales in the PluralGroup as a slice. | ||||
| func (pg *PluralGroup) SplitLocales() []string { | ||||
| 	return strings.Split(pg.Locales, " ") | ||||
| } | ||||
|  | ||||
| // PluralRule is the rule for a single plural form. | ||||
| type PluralRule struct { | ||||
| 	Count string `xml:"count,attr"` | ||||
| 	Rule  string `xml:",innerxml"` | ||||
| } | ||||
|  | ||||
| // CountTitle returns the title case of the PluralRule's count. | ||||
| func (pr *PluralRule) CountTitle() string { | ||||
| 	return strings.Title(pr.Count) | ||||
| } | ||||
|  | ||||
| // Condition returns the condition where the PluralRule applies. | ||||
| func (pr *PluralRule) Condition() string { | ||||
| 	i := strings.Index(pr.Rule, "@") | ||||
| 	return pr.Rule[:i] | ||||
| } | ||||
|  | ||||
| // Examples returns the integer and decimal exmaples for the PLuralRule. | ||||
| func (pr *PluralRule) Examples() (integer []string, decimal []string) { | ||||
| 	ex := strings.Replace(pr.Rule, ", …", "", -1) | ||||
| 	ddelim := "@decimal" | ||||
| 	if i := strings.Index(ex, ddelim); i > 0 { | ||||
| 		dex := strings.TrimSpace(ex[i+len(ddelim):]) | ||||
| 		decimal = strings.Split(dex, ", ") | ||||
| 		ex = ex[:i] | ||||
| 	} | ||||
| 	idelim := "@integer" | ||||
| 	if i := strings.Index(ex, idelim); i > 0 { | ||||
| 		iex := strings.TrimSpace(ex[i+len(idelim):]) | ||||
| 		integer = strings.Split(iex, ", ") | ||||
| 	} | ||||
| 	return integer, decimal | ||||
| } | ||||
|  | ||||
| // IntegerExamples returns the integer exmaples for the PLuralRule. | ||||
| func (pr *PluralRule) IntegerExamples() []string { | ||||
| 	integer, _ := pr.Examples() | ||||
| 	return integer | ||||
| } | ||||
|  | ||||
| // DecimalExamples returns the decimal exmaples for the PLuralRule. | ||||
| func (pr *PluralRule) DecimalExamples() []string { | ||||
| 	_, decimal := pr.Examples() | ||||
| 	return decimal | ||||
| } | ||||
|  | ||||
| var relationRegexp = regexp.MustCompile("([niftvw])(?: % ([0-9]+))? (!=|=)(.*)") | ||||
|  | ||||
| // GoCondition converts the XML condition to valid Go code. | ||||
| func (pr *PluralRule) GoCondition() string { | ||||
| 	var ors []string | ||||
| 	for _, and := range strings.Split(pr.Condition(), "or") { | ||||
| 		var ands []string | ||||
| 		for _, relation := range strings.Split(and, "and") { | ||||
| 			parts := relationRegexp.FindStringSubmatch(relation) | ||||
| 			if parts == nil { | ||||
| 				continue | ||||
| 			} | ||||
| 			lvar, lmod, op, rhs := strings.Title(parts[1]), parts[2], parts[3], strings.TrimSpace(parts[4]) | ||||
| 			if op == "=" { | ||||
| 				op = "==" | ||||
| 			} | ||||
| 			lvar = "ops." + lvar | ||||
| 			var rhor []string | ||||
| 			var rany []string | ||||
| 			for _, rh := range strings.Split(rhs, ",") { | ||||
| 				if parts := strings.Split(rh, ".."); len(parts) == 2 { | ||||
| 					from, to := parts[0], parts[1] | ||||
| 					if lvar == "ops.N" { | ||||
| 						if lmod != "" { | ||||
| 							rhor = append(rhor, fmt.Sprintf("ops.NmodInRange(%s, %s, %s)", lmod, from, to)) | ||||
| 						} else { | ||||
| 							rhor = append(rhor, fmt.Sprintf("ops.NinRange(%s, %s)", from, to)) | ||||
| 						} | ||||
| 					} else if lmod != "" { | ||||
| 						rhor = append(rhor, fmt.Sprintf("intInRange(%s %% %s, %s, %s)", lvar, lmod, from, to)) | ||||
| 					} else { | ||||
| 						rhor = append(rhor, fmt.Sprintf("intInRange(%s, %s, %s)", lvar, from, to)) | ||||
| 					} | ||||
| 				} else { | ||||
| 					rany = append(rany, rh) | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			if len(rany) > 0 { | ||||
| 				rh := strings.Join(rany, ",") | ||||
| 				if lvar == "ops.N" { | ||||
| 					if lmod != "" { | ||||
| 						rhor = append(rhor, fmt.Sprintf("ops.NmodEqualsAny(%s, %s)", lmod, rh)) | ||||
| 					} else { | ||||
| 						rhor = append(rhor, fmt.Sprintf("ops.NequalsAny(%s)", rh)) | ||||
| 					} | ||||
| 				} else if lmod != "" { | ||||
| 					rhor = append(rhor, fmt.Sprintf("intEqualsAny(%s %% %s, %s)", lvar, lmod, rh)) | ||||
| 				} else { | ||||
| 					rhor = append(rhor, fmt.Sprintf("intEqualsAny(%s, %s)", lvar, rh)) | ||||
| 				} | ||||
| 			} | ||||
| 			r := strings.Join(rhor, " || ") | ||||
| 			if len(rhor) > 1 { | ||||
| 				r = "(" + r + ")" | ||||
| 			} | ||||
| 			if op == "!=" { | ||||
| 				r = "!" + r | ||||
| 			} | ||||
| 			ands = append(ands, r) | ||||
| 		} | ||||
| 		ors = append(ors, strings.Join(ands, " && ")) | ||||
| 	} | ||||
| 	return strings.Join(ors, " ||\n") | ||||
| } | ||||
							
								
								
									
										99
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/language/language.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/language/language.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,99 @@ | ||||
| // Package language defines languages that implement CLDR pluralization. | ||||
| package language | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // Language is a written human language. | ||||
| type Language struct { | ||||
| 	// Tag uniquely identifies the language as defined by RFC 5646. | ||||
| 	// | ||||
| 	// Most language tags are a two character language code (ISO 639-1) | ||||
| 	// optionally followed by a dash and a two character country code (ISO 3166-1). | ||||
| 	// (e.g. en, pt-br) | ||||
| 	Tag string | ||||
| 	*PluralSpec | ||||
| } | ||||
|  | ||||
| func (l *Language) String() string { | ||||
| 	return l.Tag | ||||
| } | ||||
|  | ||||
| // MatchingTags returns the set of language tags that map to this Language. | ||||
| // e.g. "zh-hans-cn" yields {"zh", "zh-hans", "zh-hans-cn"} | ||||
| // BUG: This should be computed once and stored as a field on Language for efficiency, | ||||
| //      but this would require changing how Languages are constructed. | ||||
| func (l *Language) MatchingTags() []string { | ||||
| 	parts := strings.Split(l.Tag, "-") | ||||
| 	var prefix, matches []string | ||||
| 	for _, part := range parts { | ||||
| 		prefix = append(prefix, part) | ||||
| 		match := strings.Join(prefix, "-") | ||||
| 		matches = append(matches, match) | ||||
| 	} | ||||
| 	return matches | ||||
| } | ||||
|  | ||||
| // Parse returns a slice of supported languages found in src or nil if none are found. | ||||
| // It can parse language tags and Accept-Language headers. | ||||
| func Parse(src string) []*Language { | ||||
| 	var langs []*Language | ||||
| 	start := 0 | ||||
| 	for end, chr := range src { | ||||
| 		switch chr { | ||||
| 		case ',', ';', '.': | ||||
| 			tag := strings.TrimSpace(src[start:end]) | ||||
| 			if spec := getPluralSpec(tag); spec != nil { | ||||
| 				langs = append(langs, &Language{NormalizeTag(tag), spec}) | ||||
| 			} | ||||
| 			start = end + 1 | ||||
| 		} | ||||
| 	} | ||||
| 	if start > 0 { | ||||
| 		tag := strings.TrimSpace(src[start:]) | ||||
| 		if spec := getPluralSpec(tag); spec != nil { | ||||
| 			langs = append(langs, &Language{NormalizeTag(tag), spec}) | ||||
| 		} | ||||
| 		return dedupe(langs) | ||||
| 	} | ||||
| 	if spec := getPluralSpec(src); spec != nil { | ||||
| 		langs = append(langs, &Language{NormalizeTag(src), spec}) | ||||
| 	} | ||||
| 	return langs | ||||
| } | ||||
|  | ||||
| func dedupe(langs []*Language) []*Language { | ||||
| 	found := make(map[string]struct{}, len(langs)) | ||||
| 	deduped := make([]*Language, 0, len(langs)) | ||||
| 	for _, lang := range langs { | ||||
| 		if _, ok := found[lang.Tag]; !ok { | ||||
| 			found[lang.Tag] = struct{}{} | ||||
| 			deduped = append(deduped, lang) | ||||
| 		} | ||||
| 	} | ||||
| 	return deduped | ||||
| } | ||||
|  | ||||
| // MustParse is similar to Parse except it panics instead of retuning a nil Language. | ||||
| func MustParse(src string) []*Language { | ||||
| 	langs := Parse(src) | ||||
| 	if len(langs) == 0 { | ||||
| 		panic(fmt.Errorf("unable to parse language from %q", src)) | ||||
| 	} | ||||
| 	return langs | ||||
| } | ||||
|  | ||||
| // Add adds support for a new language. | ||||
| func Add(l *Language) { | ||||
| 	tag := NormalizeTag(l.Tag) | ||||
| 	pluralSpecs[tag] = l.PluralSpec | ||||
| } | ||||
|  | ||||
| // NormalizeTag returns a language tag with all lower-case characters | ||||
| // and dashes "-" instead of underscores "_" | ||||
| func NormalizeTag(tag string) string { | ||||
| 	tag = strings.ToLower(tag) | ||||
| 	return strings.Replace(tag, "_", "-", -1) | ||||
| } | ||||
							
								
								
									
										119
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/language/operands.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/language/operands.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,119 @@ | ||||
| package language | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // http://unicode.org/reports/tr35/tr35-numbers.html#Operands | ||||
| type operands struct { | ||||
| 	N float64 // absolute value of the source number (integer and decimals) | ||||
| 	I int64   // integer digits of n | ||||
| 	V int64   // number of visible fraction digits in n, with trailing zeros | ||||
| 	W int64   // number of visible fraction digits in n, without trailing zeros | ||||
| 	F int64   // visible fractional digits in n, with trailing zeros | ||||
| 	T int64   // visible fractional digits in n, without trailing zeros | ||||
| } | ||||
|  | ||||
| // NmodEqualAny returns true if o represents an integer equal to any of the arguments. | ||||
| func (o *operands) NequalsAny(any ...int64) bool { | ||||
| 	for _, i := range any { | ||||
| 		if o.I == i && o.T == 0 { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // NmodEqualAny returns true if o represents an integer equal to any of the arguments modulo mod. | ||||
| func (o *operands) NmodEqualsAny(mod int64, any ...int64) bool { | ||||
| 	modI := o.I % mod | ||||
| 	for _, i := range any { | ||||
| 		if modI == i && o.T == 0 { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // NmodInRange returns true if o represents an integer in the closed interval [from, to]. | ||||
| func (o *operands) NinRange(from, to int64) bool { | ||||
| 	return o.T == 0 && from <= o.I && o.I <= to | ||||
| } | ||||
|  | ||||
| // NmodInRange returns true if o represents an integer in the closed interval [from, to] modulo mod. | ||||
| func (o *operands) NmodInRange(mod, from, to int64) bool { | ||||
| 	modI := o.I % mod | ||||
| 	return o.T == 0 && from <= modI && modI <= to | ||||
| } | ||||
|  | ||||
| func newOperands(v interface{}) (*operands, error) { | ||||
| 	switch v := v.(type) { | ||||
| 	case int: | ||||
| 		return newOperandsInt64(int64(v)), nil | ||||
| 	case int8: | ||||
| 		return newOperandsInt64(int64(v)), nil | ||||
| 	case int16: | ||||
| 		return newOperandsInt64(int64(v)), nil | ||||
| 	case int32: | ||||
| 		return newOperandsInt64(int64(v)), nil | ||||
| 	case int64: | ||||
| 		return newOperandsInt64(v), nil | ||||
| 	case string: | ||||
| 		return newOperandsString(v) | ||||
| 	case float32, float64: | ||||
| 		return nil, fmt.Errorf("floats should be formatted into a string") | ||||
| 	default: | ||||
| 		return nil, fmt.Errorf("invalid type %T; expected integer or string", v) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func newOperandsInt64(i int64) *operands { | ||||
| 	if i < 0 { | ||||
| 		i = -i | ||||
| 	} | ||||
| 	return &operands{float64(i), i, 0, 0, 0, 0} | ||||
| } | ||||
|  | ||||
| func newOperandsString(s string) (*operands, error) { | ||||
| 	if s[0] == '-' { | ||||
| 		s = s[1:] | ||||
| 	} | ||||
| 	n, err := strconv.ParseFloat(s, 64) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	ops := &operands{N: n} | ||||
| 	parts := strings.SplitN(s, ".", 2) | ||||
| 	ops.I, err = strconv.ParseInt(parts[0], 10, 64) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if len(parts) == 1 { | ||||
| 		return ops, nil | ||||
| 	} | ||||
| 	fraction := parts[1] | ||||
| 	ops.V = int64(len(fraction)) | ||||
| 	for i := ops.V - 1; i >= 0; i-- { | ||||
| 		if fraction[i] != '0' { | ||||
| 			ops.W = i + 1 | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 	if ops.V > 0 { | ||||
| 		f, err := strconv.ParseInt(fraction, 10, 0) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		ops.F = f | ||||
| 	} | ||||
| 	if ops.W > 0 { | ||||
| 		t, err := strconv.ParseInt(fraction[:ops.W], 10, 0) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		ops.T = t | ||||
| 	} | ||||
| 	return ops, nil | ||||
| } | ||||
							
								
								
									
										40
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/language/plural.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/language/plural.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| package language | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| ) | ||||
|  | ||||
| // Plural represents a language pluralization form as defined here: | ||||
| // http://cldr.unicode.org/index/cldr-spec/plural-rules | ||||
| type Plural string | ||||
|  | ||||
| // All defined plural categories. | ||||
| const ( | ||||
| 	Invalid Plural = "invalid" | ||||
| 	Zero           = "zero" | ||||
| 	One            = "one" | ||||
| 	Two            = "two" | ||||
| 	Few            = "few" | ||||
| 	Many           = "many" | ||||
| 	Other          = "other" | ||||
| ) | ||||
|  | ||||
| // NewPlural returns src as a Plural | ||||
| // or Invalid and a non-nil error if src is not a valid Plural. | ||||
| func NewPlural(src string) (Plural, error) { | ||||
| 	switch src { | ||||
| 	case "zero": | ||||
| 		return Zero, nil | ||||
| 	case "one": | ||||
| 		return One, nil | ||||
| 	case "two": | ||||
| 		return Two, nil | ||||
| 	case "few": | ||||
| 		return Few, nil | ||||
| 	case "many": | ||||
| 		return Many, nil | ||||
| 	case "other": | ||||
| 		return Other, nil | ||||
| 	} | ||||
| 	return Invalid, fmt.Errorf("invalid plural category %s", src) | ||||
| } | ||||
							
								
								
									
										74
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/language/pluralspec.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/language/pluralspec.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | ||||
| package language | ||||
|  | ||||
| import "strings" | ||||
|  | ||||
| // PluralSpec defines the CLDR plural rules for a language. | ||||
| // http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html | ||||
| // http://unicode.org/reports/tr35/tr35-numbers.html#Operands | ||||
| type PluralSpec struct { | ||||
| 	Plurals    map[Plural]struct{} | ||||
| 	PluralFunc func(*operands) Plural | ||||
| } | ||||
|  | ||||
| var pluralSpecs = make(map[string]*PluralSpec) | ||||
|  | ||||
| func normalizePluralSpecID(id string) string { | ||||
| 	id = strings.Replace(id, "_", "-", -1) | ||||
| 	id = strings.ToLower(id) | ||||
| 	return id | ||||
| } | ||||
|  | ||||
| func registerPluralSpec(ids []string, ps *PluralSpec) { | ||||
| 	for _, id := range ids { | ||||
| 		id = normalizePluralSpecID(id) | ||||
| 		pluralSpecs[id] = ps | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Plural returns the plural category for number as defined by | ||||
| // the language's CLDR plural rules. | ||||
| func (ps *PluralSpec) Plural(number interface{}) (Plural, error) { | ||||
| 	ops, err := newOperands(number) | ||||
| 	if err != nil { | ||||
| 		return Invalid, err | ||||
| 	} | ||||
| 	return ps.PluralFunc(ops), nil | ||||
| } | ||||
|  | ||||
| // getPluralSpec returns the PluralSpec that matches the longest prefix of tag. | ||||
| // It returns nil if no PluralSpec matches tag. | ||||
| func getPluralSpec(tag string) *PluralSpec { | ||||
| 	tag = NormalizeTag(tag) | ||||
| 	subtag := tag | ||||
| 	for { | ||||
| 		if spec := pluralSpecs[subtag]; spec != nil { | ||||
| 			return spec | ||||
| 		} | ||||
| 		end := strings.LastIndex(subtag, "-") | ||||
| 		if end == -1 { | ||||
| 			return nil | ||||
| 		} | ||||
| 		subtag = subtag[:end] | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func newPluralSet(plurals ...Plural) map[Plural]struct{} { | ||||
| 	set := make(map[Plural]struct{}, len(plurals)) | ||||
| 	for _, plural := range plurals { | ||||
| 		set[plural] = struct{}{} | ||||
| 	} | ||||
| 	return set | ||||
| } | ||||
|  | ||||
| func intInRange(i, from, to int64) bool { | ||||
| 	return from <= i && i <= to | ||||
| } | ||||
|  | ||||
| func intEqualsAny(i int64, any ...int64) bool { | ||||
| 	for _, a := range any { | ||||
| 		if i == a { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
							
								
								
									
										567
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/language/pluralspec_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										567
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/language/pluralspec_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,567 @@ | ||||
| package language | ||||
|  | ||||
| // This file is generated by i18n/language/codegen/generate.sh | ||||
|  | ||||
| func init() { | ||||
|  | ||||
| 	registerPluralSpec([]string{"bm", "bo", "dz", "id", "ig", "ii", "in", "ja", "jbo", "jv", "jw", "kde", "kea", "km", "ko", "lkt", "lo", "ms", "my", "nqo", "root", "sah", "ses", "sg", "th", "to", "vi", "wo", "yo", "zh"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"am", "as", "bn", "fa", "gu", "hi", "kn", "mr", "zu"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// i = 0 or n = 1 | ||||
| 			if intEqualsAny(ops.I, 0) || | ||||
| 				ops.NequalsAny(1) { | ||||
| 				return One | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"ff", "fr", "hy", "kab"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// i = 0,1 | ||||
| 			if intEqualsAny(ops.I, 0, 1) { | ||||
| 				return One | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"ast", "ca", "de", "en", "et", "fi", "fy", "gl", "it", "ji", "nl", "sv", "sw", "ur", "yi"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// i = 1 and v = 0 | ||||
| 			if intEqualsAny(ops.I, 1) && intEqualsAny(ops.V, 0) { | ||||
| 				return One | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"si"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// n = 0,1 or i = 0 and f = 1 | ||||
| 			if ops.NequalsAny(0, 1) || | ||||
| 				intEqualsAny(ops.I, 0) && intEqualsAny(ops.F, 1) { | ||||
| 				return One | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"ak", "bh", "guw", "ln", "mg", "nso", "pa", "ti", "wa"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// n = 0..1 | ||||
| 			if ops.NinRange(0, 1) { | ||||
| 				return One | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"tzm"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// n = 0..1 or n = 11..99 | ||||
| 			if ops.NinRange(0, 1) || | ||||
| 				ops.NinRange(11, 99) { | ||||
| 				return One | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"pt"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// n = 0..2 and n != 2 | ||||
| 			if ops.NinRange(0, 2) && !ops.NequalsAny(2) { | ||||
| 				return One | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"af", "asa", "az", "bem", "bez", "bg", "brx", "ce", "cgg", "chr", "ckb", "dv", "ee", "el", "eo", "es", "eu", "fo", "fur", "gsw", "ha", "haw", "hu", "jgo", "jmc", "ka", "kaj", "kcg", "kk", "kkj", "kl", "ks", "ksb", "ku", "ky", "lb", "lg", "mas", "mgo", "ml", "mn", "nah", "nb", "nd", "ne", "nn", "nnh", "no", "nr", "ny", "nyn", "om", "or", "os", "pap", "ps", "rm", "rof", "rwk", "saq", "sdh", "seh", "sn", "so", "sq", "ss", "ssy", "st", "syr", "ta", "te", "teo", "tig", "tk", "tn", "tr", "ts", "ug", "uz", "ve", "vo", "vun", "wae", "xh", "xog"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// n = 1 | ||||
| 			if ops.NequalsAny(1) { | ||||
| 				return One | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"pt_PT"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// n = 1 and v = 0 | ||||
| 			if ops.NequalsAny(1) && intEqualsAny(ops.V, 0) { | ||||
| 				return One | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"da"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// n = 1 or t != 0 and i = 0,1 | ||||
| 			if ops.NequalsAny(1) || | ||||
| 				!intEqualsAny(ops.T, 0) && intEqualsAny(ops.I, 0, 1) { | ||||
| 				return One | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"is"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// t = 0 and i % 10 = 1 and i % 100 != 11 or t != 0 | ||||
| 			if intEqualsAny(ops.T, 0) && intEqualsAny(ops.I%10, 1) && !intEqualsAny(ops.I%100, 11) || | ||||
| 				!intEqualsAny(ops.T, 0) { | ||||
| 				return One | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"mk"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// v = 0 and i % 10 = 1 or f % 10 = 1 | ||||
| 			if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I%10, 1) || | ||||
| 				intEqualsAny(ops.F%10, 1) { | ||||
| 				return One | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"fil", "tl"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// v = 0 and i = 1,2,3 or v = 0 and i % 10 != 4,6,9 or v != 0 and f % 10 != 4,6,9 | ||||
| 			if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I, 1, 2, 3) || | ||||
| 				intEqualsAny(ops.V, 0) && !intEqualsAny(ops.I%10, 4, 6, 9) || | ||||
| 				!intEqualsAny(ops.V, 0) && !intEqualsAny(ops.F%10, 4, 6, 9) { | ||||
| 				return One | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"lv", "prg"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(Zero, One, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// n % 10 = 0 or n % 100 = 11..19 or v = 2 and f % 100 = 11..19 | ||||
| 			if ops.NmodEqualsAny(10, 0) || | ||||
| 				ops.NmodInRange(100, 11, 19) || | ||||
| 				intEqualsAny(ops.V, 2) && intInRange(ops.F%100, 11, 19) { | ||||
| 				return Zero | ||||
| 			} | ||||
| 			// n % 10 = 1 and n % 100 != 11 or v = 2 and f % 10 = 1 and f % 100 != 11 or v != 2 and f % 10 = 1 | ||||
| 			if ops.NmodEqualsAny(10, 1) && !ops.NmodEqualsAny(100, 11) || | ||||
| 				intEqualsAny(ops.V, 2) && intEqualsAny(ops.F%10, 1) && !intEqualsAny(ops.F%100, 11) || | ||||
| 				!intEqualsAny(ops.V, 2) && intEqualsAny(ops.F%10, 1) { | ||||
| 				return One | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"lag"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(Zero, One, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// n = 0 | ||||
| 			if ops.NequalsAny(0) { | ||||
| 				return Zero | ||||
| 			} | ||||
| 			// i = 0,1 and n != 0 | ||||
| 			if intEqualsAny(ops.I, 0, 1) && !ops.NequalsAny(0) { | ||||
| 				return One | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"ksh"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(Zero, One, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// n = 0 | ||||
| 			if ops.NequalsAny(0) { | ||||
| 				return Zero | ||||
| 			} | ||||
| 			// n = 1 | ||||
| 			if ops.NequalsAny(1) { | ||||
| 				return One | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"iu", "kw", "naq", "se", "sma", "smi", "smj", "smn", "sms"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Two, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// n = 1 | ||||
| 			if ops.NequalsAny(1) { | ||||
| 				return One | ||||
| 			} | ||||
| 			// n = 2 | ||||
| 			if ops.NequalsAny(2) { | ||||
| 				return Two | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"shi"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Few, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// i = 0 or n = 1 | ||||
| 			if intEqualsAny(ops.I, 0) || | ||||
| 				ops.NequalsAny(1) { | ||||
| 				return One | ||||
| 			} | ||||
| 			// n = 2..10 | ||||
| 			if ops.NinRange(2, 10) { | ||||
| 				return Few | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"mo", "ro"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Few, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// i = 1 and v = 0 | ||||
| 			if intEqualsAny(ops.I, 1) && intEqualsAny(ops.V, 0) { | ||||
| 				return One | ||||
| 			} | ||||
| 			// v != 0 or n = 0 or n != 1 and n % 100 = 1..19 | ||||
| 			if !intEqualsAny(ops.V, 0) || | ||||
| 				ops.NequalsAny(0) || | ||||
| 				!ops.NequalsAny(1) && ops.NmodInRange(100, 1, 19) { | ||||
| 				return Few | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"bs", "hr", "sh", "sr"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Few, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11 | ||||
| 			if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I%10, 1) && !intEqualsAny(ops.I%100, 11) || | ||||
| 				intEqualsAny(ops.F%10, 1) && !intEqualsAny(ops.F%100, 11) { | ||||
| 				return One | ||||
| 			} | ||||
| 			// v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14 | ||||
| 			if intEqualsAny(ops.V, 0) && intInRange(ops.I%10, 2, 4) && !intInRange(ops.I%100, 12, 14) || | ||||
| 				intInRange(ops.F%10, 2, 4) && !intInRange(ops.F%100, 12, 14) { | ||||
| 				return Few | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"gd"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Two, Few, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// n = 1,11 | ||||
| 			if ops.NequalsAny(1, 11) { | ||||
| 				return One | ||||
| 			} | ||||
| 			// n = 2,12 | ||||
| 			if ops.NequalsAny(2, 12) { | ||||
| 				return Two | ||||
| 			} | ||||
| 			// n = 3..10,13..19 | ||||
| 			if ops.NinRange(3, 10) || ops.NinRange(13, 19) { | ||||
| 				return Few | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"sl"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Two, Few, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// v = 0 and i % 100 = 1 | ||||
| 			if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I%100, 1) { | ||||
| 				return One | ||||
| 			} | ||||
| 			// v = 0 and i % 100 = 2 | ||||
| 			if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I%100, 2) { | ||||
| 				return Two | ||||
| 			} | ||||
| 			// v = 0 and i % 100 = 3..4 or v != 0 | ||||
| 			if intEqualsAny(ops.V, 0) && intInRange(ops.I%100, 3, 4) || | ||||
| 				!intEqualsAny(ops.V, 0) { | ||||
| 				return Few | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"dsb", "hsb"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Two, Few, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// v = 0 and i % 100 = 1 or f % 100 = 1 | ||||
| 			if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I%100, 1) || | ||||
| 				intEqualsAny(ops.F%100, 1) { | ||||
| 				return One | ||||
| 			} | ||||
| 			// v = 0 and i % 100 = 2 or f % 100 = 2 | ||||
| 			if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I%100, 2) || | ||||
| 				intEqualsAny(ops.F%100, 2) { | ||||
| 				return Two | ||||
| 			} | ||||
| 			// v = 0 and i % 100 = 3..4 or f % 100 = 3..4 | ||||
| 			if intEqualsAny(ops.V, 0) && intInRange(ops.I%100, 3, 4) || | ||||
| 				intInRange(ops.F%100, 3, 4) { | ||||
| 				return Few | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"he", "iw"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Two, Many, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// i = 1 and v = 0 | ||||
| 			if intEqualsAny(ops.I, 1) && intEqualsAny(ops.V, 0) { | ||||
| 				return One | ||||
| 			} | ||||
| 			// i = 2 and v = 0 | ||||
| 			if intEqualsAny(ops.I, 2) && intEqualsAny(ops.V, 0) { | ||||
| 				return Two | ||||
| 			} | ||||
| 			// v = 0 and n != 0..10 and n % 10 = 0 | ||||
| 			if intEqualsAny(ops.V, 0) && !ops.NinRange(0, 10) && ops.NmodEqualsAny(10, 0) { | ||||
| 				return Many | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"cs", "sk"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Few, Many, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// i = 1 and v = 0 | ||||
| 			if intEqualsAny(ops.I, 1) && intEqualsAny(ops.V, 0) { | ||||
| 				return One | ||||
| 			} | ||||
| 			// i = 2..4 and v = 0 | ||||
| 			if intInRange(ops.I, 2, 4) && intEqualsAny(ops.V, 0) { | ||||
| 				return Few | ||||
| 			} | ||||
| 			// v != 0 | ||||
| 			if !intEqualsAny(ops.V, 0) { | ||||
| 				return Many | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"pl"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Few, Many, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// i = 1 and v = 0 | ||||
| 			if intEqualsAny(ops.I, 1) && intEqualsAny(ops.V, 0) { | ||||
| 				return One | ||||
| 			} | ||||
| 			// v = 0 and i % 10 = 2..4 and i % 100 != 12..14 | ||||
| 			if intEqualsAny(ops.V, 0) && intInRange(ops.I%10, 2, 4) && !intInRange(ops.I%100, 12, 14) { | ||||
| 				return Few | ||||
| 			} | ||||
| 			// v = 0 and i != 1 and i % 10 = 0..1 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 12..14 | ||||
| 			if intEqualsAny(ops.V, 0) && !intEqualsAny(ops.I, 1) && intInRange(ops.I%10, 0, 1) || | ||||
| 				intEqualsAny(ops.V, 0) && intInRange(ops.I%10, 5, 9) || | ||||
| 				intEqualsAny(ops.V, 0) && intInRange(ops.I%100, 12, 14) { | ||||
| 				return Many | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"be"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Few, Many, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// n % 10 = 1 and n % 100 != 11 | ||||
| 			if ops.NmodEqualsAny(10, 1) && !ops.NmodEqualsAny(100, 11) { | ||||
| 				return One | ||||
| 			} | ||||
| 			// n % 10 = 2..4 and n % 100 != 12..14 | ||||
| 			if ops.NmodInRange(10, 2, 4) && !ops.NmodInRange(100, 12, 14) { | ||||
| 				return Few | ||||
| 			} | ||||
| 			// n % 10 = 0 or n % 10 = 5..9 or n % 100 = 11..14 | ||||
| 			if ops.NmodEqualsAny(10, 0) || | ||||
| 				ops.NmodInRange(10, 5, 9) || | ||||
| 				ops.NmodInRange(100, 11, 14) { | ||||
| 				return Many | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"lt"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Few, Many, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// n % 10 = 1 and n % 100 != 11..19 | ||||
| 			if ops.NmodEqualsAny(10, 1) && !ops.NmodInRange(100, 11, 19) { | ||||
| 				return One | ||||
| 			} | ||||
| 			// n % 10 = 2..9 and n % 100 != 11..19 | ||||
| 			if ops.NmodInRange(10, 2, 9) && !ops.NmodInRange(100, 11, 19) { | ||||
| 				return Few | ||||
| 			} | ||||
| 			// f != 0 | ||||
| 			if !intEqualsAny(ops.F, 0) { | ||||
| 				return Many | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"mt"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Few, Many, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// n = 1 | ||||
| 			if ops.NequalsAny(1) { | ||||
| 				return One | ||||
| 			} | ||||
| 			// n = 0 or n % 100 = 2..10 | ||||
| 			if ops.NequalsAny(0) || | ||||
| 				ops.NmodInRange(100, 2, 10) { | ||||
| 				return Few | ||||
| 			} | ||||
| 			// n % 100 = 11..19 | ||||
| 			if ops.NmodInRange(100, 11, 19) { | ||||
| 				return Many | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"ru", "uk"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Few, Many, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// v = 0 and i % 10 = 1 and i % 100 != 11 | ||||
| 			if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I%10, 1) && !intEqualsAny(ops.I%100, 11) { | ||||
| 				return One | ||||
| 			} | ||||
| 			// v = 0 and i % 10 = 2..4 and i % 100 != 12..14 | ||||
| 			if intEqualsAny(ops.V, 0) && intInRange(ops.I%10, 2, 4) && !intInRange(ops.I%100, 12, 14) { | ||||
| 				return Few | ||||
| 			} | ||||
| 			// v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14 | ||||
| 			if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I%10, 0) || | ||||
| 				intEqualsAny(ops.V, 0) && intInRange(ops.I%10, 5, 9) || | ||||
| 				intEqualsAny(ops.V, 0) && intInRange(ops.I%100, 11, 14) { | ||||
| 				return Many | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"br"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Two, Few, Many, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// n % 10 = 1 and n % 100 != 11,71,91 | ||||
| 			if ops.NmodEqualsAny(10, 1) && !ops.NmodEqualsAny(100, 11, 71, 91) { | ||||
| 				return One | ||||
| 			} | ||||
| 			// n % 10 = 2 and n % 100 != 12,72,92 | ||||
| 			if ops.NmodEqualsAny(10, 2) && !ops.NmodEqualsAny(100, 12, 72, 92) { | ||||
| 				return Two | ||||
| 			} | ||||
| 			// n % 10 = 3..4,9 and n % 100 != 10..19,70..79,90..99 | ||||
| 			if (ops.NmodInRange(10, 3, 4) || ops.NmodEqualsAny(10, 9)) && !(ops.NmodInRange(100, 10, 19) || ops.NmodInRange(100, 70, 79) || ops.NmodInRange(100, 90, 99)) { | ||||
| 				return Few | ||||
| 			} | ||||
| 			// n != 0 and n % 1000000 = 0 | ||||
| 			if !ops.NequalsAny(0) && ops.NmodEqualsAny(1000000, 0) { | ||||
| 				return Many | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"ga"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Two, Few, Many, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// n = 1 | ||||
| 			if ops.NequalsAny(1) { | ||||
| 				return One | ||||
| 			} | ||||
| 			// n = 2 | ||||
| 			if ops.NequalsAny(2) { | ||||
| 				return Two | ||||
| 			} | ||||
| 			// n = 3..6 | ||||
| 			if ops.NinRange(3, 6) { | ||||
| 				return Few | ||||
| 			} | ||||
| 			// n = 7..10 | ||||
| 			if ops.NinRange(7, 10) { | ||||
| 				return Many | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"gv"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(One, Two, Few, Many, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// v = 0 and i % 10 = 1 | ||||
| 			if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I%10, 1) { | ||||
| 				return One | ||||
| 			} | ||||
| 			// v = 0 and i % 10 = 2 | ||||
| 			if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I%10, 2) { | ||||
| 				return Two | ||||
| 			} | ||||
| 			// v = 0 and i % 100 = 0,20,40,60,80 | ||||
| 			if intEqualsAny(ops.V, 0) && intEqualsAny(ops.I%100, 0, 20, 40, 60, 80) { | ||||
| 				return Few | ||||
| 			} | ||||
| 			// v != 0 | ||||
| 			if !intEqualsAny(ops.V, 0) { | ||||
| 				return Many | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"ar"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(Zero, One, Two, Few, Many, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// n = 0 | ||||
| 			if ops.NequalsAny(0) { | ||||
| 				return Zero | ||||
| 			} | ||||
| 			// n = 1 | ||||
| 			if ops.NequalsAny(1) { | ||||
| 				return One | ||||
| 			} | ||||
| 			// n = 2 | ||||
| 			if ops.NequalsAny(2) { | ||||
| 				return Two | ||||
| 			} | ||||
| 			// n % 100 = 3..10 | ||||
| 			if ops.NmodInRange(100, 3, 10) { | ||||
| 				return Few | ||||
| 			} | ||||
| 			// n % 100 = 11..99 | ||||
| 			if ops.NmodInRange(100, 11, 99) { | ||||
| 				return Many | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| 	registerPluralSpec([]string{"cy"}, &PluralSpec{ | ||||
| 		Plurals: newPluralSet(Zero, One, Two, Few, Many, Other), | ||||
| 		PluralFunc: func(ops *operands) Plural { | ||||
| 			// n = 0 | ||||
| 			if ops.NequalsAny(0) { | ||||
| 				return Zero | ||||
| 			} | ||||
| 			// n = 1 | ||||
| 			if ops.NequalsAny(1) { | ||||
| 				return One | ||||
| 			} | ||||
| 			// n = 2 | ||||
| 			if ops.NequalsAny(2) { | ||||
| 				return Two | ||||
| 			} | ||||
| 			// n = 3 | ||||
| 			if ops.NequalsAny(3) { | ||||
| 				return Few | ||||
| 			} | ||||
| 			// n = 6 | ||||
| 			if ops.NequalsAny(6) { | ||||
| 				return Many | ||||
| 			} | ||||
| 			return Other | ||||
| 		}, | ||||
| 	}) | ||||
| } | ||||
							
								
								
									
										78
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/translation/plural_translation.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/translation/plural_translation.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | ||||
| package translation | ||||
|  | ||||
| import ( | ||||
| 	"github.com/nicksnyder/go-i18n/i18n/language" | ||||
| ) | ||||
|  | ||||
| type pluralTranslation struct { | ||||
| 	id        string | ||||
| 	templates map[language.Plural]*template | ||||
| } | ||||
|  | ||||
| func (pt *pluralTranslation) MarshalInterface() interface{} { | ||||
| 	return map[string]interface{}{ | ||||
| 		"id":          pt.id, | ||||
| 		"translation": pt.templates, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (pt *pluralTranslation) ID() string { | ||||
| 	return pt.id | ||||
| } | ||||
|  | ||||
| func (pt *pluralTranslation) Template(pc language.Plural) *template { | ||||
| 	return pt.templates[pc] | ||||
| } | ||||
|  | ||||
| func (pt *pluralTranslation) UntranslatedCopy() Translation { | ||||
| 	return &pluralTranslation{pt.id, make(map[language.Plural]*template)} | ||||
| } | ||||
|  | ||||
| func (pt *pluralTranslation) Normalize(l *language.Language) Translation { | ||||
| 	// Delete plural categories that don't belong to this language. | ||||
| 	for pc := range pt.templates { | ||||
| 		if _, ok := l.Plurals[pc]; !ok { | ||||
| 			delete(pt.templates, pc) | ||||
| 		} | ||||
| 	} | ||||
| 	// Create map entries for missing valid categories. | ||||
| 	for pc := range l.Plurals { | ||||
| 		if _, ok := pt.templates[pc]; !ok { | ||||
| 			pt.templates[pc] = mustNewTemplate("") | ||||
| 		} | ||||
| 	} | ||||
| 	return pt | ||||
| } | ||||
|  | ||||
| func (pt *pluralTranslation) Backfill(src Translation) Translation { | ||||
| 	for pc, t := range pt.templates { | ||||
| 		if t == nil || t.src == "" { | ||||
| 			pt.templates[pc] = src.Template(language.Other) | ||||
| 		} | ||||
| 	} | ||||
| 	return pt | ||||
| } | ||||
|  | ||||
| func (pt *pluralTranslation) Merge(t Translation) Translation { | ||||
| 	other, ok := t.(*pluralTranslation) | ||||
| 	if !ok || pt.ID() != t.ID() { | ||||
| 		return t | ||||
| 	} | ||||
| 	for pluralCategory, template := range other.templates { | ||||
| 		if template != nil && template.src != "" { | ||||
| 			pt.templates[pluralCategory] = template | ||||
| 		} | ||||
| 	} | ||||
| 	return pt | ||||
| } | ||||
|  | ||||
| func (pt *pluralTranslation) Incomplete(l *language.Language) bool { | ||||
| 	for pc := range l.Plurals { | ||||
| 		if t := pt.templates[pc]; t == nil || t.src == "" { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| var _ = Translation(&pluralTranslation{}) | ||||
							
								
								
									
										57
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/translation/single_translation.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/translation/single_translation.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| package translation | ||||
|  | ||||
| import ( | ||||
| 	"github.com/nicksnyder/go-i18n/i18n/language" | ||||
| ) | ||||
|  | ||||
| type singleTranslation struct { | ||||
| 	id       string | ||||
| 	template *template | ||||
| } | ||||
|  | ||||
| func (st *singleTranslation) MarshalInterface() interface{} { | ||||
| 	return map[string]interface{}{ | ||||
| 		"id":          st.id, | ||||
| 		"translation": st.template, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (st *singleTranslation) ID() string { | ||||
| 	return st.id | ||||
| } | ||||
|  | ||||
| func (st *singleTranslation) Template(pc language.Plural) *template { | ||||
| 	return st.template | ||||
| } | ||||
|  | ||||
| func (st *singleTranslation) UntranslatedCopy() Translation { | ||||
| 	return &singleTranslation{st.id, mustNewTemplate("")} | ||||
| } | ||||
|  | ||||
| func (st *singleTranslation) Normalize(language *language.Language) Translation { | ||||
| 	return st | ||||
| } | ||||
|  | ||||
| func (st *singleTranslation) Backfill(src Translation) Translation { | ||||
| 	if st.template == nil || st.template.src == "" { | ||||
| 		st.template = src.Template(language.Other) | ||||
| 	} | ||||
| 	return st | ||||
| } | ||||
|  | ||||
| func (st *singleTranslation) Merge(t Translation) Translation { | ||||
| 	other, ok := t.(*singleTranslation) | ||||
| 	if !ok || st.ID() != t.ID() { | ||||
| 		return t | ||||
| 	} | ||||
| 	if other.template != nil && other.template.src != "" { | ||||
| 		st.template = other.template | ||||
| 	} | ||||
| 	return st | ||||
| } | ||||
|  | ||||
| func (st *singleTranslation) Incomplete(l *language.Language) bool { | ||||
| 	return st.template == nil || st.template.src == "" | ||||
| } | ||||
|  | ||||
| var _ = Translation(&singleTranslation{}) | ||||
							
								
								
									
										61
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/translation/template.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/translation/template.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | ||||
| package translation | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding" | ||||
| 	"strings" | ||||
| 	gotemplate "text/template" | ||||
| ) | ||||
|  | ||||
| type template struct { | ||||
| 	tmpl *gotemplate.Template | ||||
| 	src  string | ||||
| } | ||||
|  | ||||
| func newTemplate(src string) (*template, error) { | ||||
| 	var tmpl template | ||||
| 	err := tmpl.parseTemplate(src) | ||||
| 	return &tmpl, err | ||||
| } | ||||
|  | ||||
| func mustNewTemplate(src string) *template { | ||||
| 	t, err := newTemplate(src) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	return t | ||||
| } | ||||
|  | ||||
| func (t *template) String() string { | ||||
| 	return t.src | ||||
| } | ||||
|  | ||||
| func (t *template) Execute(args interface{}) string { | ||||
| 	if t.tmpl == nil { | ||||
| 		return t.src | ||||
| 	} | ||||
| 	var buf bytes.Buffer | ||||
| 	if err := t.tmpl.Execute(&buf, args); err != nil { | ||||
| 		return err.Error() | ||||
| 	} | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func (t *template) MarshalText() ([]byte, error) { | ||||
| 	return []byte(t.src), nil | ||||
| } | ||||
|  | ||||
| func (t *template) UnmarshalText(src []byte) error { | ||||
| 	return t.parseTemplate(string(src)) | ||||
| } | ||||
|  | ||||
| func (t *template) parseTemplate(src string) (err error) { | ||||
| 	t.src = src | ||||
| 	if strings.Contains(src, "{{") { | ||||
| 		t.tmpl, err = gotemplate.New(src).Parse(src) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| var _ = encoding.TextMarshaler(&template{}) | ||||
| var _ = encoding.TextUnmarshaler(&template{}) | ||||
							
								
								
									
										83
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/translation/translation.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/nicksnyder/go-i18n/i18n/translation/translation.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,83 @@ | ||||
| // Package translation defines the interface for a translation. | ||||
| package translation | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
|  | ||||
| 	"github.com/nicksnyder/go-i18n/i18n/language" | ||||
| ) | ||||
|  | ||||
| // Translation is the interface that represents a translated string. | ||||
| type Translation interface { | ||||
| 	// MarshalInterface returns the object that should be used | ||||
| 	// to serialize the translation. | ||||
| 	MarshalInterface() interface{} | ||||
| 	ID() string | ||||
| 	Template(language.Plural) *template | ||||
| 	UntranslatedCopy() Translation | ||||
| 	Normalize(language *language.Language) Translation | ||||
| 	Backfill(src Translation) Translation | ||||
| 	Merge(Translation) Translation | ||||
| 	Incomplete(l *language.Language) bool | ||||
| } | ||||
|  | ||||
| // SortableByID implements sort.Interface for a slice of translations. | ||||
| type SortableByID []Translation | ||||
|  | ||||
| func (a SortableByID) Len() int           { return len(a) } | ||||
| func (a SortableByID) Swap(i, j int)      { a[i], a[j] = a[j], a[i] } | ||||
| func (a SortableByID) Less(i, j int) bool { return a[i].ID() < a[j].ID() } | ||||
|  | ||||
| // NewTranslation reflects on data to create a new Translation. | ||||
| // | ||||
| // data["id"] must be a string and data["translation"] must be either a string | ||||
| // for a non-plural translation or a map[string]interface{} for a plural translation. | ||||
| func NewTranslation(data map[string]interface{}) (Translation, error) { | ||||
| 	id, ok := data["id"].(string) | ||||
| 	if !ok { | ||||
| 		return nil, fmt.Errorf(`missing "id" key`) | ||||
| 	} | ||||
| 	var pluralObject map[string]interface{} | ||||
| 	switch translation := data["translation"].(type) { | ||||
| 	case string: | ||||
| 		tmpl, err := newTemplate(translation) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		return &singleTranslation{id, tmpl}, nil | ||||
| 	case map[interface{}]interface{}: | ||||
| 		// The YAML parser uses interface{} keys so we first convert them to string keys. | ||||
| 		pluralObject = make(map[string]interface{}) | ||||
| 		for k, v := range translation { | ||||
| 			kStr, ok := k.(string) | ||||
| 			if !ok { | ||||
| 				return nil, fmt.Errorf(`invalid plural category type %T; expected string`, k) | ||||
| 			} | ||||
| 			pluralObject[kStr] = v | ||||
| 		} | ||||
| 	case map[string]interface{}: | ||||
| 		pluralObject = translation | ||||
| 	case nil: | ||||
| 		return nil, fmt.Errorf(`missing "translation" key`) | ||||
| 	default: | ||||
| 		return nil, fmt.Errorf(`unsupported type for "translation" key %T`, translation) | ||||
| 	} | ||||
|  | ||||
| 	templates := make(map[language.Plural]*template, len(pluralObject)) | ||||
| 	for k, v := range pluralObject { | ||||
| 		pc, err := language.NewPlural(k) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		str, ok := v.(string) | ||||
| 		if !ok { | ||||
| 			return nil, fmt.Errorf(`plural category "%s" has value of type %T; expected string`, pc, v) | ||||
| 		} | ||||
| 		tmpl, err := newTemplate(str) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		templates[pc] = tmpl | ||||
| 	} | ||||
| 	return &pluralTranslation{id, templates}, nil | ||||
| } | ||||
							
								
								
									
										897
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/LICENSE.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										897
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/LICENSE.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,897 @@ | ||||
| Mattermost Licensing | ||||
|  | ||||
| SOFTWARE LICENSING  | ||||
|  | ||||
| You are licensed to use compiled versions of the Mattermost platform produced by Mattermost, Inc. under an MIT LICENSE  | ||||
|  | ||||
| -	See MIT-COMPILED-LICENSE.md included in compiled versions for details | ||||
|  | ||||
| You may be licensed to use source code to create compiled versions not produced by Mattermost, Inc. in one of two ways: | ||||
|  | ||||
| 1. Under the Free Software Foundation’s GNU AGPL v.3.0, subject to the exceptions outlined in this policy; or  | ||||
| 2. Under a commercial license available from Mattermost, Inc. by contacting commercial@mattermost.com  | ||||
|  | ||||
| You are licensed to use the source code in Admin Tools and Configuration Files (templates/, config/, model/,  | ||||
| webapp/client, webapp/fonts, webapp/i18n, webapp/images and all subdirectories thereof) under the Apache License v2.0. | ||||
|  | ||||
| We promise that we will not enforce the copyleft provisions in AGPL v3.0 against you if your application (a) does not  | ||||
| link to the Mattermost Platform directly, but exclusively uses the Mattermost Admin Tools and Configuration Files, and | ||||
| (b) you have not modified, added to or adapted the source code of Mattermost in a way that results in the creation of  | ||||
| a “modified version” or “work based on” Mattermost as these terms are defined in the AGPL v3.0 license. | ||||
|  | ||||
| MATTERMOST TRADEMARK GUIDELINES | ||||
|  | ||||
| Your use of the mark Mattermost is subject to Mattermost, Inc's prior written approval and our organization’s Trademark  | ||||
| Standards of Use at http://www.mattermost.org/trademark-standards-of-use/. For trademark approval or any questions  | ||||
| you have about using these trademarks, please email trademark@mattermost.com  | ||||
|  | ||||
| ------------------------------------------------------------------------------------------------------------------------------ | ||||
|                                 | ||||
|                                Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "[]" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright [yyyy] [name of copyright owner] | ||||
|  | ||||
|    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. | ||||
|  | ||||
| ------------------------------------------------------------------------------ | ||||
|  | ||||
| The software is released under the terms of the GNU Affero General Public | ||||
| License, version 3. | ||||
|  | ||||
|                     GNU AFFERO GENERAL PUBLIC LICENSE | ||||
|                        Version 3, 19 November 2007 | ||||
|  | ||||
|  Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | ||||
|  Everyone is permitted to copy and distribute verbatim copies | ||||
|  of this license document, but changing it is not allowed. | ||||
|  | ||||
|                             Preamble | ||||
|  | ||||
|   The GNU Affero General Public License is a free, copyleft license for | ||||
| software and other kinds of works, specifically designed to ensure | ||||
| cooperation with the community in the case of network server software. | ||||
|  | ||||
|   The licenses for most software and other practical works are designed | ||||
| to take away your freedom to share and change the works.  By contrast, | ||||
| our General Public Licenses are intended to guarantee your freedom to | ||||
| share and change all versions of a program--to make sure it remains free | ||||
| software for all its users. | ||||
|  | ||||
|   When we speak of free software, we are referring to freedom, not | ||||
| price.  Our General Public Licenses are designed to make sure that you | ||||
| have the freedom to distribute copies of free software (and charge for | ||||
| them if you wish), that you receive source code or can get it if you | ||||
| want it, that you can change the software or use pieces of it in new | ||||
| free programs, and that you know you can do these things. | ||||
|  | ||||
|   Developers that use our General Public Licenses protect your rights | ||||
| with two steps: (1) assert copyright on the software, and (2) offer | ||||
| you this License which gives you legal permission to copy, distribute | ||||
| and/or modify the software. | ||||
|  | ||||
|   A secondary benefit of defending all users' freedom is that | ||||
| improvements made in alternate versions of the program, if they | ||||
| receive widespread use, become available for other developers to | ||||
| incorporate.  Many developers of free software are heartened and | ||||
| encouraged by the resulting cooperation.  However, in the case of | ||||
| software used on network servers, this result may fail to come about. | ||||
| The GNU General Public License permits making a modified version and | ||||
| letting the public access it on a server without ever releasing its | ||||
| source code to the public. | ||||
|  | ||||
|   The GNU Affero General Public License is designed specifically to | ||||
| ensure that, in such cases, the modified source code becomes available | ||||
| to the community.  It requires the operator of a network server to | ||||
| provide the source code of the modified version running there to the | ||||
| users of that server.  Therefore, public use of a modified version, on | ||||
| a publicly accessible server, gives the public access to the source | ||||
| code of the modified version. | ||||
|  | ||||
|   An older license, called the Affero General Public License and | ||||
| published by Affero, was designed to accomplish similar goals.  This is | ||||
| a different license, not a version of the Affero GPL, but Affero has | ||||
| released a new version of the Affero GPL which permits relicensing under | ||||
| this license. | ||||
|  | ||||
|   The precise terms and conditions for copying, distribution and | ||||
| modification follow. | ||||
|  | ||||
|                        TERMS AND CONDITIONS | ||||
|  | ||||
|   0. Definitions. | ||||
|  | ||||
|   "This License" refers to version 3 of the GNU Affero General Public License. | ||||
|  | ||||
|   "Copyright" also means copyright-like laws that apply to other kinds of | ||||
| works, such as semiconductor masks. | ||||
|  | ||||
|   "The Program" refers to any copyrightable work licensed under this | ||||
| License.  Each licensee is addressed as "you".  "Licensees" and | ||||
| "recipients" may be individuals or organizations. | ||||
|  | ||||
|   To "modify" a work means to copy from or adapt all or part of the work | ||||
| in a fashion requiring copyright permission, other than the making of an | ||||
| exact copy.  The resulting work is called a "modified version" of the | ||||
| earlier work or a work "based on" the earlier work. | ||||
|  | ||||
|   A "covered work" means either the unmodified Program or a work based | ||||
| on the Program. | ||||
|  | ||||
|   To "propagate" a work means to do anything with it that, without | ||||
| permission, would make you directly or secondarily liable for | ||||
| infringement under applicable copyright law, except executing it on a | ||||
| computer or modifying a private copy.  Propagation includes copying, | ||||
| distribution (with or without modification), making available to the | ||||
| public, and in some countries other activities as well. | ||||
|  | ||||
|   To "convey" a work means any kind of propagation that enables other | ||||
| parties to make or receive copies.  Mere interaction with a user through | ||||
| a computer network, with no transfer of a copy, is not conveying. | ||||
|  | ||||
|   An interactive user interface displays "Appropriate Legal Notices" | ||||
| to the extent that it includes a convenient and prominently visible | ||||
| feature that (1) displays an appropriate copyright notice, and (2) | ||||
| tells the user that there is no warranty for the work (except to the | ||||
| extent that warranties are provided), that licensees may convey the | ||||
| work under this License, and how to view a copy of this License.  If | ||||
| the interface presents a list of user commands or options, such as a | ||||
| menu, a prominent item in the list meets this criterion. | ||||
|  | ||||
|   1. Source Code. | ||||
|  | ||||
|   The "source code" for a work means the preferred form of the work | ||||
| for making modifications to it.  "Object code" means any non-source | ||||
| form of a work. | ||||
|  | ||||
|   A "Standard Interface" means an interface that either is an official | ||||
| standard defined by a recognized standards body, or, in the case of | ||||
| interfaces specified for a particular programming language, one that | ||||
| is widely used among developers working in that language. | ||||
|  | ||||
|   The "System Libraries" of an executable work include anything, other | ||||
| than the work as a whole, that (a) is included in the normal form of | ||||
| packaging a Major Component, but which is not part of that Major | ||||
| Component, and (b) serves only to enable use of the work with that | ||||
| Major Component, or to implement a Standard Interface for which an | ||||
| implementation is available to the public in source code form.  A | ||||
| "Major Component", in this context, means a major essential component | ||||
| (kernel, window system, and so on) of the specific operating system | ||||
| (if any) on which the executable work runs, or a compiler used to | ||||
| produce the work, or an object code interpreter used to run it. | ||||
|  | ||||
|   The "Corresponding Source" for a work in object code form means all | ||||
| the source code needed to generate, install, and (for an executable | ||||
| work) run the object code and to modify the work, including scripts to | ||||
| control those activities.  However, it does not include the work's | ||||
| System Libraries, or general-purpose tools or generally available free | ||||
| programs which are used unmodified in performing those activities but | ||||
| which are not part of the work.  For example, Corresponding Source | ||||
| includes interface definition files associated with source files for | ||||
| the work, and the source code for shared libraries and dynamically | ||||
| linked subprograms that the work is specifically designed to require, | ||||
| such as by intimate data communication or control flow between those | ||||
| subprograms and other parts of the work. | ||||
|  | ||||
|   The Corresponding Source need not include anything that users | ||||
| can regenerate automatically from other parts of the Corresponding | ||||
| Source. | ||||
|  | ||||
|   The Corresponding Source for a work in source code form is that | ||||
| same work. | ||||
|  | ||||
|   2. Basic Permissions. | ||||
|  | ||||
|   All rights granted under this License are granted for the term of | ||||
| copyright on the Program, and are irrevocable provided the stated | ||||
| conditions are met.  This License explicitly affirms your unlimited | ||||
| permission to run the unmodified Program.  The output from running a | ||||
| covered work is covered by this License only if the output, given its | ||||
| content, constitutes a covered work.  This License acknowledges your | ||||
| rights of fair use or other equivalent, as provided by copyright law. | ||||
|  | ||||
|   You may make, run and propagate covered works that you do not | ||||
| convey, without conditions so long as your license otherwise remains | ||||
| in force.  You may convey covered works to others for the sole purpose | ||||
| of having them make modifications exclusively for you, or provide you | ||||
| with facilities for running those works, provided that you comply with | ||||
| the terms of this License in conveying all material for which you do | ||||
| not control copyright.  Those thus making or running the covered works | ||||
| for you must do so exclusively on your behalf, under your direction | ||||
| and control, on terms that prohibit them from making any copies of | ||||
| your copyrighted material outside their relationship with you. | ||||
|  | ||||
|   Conveying under any other circumstances is permitted solely under | ||||
| the conditions stated below.  Sublicensing is not allowed; section 10 | ||||
| makes it unnecessary. | ||||
|  | ||||
|   3. Protecting Users' Legal Rights From Anti-Circumvention Law. | ||||
|  | ||||
|   No covered work shall be deemed part of an effective technological | ||||
| measure under any applicable law fulfilling obligations under article | ||||
| 11 of the WIPO copyright treaty adopted on 20 December 1996, or | ||||
| similar laws prohibiting or restricting circumvention of such | ||||
| measures. | ||||
|  | ||||
|   When you convey a covered work, you waive any legal power to forbid | ||||
| circumvention of technological measures to the extent such circumvention | ||||
| is effected by exercising rights under this License with respect to | ||||
| the covered work, and you disclaim any intention to limit operation or | ||||
| modification of the work as a means of enforcing, against the work's | ||||
| users, your or third parties' legal rights to forbid circumvention of | ||||
| technological measures. | ||||
|  | ||||
|   4. Conveying Verbatim Copies. | ||||
|  | ||||
|   You may convey verbatim copies of the Program's source code as you | ||||
| receive it, in any medium, provided that you conspicuously and | ||||
| appropriately publish on each copy an appropriate copyright notice; | ||||
| keep intact all notices stating that this License and any | ||||
| non-permissive terms added in accord with section 7 apply to the code; | ||||
| keep intact all notices of the absence of any warranty; and give all | ||||
| recipients a copy of this License along with the Program. | ||||
|  | ||||
|   You may charge any price or no price for each copy that you convey, | ||||
| and you may offer support or warranty protection for a fee. | ||||
|  | ||||
|   5. Conveying Modified Source Versions. | ||||
|  | ||||
|   You may convey a work based on the Program, or the modifications to | ||||
| produce it from the Program, in the form of source code under the | ||||
| terms of section 4, provided that you also meet all of these conditions: | ||||
|  | ||||
|     a) The work must carry prominent notices stating that you modified | ||||
|     it, and giving a relevant date. | ||||
|  | ||||
|     b) The work must carry prominent notices stating that it is | ||||
|     released under this License and any conditions added under section | ||||
|     7.  This requirement modifies the requirement in section 4 to | ||||
|     "keep intact all notices". | ||||
|  | ||||
|     c) You must license the entire work, as a whole, under this | ||||
|     License to anyone who comes into possession of a copy.  This | ||||
|     License will therefore apply, along with any applicable section 7 | ||||
|     additional terms, to the whole of the work, and all its parts, | ||||
|     regardless of how they are packaged.  This License gives no | ||||
|     permission to license the work in any other way, but it does not | ||||
|     invalidate such permission if you have separately received it. | ||||
|  | ||||
|     d) If the work has interactive user interfaces, each must display | ||||
|     Appropriate Legal Notices; however, if the Program has interactive | ||||
|     interfaces that do not display Appropriate Legal Notices, your | ||||
|     work need not make them do so. | ||||
|  | ||||
|   A compilation of a covered work with other separate and independent | ||||
| works, which are not by their nature extensions of the covered work, | ||||
| and which are not combined with it such as to form a larger program, | ||||
| in or on a volume of a storage or distribution medium, is called an | ||||
| "aggregate" if the compilation and its resulting copyright are not | ||||
| used to limit the access or legal rights of the compilation's users | ||||
| beyond what the individual works permit.  Inclusion of a covered work | ||||
| in an aggregate does not cause this License to apply to the other | ||||
| parts of the aggregate. | ||||
|  | ||||
|   6. Conveying Non-Source Forms. | ||||
|  | ||||
|   You may convey a covered work in object code form under the terms | ||||
| of sections 4 and 5, provided that you also convey the | ||||
| machine-readable Corresponding Source under the terms of this License, | ||||
| in one of these ways: | ||||
|  | ||||
|     a) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by the | ||||
|     Corresponding Source fixed on a durable physical medium | ||||
|     customarily used for software interchange. | ||||
|  | ||||
|     b) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by a | ||||
|     written offer, valid for at least three years and valid for as | ||||
|     long as you offer spare parts or customer support for that product | ||||
|     model, to give anyone who possesses the object code either (1) a | ||||
|     copy of the Corresponding Source for all the software in the | ||||
|     product that is covered by this License, on a durable physical | ||||
|     medium customarily used for software interchange, for a price no | ||||
|     more than your reasonable cost of physically performing this | ||||
|     conveying of source, or (2) access to copy the | ||||
|     Corresponding Source from a network server at no charge. | ||||
|  | ||||
|     c) Convey individual copies of the object code with a copy of the | ||||
|     written offer to provide the Corresponding Source.  This | ||||
|     alternative is allowed only occasionally and noncommercially, and | ||||
|     only if you received the object code with such an offer, in accord | ||||
|     with subsection 6b. | ||||
|  | ||||
|     d) Convey the object code by offering access from a designated | ||||
|     place (gratis or for a charge), and offer equivalent access to the | ||||
|     Corresponding Source in the same way through the same place at no | ||||
|     further charge.  You need not require recipients to copy the | ||||
|     Corresponding Source along with the object code.  If the place to | ||||
|     copy the object code is a network server, the Corresponding Source | ||||
|     may be on a different server (operated by you or a third party) | ||||
|     that supports equivalent copying facilities, provided you maintain | ||||
|     clear directions next to the object code saying where to find the | ||||
|     Corresponding Source.  Regardless of what server hosts the | ||||
|     Corresponding Source, you remain obligated to ensure that it is | ||||
|     available for as long as needed to satisfy these requirements. | ||||
|  | ||||
|     e) Convey the object code using peer-to-peer transmission, provided | ||||
|     you inform other peers where the object code and Corresponding | ||||
|     Source of the work are being offered to the general public at no | ||||
|     charge under subsection 6d. | ||||
|  | ||||
|   A separable portion of the object code, whose source code is excluded | ||||
| from the Corresponding Source as a System Library, need not be | ||||
| included in conveying the object code work. | ||||
|  | ||||
|   A "User Product" is either (1) a "consumer product", which means any | ||||
| tangible personal property which is normally used for personal, family, | ||||
| or household purposes, or (2) anything designed or sold for incorporation | ||||
| into a dwelling.  In determining whether a product is a consumer product, | ||||
| doubtful cases shall be resolved in favor of coverage.  For a particular | ||||
| product received by a particular user, "normally used" refers to a | ||||
| typical or common use of that class of product, regardless of the status | ||||
| of the particular user or of the way in which the particular user | ||||
| actually uses, or expects or is expected to use, the product.  A product | ||||
| is a consumer product regardless of whether the product has substantial | ||||
| commercial, industrial or non-consumer uses, unless such uses represent | ||||
| the only significant mode of use of the product. | ||||
|  | ||||
|   "Installation Information" for a User Product means any methods, | ||||
| procedures, authorization keys, or other information required to install | ||||
| and execute modified versions of a covered work in that User Product from | ||||
| a modified version of its Corresponding Source.  The information must | ||||
| suffice to ensure that the continued functioning of the modified object | ||||
| code is in no case prevented or interfered with solely because | ||||
| modification has been made. | ||||
|  | ||||
|   If you convey an object code work under this section in, or with, or | ||||
| specifically for use in, a User Product, and the conveying occurs as | ||||
| part of a transaction in which the right of possession and use of the | ||||
| User Product is transferred to the recipient in perpetuity or for a | ||||
| fixed term (regardless of how the transaction is characterized), the | ||||
| Corresponding Source conveyed under this section must be accompanied | ||||
| by the Installation Information.  But this requirement does not apply | ||||
| if neither you nor any third party retains the ability to install | ||||
| modified object code on the User Product (for example, the work has | ||||
| been installed in ROM). | ||||
|  | ||||
|   The requirement to provide Installation Information does not include a | ||||
| requirement to continue to provide support service, warranty, or updates | ||||
| for a work that has been modified or installed by the recipient, or for | ||||
| the User Product in which it has been modified or installed.  Access to a | ||||
| network may be denied when the modification itself materially and | ||||
| adversely affects the operation of the network or violates the rules and | ||||
| protocols for communication across the network. | ||||
|  | ||||
|   Corresponding Source conveyed, and Installation Information provided, | ||||
| in accord with this section must be in a format that is publicly | ||||
| documented (and with an implementation available to the public in | ||||
| source code form), and must require no special password or key for | ||||
| unpacking, reading or copying. | ||||
|  | ||||
|   7. Additional Terms. | ||||
|  | ||||
|   "Additional permissions" are terms that supplement the terms of this | ||||
| License by making exceptions from one or more of its conditions. | ||||
| Additional permissions that are applicable to the entire Program shall | ||||
| be treated as though they were included in this License, to the extent | ||||
| that they are valid under applicable law.  If additional permissions | ||||
| apply only to part of the Program, that part may be used separately | ||||
| under those permissions, but the entire Program remains governed by | ||||
| this License without regard to the additional permissions. | ||||
|  | ||||
|   When you convey a copy of a covered work, you may at your option | ||||
| remove any additional permissions from that copy, or from any part of | ||||
| it.  (Additional permissions may be written to require their own | ||||
| removal in certain cases when you modify the work.)  You may place | ||||
| additional permissions on material, added by you to a covered work, | ||||
| for which you have or can give appropriate copyright permission. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, for material you | ||||
| add to a covered work, you may (if authorized by the copyright holders of | ||||
| that material) supplement the terms of this License with terms: | ||||
|  | ||||
|     a) Disclaiming warranty or limiting liability differently from the | ||||
|     terms of sections 15 and 16 of this License; or | ||||
|  | ||||
|     b) Requiring preservation of specified reasonable legal notices or | ||||
|     author attributions in that material or in the Appropriate Legal | ||||
|     Notices displayed by works containing it; or | ||||
|  | ||||
|     c) Prohibiting misrepresentation of the origin of that material, or | ||||
|     requiring that modified versions of such material be marked in | ||||
|     reasonable ways as different from the original version; or | ||||
|  | ||||
|     d) Limiting the use for publicity purposes of names of licensors or | ||||
|     authors of the material; or | ||||
|  | ||||
|     e) Declining to grant rights under trademark law for use of some | ||||
|     trade names, trademarks, or service marks; or | ||||
|  | ||||
|     f) Requiring indemnification of licensors and authors of that | ||||
|     material by anyone who conveys the material (or modified versions of | ||||
|     it) with contractual assumptions of liability to the recipient, for | ||||
|     any liability that these contractual assumptions directly impose on | ||||
|     those licensors and authors. | ||||
|  | ||||
|   All other non-permissive additional terms are considered "further | ||||
| restrictions" within the meaning of section 10.  If the Program as you | ||||
| received it, or any part of it, contains a notice stating that it is | ||||
| governed by this License along with a term that is a further | ||||
| restriction, you may remove that term.  If a license document contains | ||||
| a further restriction but permits relicensing or conveying under this | ||||
| License, you may add to a covered work material governed by the terms | ||||
| of that license document, provided that the further restriction does | ||||
| not survive such relicensing or conveying. | ||||
|  | ||||
|   If you add terms to a covered work in accord with this section, you | ||||
| must place, in the relevant source files, a statement of the | ||||
| additional terms that apply to those files, or a notice indicating | ||||
| where to find the applicable terms. | ||||
|  | ||||
|   Additional terms, permissive or non-permissive, may be stated in the | ||||
| form of a separately written license, or stated as exceptions; | ||||
| the above requirements apply either way. | ||||
|  | ||||
|   8. Termination. | ||||
|  | ||||
|   You may not propagate or modify a covered work except as expressly | ||||
| provided under this License.  Any attempt otherwise to propagate or | ||||
| modify it is void, and will automatically terminate your rights under | ||||
| this License (including any patent licenses granted under the third | ||||
| paragraph of section 11). | ||||
|  | ||||
|   However, if you cease all violation of this License, then your | ||||
| license from a particular copyright holder is reinstated (a) | ||||
| provisionally, unless and until the copyright holder explicitly and | ||||
| finally terminates your license, and (b) permanently, if the copyright | ||||
| holder fails to notify you of the violation by some reasonable means | ||||
| prior to 60 days after the cessation. | ||||
|  | ||||
|   Moreover, your license from a particular copyright holder is | ||||
| reinstated permanently if the copyright holder notifies you of the | ||||
| violation by some reasonable means, this is the first time you have | ||||
| received notice of violation of this License (for any work) from that | ||||
| copyright holder, and you cure the violation prior to 30 days after | ||||
| your receipt of the notice. | ||||
|  | ||||
|   Termination of your rights under this section does not terminate the | ||||
| licenses of parties who have received copies or rights from you under | ||||
| this License.  If your rights have been terminated and not permanently | ||||
| reinstated, you do not qualify to receive new licenses for the same | ||||
| material under section 10. | ||||
|  | ||||
|   9. Acceptance Not Required for Having Copies. | ||||
|  | ||||
|   You are not required to accept this License in order to receive or | ||||
| run a copy of the Program.  Ancillary propagation of a covered work | ||||
| occurring solely as a consequence of using peer-to-peer transmission | ||||
| to receive a copy likewise does not require acceptance.  However, | ||||
| nothing other than this License grants you permission to propagate or | ||||
| modify any covered work.  These actions infringe copyright if you do | ||||
| not accept this License.  Therefore, by modifying or propagating a | ||||
| covered work, you indicate your acceptance of this License to do so. | ||||
|  | ||||
|   10. Automatic Licensing of Downstream Recipients. | ||||
|  | ||||
|   Each time you convey a covered work, the recipient automatically | ||||
| receives a license from the original licensors, to run, modify and | ||||
| propagate that work, subject to this License.  You are not responsible | ||||
| for enforcing compliance by third parties with this License. | ||||
|  | ||||
|   An "entity transaction" is a transaction transferring control of an | ||||
| organization, or substantially all assets of one, or subdividing an | ||||
| organization, or merging organizations.  If propagation of a covered | ||||
| work results from an entity transaction, each party to that | ||||
| transaction who receives a copy of the work also receives whatever | ||||
| licenses to the work the party's predecessor in interest had or could | ||||
| give under the previous paragraph, plus a right to possession of the | ||||
| Corresponding Source of the work from the predecessor in interest, if | ||||
| the predecessor has it or can get it with reasonable efforts. | ||||
|  | ||||
|   You may not impose any further restrictions on the exercise of the | ||||
| rights granted or affirmed under this License.  For example, you may | ||||
| not impose a license fee, royalty, or other charge for exercise of | ||||
| rights granted under this License, and you may not initiate litigation | ||||
| (including a cross-claim or counterclaim in a lawsuit) alleging that | ||||
| any patent claim is infringed by making, using, selling, offering for | ||||
| sale, or importing the Program or any portion of it. | ||||
|  | ||||
|   11. Patents. | ||||
|  | ||||
|   A "contributor" is a copyright holder who authorizes use under this | ||||
| License of the Program or a work on which the Program is based.  The | ||||
| work thus licensed is called the contributor's "contributor version". | ||||
|  | ||||
|   A contributor's "essential patent claims" are all patent claims | ||||
| owned or controlled by the contributor, whether already acquired or | ||||
| hereafter acquired, that would be infringed by some manner, permitted | ||||
| by this License, of making, using, or selling its contributor version, | ||||
| but do not include claims that would be infringed only as a | ||||
| consequence of further modification of the contributor version.  For | ||||
| purposes of this definition, "control" includes the right to grant | ||||
| patent sublicenses in a manner consistent with the requirements of | ||||
| this License. | ||||
|  | ||||
|   Each contributor grants you a non-exclusive, worldwide, royalty-free | ||||
| patent license under the contributor's essential patent claims, to | ||||
| make, use, sell, offer for sale, import and otherwise run, modify and | ||||
| propagate the contents of its contributor version. | ||||
|  | ||||
|   In the following three paragraphs, a "patent license" is any express | ||||
| agreement or commitment, however denominated, not to enforce a patent | ||||
| (such as an express permission to practice a patent or covenant not to | ||||
| sue for patent infringement).  To "grant" such a patent license to a | ||||
| party means to make such an agreement or commitment not to enforce a | ||||
| patent against the party. | ||||
|  | ||||
|   If you convey a covered work, knowingly relying on a patent license, | ||||
| and the Corresponding Source of the work is not available for anyone | ||||
| to copy, free of charge and under the terms of this License, through a | ||||
| publicly available network server or other readily accessible means, | ||||
| then you must either (1) cause the Corresponding Source to be so | ||||
| available, or (2) arrange to deprive yourself of the benefit of the | ||||
| patent license for this particular work, or (3) arrange, in a manner | ||||
| consistent with the requirements of this License, to extend the patent | ||||
| license to downstream recipients.  "Knowingly relying" means you have | ||||
| actual knowledge that, but for the patent license, your conveying the | ||||
| covered work in a country, or your recipient's use of the covered work | ||||
| in a country, would infringe one or more identifiable patents in that | ||||
| country that you have reason to believe are valid. | ||||
|  | ||||
|   If, pursuant to or in connection with a single transaction or | ||||
| arrangement, you convey, or propagate by procuring conveyance of, a | ||||
| covered work, and grant a patent license to some of the parties | ||||
| receiving the covered work authorizing them to use, propagate, modify | ||||
| or convey a specific copy of the covered work, then the patent license | ||||
| you grant is automatically extended to all recipients of the covered | ||||
| work and works based on it. | ||||
|  | ||||
|   A patent license is "discriminatory" if it does not include within | ||||
| the scope of its coverage, prohibits the exercise of, or is | ||||
| conditioned on the non-exercise of one or more of the rights that are | ||||
| specifically granted under this License.  You may not convey a covered | ||||
| work if you are a party to an arrangement with a third party that is | ||||
| in the business of distributing software, under which you make payment | ||||
| to the third party based on the extent of your activity of conveying | ||||
| the work, and under which the third party grants, to any of the | ||||
| parties who would receive the covered work from you, a discriminatory | ||||
| patent license (a) in connection with copies of the covered work | ||||
| conveyed by you (or copies made from those copies), or (b) primarily | ||||
| for and in connection with specific products or compilations that | ||||
| contain the covered work, unless you entered into that arrangement, | ||||
| or that patent license was granted, prior to 28 March 2007. | ||||
|  | ||||
|   Nothing in this License shall be construed as excluding or limiting | ||||
| any implied license or other defenses to infringement that may | ||||
| otherwise be available to you under applicable patent law. | ||||
|  | ||||
|   12. No Surrender of Others' Freedom. | ||||
|  | ||||
|   If conditions are imposed on you (whether by court order, agreement or | ||||
| otherwise) that contradict the conditions of this License, they do not | ||||
| excuse you from the conditions of this License.  If you cannot convey a | ||||
| covered work so as to satisfy simultaneously your obligations under this | ||||
| License and any other pertinent obligations, then as a consequence you may | ||||
| not convey it at all.  For example, if you agree to terms that obligate you | ||||
| to collect a royalty for further conveying from those to whom you convey | ||||
| the Program, the only way you could satisfy both those terms and this | ||||
| License would be to refrain entirely from conveying the Program. | ||||
|  | ||||
|   13. Remote Network Interaction; Use with the GNU General Public License. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, if you modify the | ||||
| Program, your modified version must prominently offer all users | ||||
| interacting with it remotely through a computer network (if your version | ||||
| supports such interaction) an opportunity to receive the Corresponding | ||||
| Source of your version by providing access to the Corresponding Source | ||||
| from a network server at no charge, through some standard or customary | ||||
| means of facilitating copying of software.  This Corresponding Source | ||||
| shall include the Corresponding Source for any work covered by version 3 | ||||
| of the GNU General Public License that is incorporated pursuant to the | ||||
| following paragraph. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, you have | ||||
| permission to link or combine any covered work with a work licensed | ||||
| under version 3 of the GNU General Public License into a single | ||||
| combined work, and to convey the resulting work.  The terms of this | ||||
| License will continue to apply to the part which is the covered work, | ||||
| but the work with which it is combined will remain governed by version | ||||
| 3 of the GNU General Public License. | ||||
|  | ||||
|   14. Revised Versions of this License. | ||||
|  | ||||
|   The Free Software Foundation may publish revised and/or new versions of | ||||
| the GNU Affero General Public License from time to time.  Such new versions | ||||
| will be similar in spirit to the present version, but may differ in detail to | ||||
| address new problems or concerns. | ||||
|  | ||||
|   Each version is given a distinguishing version number.  If the | ||||
| Program specifies that a certain numbered version of the GNU Affero General | ||||
| Public License "or any later version" applies to it, you have the | ||||
| option of following the terms and conditions either of that numbered | ||||
| version or of any later version published by the Free Software | ||||
| Foundation.  If the Program does not specify a version number of the | ||||
| GNU Affero General Public License, you may choose any version ever published | ||||
| by the Free Software Foundation. | ||||
|  | ||||
|   If the Program specifies that a proxy can decide which future | ||||
| versions of the GNU Affero General Public License can be used, that proxy's | ||||
| public statement of acceptance of a version permanently authorizes you | ||||
| to choose that version for the Program. | ||||
|  | ||||
|   Later license versions may give you additional or different | ||||
| permissions.  However, no additional obligations are imposed on any | ||||
| author or copyright holder as a result of your choosing to follow a | ||||
| later version. | ||||
|  | ||||
|   15. Disclaimer of Warranty. | ||||
|  | ||||
|   THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY | ||||
| APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT | ||||
| HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY | ||||
| OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, | ||||
| THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||||
| PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM | ||||
| IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF | ||||
| ALL NECESSARY SERVICING, REPAIR OR CORRECTION. | ||||
|  | ||||
|   16. Limitation of Liability. | ||||
|  | ||||
|   IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS | ||||
| THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY | ||||
| GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE | ||||
| USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF | ||||
| DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD | ||||
| PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), | ||||
| EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF | ||||
| SUCH DAMAGES. | ||||
|  | ||||
|   17. Interpretation of Sections 15 and 16. | ||||
|  | ||||
|   If the disclaimer of warranty and limitation of liability provided | ||||
| above cannot be given local legal effect according to their terms, | ||||
| reviewing courts shall apply local law that most closely approximates | ||||
| an absolute waiver of all civil liability in connection with the | ||||
| Program, unless a warranty or assumption of liability accompanies a | ||||
| copy of the Program in return for a fee. | ||||
|  | ||||
|                      END OF TERMS AND CONDITIONS | ||||
|  | ||||
|             How to Apply These Terms to Your New Programs | ||||
|  | ||||
|   If you develop a new program, and you want it to be of the greatest | ||||
| possible use to the public, the best way to achieve this is to make it | ||||
| free software which everyone can redistribute and change under these terms. | ||||
|  | ||||
|   To do so, attach the following notices to the program.  It is safest | ||||
| to attach them to the start of each source file to most effectively | ||||
| state the exclusion of warranty; and each file should have at least | ||||
| the "copyright" line and a pointer to where the full notice is found. | ||||
|  | ||||
|     <one line to give the program's name and a brief idea of what it does.> | ||||
|     Copyright (C) <year>  <name of author> | ||||
|  | ||||
|     This program is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU Affero General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
|  | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU Affero General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU Affero General Public License | ||||
|     along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  | ||||
| Also add information on how to contact you by electronic and paper mail. | ||||
|  | ||||
|   If your software can interact with users remotely through a computer | ||||
| network, you should also make sure that it provides a way for users to | ||||
| get its source.  For example, if your program is a web application, its | ||||
| interface could display a "Source" link that leads users to an archive | ||||
| of the code.  There are many ways you could offer source, and different | ||||
| solutions will be better for different programs; see section 13 for the | ||||
| specific requirements. | ||||
|  | ||||
|   You should also get your employer (if you work as a programmer) or school, | ||||
| if any, to sign a "copyright disclaimer" for the program, if necessary. | ||||
| For more information on this, and how to apply and follow the GNU AGPL, see | ||||
| <http://www.gnu.org/licenses/>. | ||||
							
								
								
									
										84
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/dce.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/dce.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| // Copyright 2011 Google Inc.  All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| package uuid | ||||
|  | ||||
| import ( | ||||
| 	"encoding/binary" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| ) | ||||
|  | ||||
| // A Domain represents a Version 2 domain | ||||
| type Domain byte | ||||
|  | ||||
| // Domain constants for DCE Security (Version 2) UUIDs. | ||||
| const ( | ||||
| 	Person = Domain(0) | ||||
| 	Group  = Domain(1) | ||||
| 	Org    = Domain(2) | ||||
| ) | ||||
|  | ||||
| // NewDCESecurity returns a DCE Security (Version 2) UUID. | ||||
| // | ||||
| // The domain should be one of Person, Group or Org. | ||||
| // On a POSIX system the id should be the users UID for the Person | ||||
| // domain and the users GID for the Group.  The meaning of id for | ||||
| // the domain Org or on non-POSIX systems is site defined. | ||||
| // | ||||
| // For a given domain/id pair the same token may be returned for up to | ||||
| // 7 minutes and 10 seconds. | ||||
| func NewDCESecurity(domain Domain, id uint32) UUID { | ||||
| 	uuid := NewUUID() | ||||
| 	if uuid != nil { | ||||
| 		uuid[6] = (uuid[6] & 0x0f) | 0x20 // Version 2 | ||||
| 		uuid[9] = byte(domain) | ||||
| 		binary.BigEndian.PutUint32(uuid[0:], id) | ||||
| 	} | ||||
| 	return uuid | ||||
| } | ||||
|  | ||||
| // NewDCEPerson returns a DCE Security (Version 2) UUID in the person | ||||
| // domain with the id returned by os.Getuid. | ||||
| // | ||||
| //  NewDCEPerson(Person, uint32(os.Getuid())) | ||||
| func NewDCEPerson() UUID { | ||||
| 	return NewDCESecurity(Person, uint32(os.Getuid())) | ||||
| } | ||||
|  | ||||
| // NewDCEGroup returns a DCE Security (Version 2) UUID in the group | ||||
| // domain with the id returned by os.Getgid. | ||||
| // | ||||
| //  NewDCEGroup(Group, uint32(os.Getgid())) | ||||
| func NewDCEGroup() UUID { | ||||
| 	return NewDCESecurity(Group, uint32(os.Getgid())) | ||||
| } | ||||
|  | ||||
| // Domain returns the domain for a Version 2 UUID or false. | ||||
| func (uuid UUID) Domain() (Domain, bool) { | ||||
| 	if v, _ := uuid.Version(); v != 2 { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	return Domain(uuid[9]), true | ||||
| } | ||||
|  | ||||
| // Id returns the id for a Version 2 UUID or false. | ||||
| func (uuid UUID) Id() (uint32, bool) { | ||||
| 	if v, _ := uuid.Version(); v != 2 { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	return binary.BigEndian.Uint32(uuid[0:4]), true | ||||
| } | ||||
|  | ||||
| func (d Domain) String() string { | ||||
| 	switch d { | ||||
| 	case Person: | ||||
| 		return "Person" | ||||
| 	case Group: | ||||
| 		return "Group" | ||||
| 	case Org: | ||||
| 		return "Org" | ||||
| 	} | ||||
| 	return fmt.Sprintf("Domain%d", int(d)) | ||||
| } | ||||
							
								
								
									
										8
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/doc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| // Copyright 2011 Google Inc.  All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| // The uuid package generates and inspects UUIDs. | ||||
| // | ||||
| // UUIDs are based on RFC 4122 and DCE 1.1: Authentication and Security Services. | ||||
| package uuid | ||||
							
								
								
									
										53
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/hash.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/hash.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| // Copyright 2011 Google Inc.  All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| package uuid | ||||
|  | ||||
| import ( | ||||
| 	"crypto/md5" | ||||
| 	"crypto/sha1" | ||||
| 	"hash" | ||||
| ) | ||||
|  | ||||
| // Well known Name Space IDs and UUIDs | ||||
| var ( | ||||
| 	NameSpace_DNS  = Parse("6ba7b810-9dad-11d1-80b4-00c04fd430c8") | ||||
| 	NameSpace_URL  = Parse("6ba7b811-9dad-11d1-80b4-00c04fd430c8") | ||||
| 	NameSpace_OID  = Parse("6ba7b812-9dad-11d1-80b4-00c04fd430c8") | ||||
| 	NameSpace_X500 = Parse("6ba7b814-9dad-11d1-80b4-00c04fd430c8") | ||||
| 	NIL            = Parse("00000000-0000-0000-0000-000000000000") | ||||
| ) | ||||
|  | ||||
| // NewHash returns a new UUID derived from the hash of space concatenated with | ||||
| // data generated by h.  The hash should be at least 16 byte in length.  The | ||||
| // first 16 bytes of the hash are used to form the UUID.  The version of the | ||||
| // UUID will be the lower 4 bits of version.  NewHash is used to implement | ||||
| // NewMD5 and NewSHA1. | ||||
| func NewHash(h hash.Hash, space UUID, data []byte, version int) UUID { | ||||
| 	h.Reset() | ||||
| 	h.Write(space) | ||||
| 	h.Write([]byte(data)) | ||||
| 	s := h.Sum(nil) | ||||
| 	uuid := make([]byte, 16) | ||||
| 	copy(uuid, s) | ||||
| 	uuid[6] = (uuid[6] & 0x0f) | uint8((version&0xf)<<4) | ||||
| 	uuid[8] = (uuid[8] & 0x3f) | 0x80 // RFC 4122 variant | ||||
| 	return uuid | ||||
| } | ||||
|  | ||||
| // NewMD5 returns a new MD5 (Version 3) UUID based on the | ||||
| // supplied name space and data. | ||||
| // | ||||
| //  NewHash(md5.New(), space, data, 3) | ||||
| func NewMD5(space UUID, data []byte) UUID { | ||||
| 	return NewHash(md5.New(), space, data, 3) | ||||
| } | ||||
|  | ||||
| // NewSHA1 returns a new SHA1 (Version 5) UUID based on the | ||||
| // supplied name space and data. | ||||
| // | ||||
| //  NewHash(sha1.New(), space, data, 5) | ||||
| func NewSHA1(space UUID, data []byte) UUID { | ||||
| 	return NewHash(sha1.New(), space, data, 5) | ||||
| } | ||||
							
								
								
									
										34
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/json.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/json.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| // Copyright 2014 Google Inc.  All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| package uuid | ||||
|  | ||||
| import "errors" | ||||
|  | ||||
| func (u UUID) MarshalJSON() ([]byte, error) { | ||||
| 	if len(u) != 16 { | ||||
| 		return []byte(`""`), nil | ||||
| 	} | ||||
| 	var js [38]byte | ||||
| 	js[0] = '"' | ||||
| 	encodeHex(js[1:], u) | ||||
| 	js[37] = '"' | ||||
| 	return js[:], nil | ||||
| } | ||||
|  | ||||
| func (u *UUID) UnmarshalJSON(data []byte) error { | ||||
| 	if string(data) == `""` { | ||||
| 		return nil | ||||
| 	} | ||||
| 	if data[0] != '"' { | ||||
| 		return errors.New("invalid UUID format") | ||||
| 	} | ||||
| 	data = data[1 : len(data)-1] | ||||
| 	uu := Parse(string(data)) | ||||
| 	if uu == nil { | ||||
| 		return errors.New("invalid UUID format") | ||||
| 	} | ||||
| 	*u = uu | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										117
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/node.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/node.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,117 @@ | ||||
| // Copyright 2011 Google Inc.  All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| package uuid | ||||
|  | ||||
| import ( | ||||
| 	"net" | ||||
| 	"sync" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	nodeMu     sync.Mutex | ||||
| 	interfaces []net.Interface // cached list of interfaces | ||||
| 	ifname     string          // name of interface being used | ||||
| 	nodeID     []byte          // hardware for version 1 UUIDs | ||||
| ) | ||||
|  | ||||
| // NodeInterface returns the name of the interface from which the NodeID was | ||||
| // derived.  The interface "user" is returned if the NodeID was set by | ||||
| // SetNodeID. | ||||
| func NodeInterface() string { | ||||
| 	defer nodeMu.Unlock() | ||||
| 	nodeMu.Lock() | ||||
| 	return ifname | ||||
| } | ||||
|  | ||||
| // SetNodeInterface selects the hardware address to be used for Version 1 UUIDs. | ||||
| // If name is "" then the first usable interface found will be used or a random | ||||
| // Node ID will be generated.  If a named interface cannot be found then false | ||||
| // is returned. | ||||
| // | ||||
| // SetNodeInterface never fails when name is "". | ||||
| func SetNodeInterface(name string) bool { | ||||
| 	defer nodeMu.Unlock() | ||||
| 	nodeMu.Lock() | ||||
| 	return setNodeInterface(name) | ||||
| } | ||||
|  | ||||
| func setNodeInterface(name string) bool { | ||||
| 	if interfaces == nil { | ||||
| 		var err error | ||||
| 		interfaces, err = net.Interfaces() | ||||
| 		if err != nil && name != "" { | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	for _, ifs := range interfaces { | ||||
| 		if len(ifs.HardwareAddr) >= 6 && (name == "" || name == ifs.Name) { | ||||
| 			if setNodeID(ifs.HardwareAddr) { | ||||
| 				ifname = ifs.Name | ||||
| 				return true | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// We found no interfaces with a valid hardware address.  If name | ||||
| 	// does not specify a specific interface generate a random Node ID | ||||
| 	// (section 4.1.6) | ||||
| 	if name == "" { | ||||
| 		if nodeID == nil { | ||||
| 			nodeID = make([]byte, 6) | ||||
| 		} | ||||
| 		randomBits(nodeID) | ||||
| 		return true | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // NodeID returns a slice of a copy of the current Node ID, setting the Node ID | ||||
| // if not already set. | ||||
| func NodeID() []byte { | ||||
| 	defer nodeMu.Unlock() | ||||
| 	nodeMu.Lock() | ||||
| 	if nodeID == nil { | ||||
| 		setNodeInterface("") | ||||
| 	} | ||||
| 	nid := make([]byte, 6) | ||||
| 	copy(nid, nodeID) | ||||
| 	return nid | ||||
| } | ||||
|  | ||||
| // SetNodeID sets the Node ID to be used for Version 1 UUIDs.  The first 6 bytes | ||||
| // of id are used.  If id is less than 6 bytes then false is returned and the | ||||
| // Node ID is not set. | ||||
| func SetNodeID(id []byte) bool { | ||||
| 	defer nodeMu.Unlock() | ||||
| 	nodeMu.Lock() | ||||
| 	if setNodeID(id) { | ||||
| 		ifname = "user" | ||||
| 		return true | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func setNodeID(id []byte) bool { | ||||
| 	if len(id) < 6 { | ||||
| 		return false | ||||
| 	} | ||||
| 	if nodeID == nil { | ||||
| 		nodeID = make([]byte, 6) | ||||
| 	} | ||||
| 	copy(nodeID, id) | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| // NodeID returns the 6 byte node id encoded in uuid.  It returns nil if uuid is | ||||
| // not valid.  The NodeID is only well defined for version 1 and 2 UUIDs. | ||||
| func (uuid UUID) NodeID() []byte { | ||||
| 	if len(uuid) != 16 { | ||||
| 		return nil | ||||
| 	} | ||||
| 	node := make([]byte, 6) | ||||
| 	copy(node, uuid[10:]) | ||||
| 	return node | ||||
| } | ||||
							
								
								
									
										58
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/sql.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/sql.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| // Copyright 2015 Google Inc.  All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| package uuid | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| ) | ||||
|  | ||||
| // Scan implements sql.Scanner so UUIDs can be read from databases transparently | ||||
| // Currently, database types that map to string and []byte are supported. Please | ||||
| // consult database-specific driver documentation for matching types. | ||||
| func (uuid *UUID) Scan(src interface{}) error { | ||||
| 	switch src.(type) { | ||||
| 	case string: | ||||
| 		// if an empty UUID comes from a table, we return a null UUID | ||||
| 		if src.(string) == "" { | ||||
| 			return nil | ||||
| 		} | ||||
|  | ||||
| 		// see uuid.Parse for required string format | ||||
| 		parsed := Parse(src.(string)) | ||||
|  | ||||
| 		if parsed == nil { | ||||
| 			return errors.New("Scan: invalid UUID format") | ||||
| 		} | ||||
|  | ||||
| 		*uuid = parsed | ||||
| 	case []byte: | ||||
| 		b := src.([]byte) | ||||
|  | ||||
| 		// if an empty UUID comes from a table, we return a null UUID | ||||
| 		if len(b) == 0 { | ||||
| 			return nil | ||||
| 		} | ||||
|  | ||||
| 		// assumes a simple slice of bytes if 16 bytes | ||||
| 		// otherwise attempts to parse | ||||
| 		if len(b) == 16 { | ||||
| 			*uuid = UUID(b) | ||||
| 		} else { | ||||
| 			u := Parse(string(b)) | ||||
|  | ||||
| 			if u == nil { | ||||
| 				return errors.New("Scan: invalid UUID format") | ||||
| 			} | ||||
|  | ||||
| 			*uuid = u | ||||
| 		} | ||||
|  | ||||
| 	default: | ||||
| 		return fmt.Errorf("Scan: unable to scan type %T into UUID", src) | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										132
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/time.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/time.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,132 @@ | ||||
| // Copyright 2014 Google Inc.  All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| package uuid | ||||
|  | ||||
| import ( | ||||
| 	"encoding/binary" | ||||
| 	"sync" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| // A Time represents a time as the number of 100's of nanoseconds since 15 Oct | ||||
| // 1582. | ||||
| type Time int64 | ||||
|  | ||||
| const ( | ||||
| 	lillian    = 2299160          // Julian day of 15 Oct 1582 | ||||
| 	unix       = 2440587          // Julian day of 1 Jan 1970 | ||||
| 	epoch      = unix - lillian   // Days between epochs | ||||
| 	g1582      = epoch * 86400    // seconds between epochs | ||||
| 	g1582ns100 = g1582 * 10000000 // 100s of a nanoseconds between epochs | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	timeMu    sync.Mutex | ||||
| 	lasttime  uint64 // last time we returned | ||||
| 	clock_seq uint16 // clock sequence for this run | ||||
|  | ||||
| 	timeNow = time.Now // for testing | ||||
| ) | ||||
|  | ||||
| // UnixTime converts t the number of seconds and nanoseconds using the Unix | ||||
| // epoch of 1 Jan 1970. | ||||
| func (t Time) UnixTime() (sec, nsec int64) { | ||||
| 	sec = int64(t - g1582ns100) | ||||
| 	nsec = (sec % 10000000) * 100 | ||||
| 	sec /= 10000000 | ||||
| 	return sec, nsec | ||||
| } | ||||
|  | ||||
| // GetTime returns the current Time (100s of nanoseconds since 15 Oct 1582) and | ||||
| // clock sequence as well as adjusting the clock sequence as needed.  An error | ||||
| // is returned if the current time cannot be determined. | ||||
| func GetTime() (Time, uint16, error) { | ||||
| 	defer timeMu.Unlock() | ||||
| 	timeMu.Lock() | ||||
| 	return getTime() | ||||
| } | ||||
|  | ||||
| func getTime() (Time, uint16, error) { | ||||
| 	t := timeNow() | ||||
|  | ||||
| 	// If we don't have a clock sequence already, set one. | ||||
| 	if clock_seq == 0 { | ||||
| 		setClockSequence(-1) | ||||
| 	} | ||||
| 	now := uint64(t.UnixNano()/100) + g1582ns100 | ||||
|  | ||||
| 	// If time has gone backwards with this clock sequence then we | ||||
| 	// increment the clock sequence | ||||
| 	if now <= lasttime { | ||||
| 		clock_seq = ((clock_seq + 1) & 0x3fff) | 0x8000 | ||||
| 	} | ||||
| 	lasttime = now | ||||
| 	return Time(now), clock_seq, nil | ||||
| } | ||||
|  | ||||
| // ClockSequence returns the current clock sequence, generating one if not | ||||
| // already set.  The clock sequence is only used for Version 1 UUIDs. | ||||
| // | ||||
| // The uuid package does not use global static storage for the clock sequence or | ||||
| // the last time a UUID was generated.  Unless SetClockSequence a new random | ||||
| // clock sequence is generated the first time a clock sequence is requested by | ||||
| // ClockSequence, GetTime, or NewUUID.  (section 4.2.1.1) sequence is generated | ||||
| // for | ||||
| func ClockSequence() int { | ||||
| 	defer timeMu.Unlock() | ||||
| 	timeMu.Lock() | ||||
| 	return clockSequence() | ||||
| } | ||||
|  | ||||
| func clockSequence() int { | ||||
| 	if clock_seq == 0 { | ||||
| 		setClockSequence(-1) | ||||
| 	} | ||||
| 	return int(clock_seq & 0x3fff) | ||||
| } | ||||
|  | ||||
| // SetClockSeq sets the clock sequence to the lower 14 bits of seq.  Setting to | ||||
| // -1 causes a new sequence to be generated. | ||||
| func SetClockSequence(seq int) { | ||||
| 	defer timeMu.Unlock() | ||||
| 	timeMu.Lock() | ||||
| 	setClockSequence(seq) | ||||
| } | ||||
|  | ||||
| func setClockSequence(seq int) { | ||||
| 	if seq == -1 { | ||||
| 		var b [2]byte | ||||
| 		randomBits(b[:]) // clock sequence | ||||
| 		seq = int(b[0])<<8 | int(b[1]) | ||||
| 	} | ||||
| 	old_seq := clock_seq | ||||
| 	clock_seq = uint16(seq&0x3fff) | 0x8000 // Set our variant | ||||
| 	if old_seq != clock_seq { | ||||
| 		lasttime = 0 | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Time returns the time in 100s of nanoseconds since 15 Oct 1582 encoded in | ||||
| // uuid.  It returns false if uuid is not valid.  The time is only well defined | ||||
| // for version 1 and 2 UUIDs. | ||||
| func (uuid UUID) Time() (Time, bool) { | ||||
| 	if len(uuid) != 16 { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	time := int64(binary.BigEndian.Uint32(uuid[0:4])) | ||||
| 	time |= int64(binary.BigEndian.Uint16(uuid[4:6])) << 32 | ||||
| 	time |= int64(binary.BigEndian.Uint16(uuid[6:8])&0xfff) << 48 | ||||
| 	return Time(time), true | ||||
| } | ||||
|  | ||||
| // ClockSequence returns the clock sequence encoded in uuid.  It returns false | ||||
| // if uuid is not valid.  The clock sequence is only well defined for version 1 | ||||
| // and 2 UUIDs. | ||||
| func (uuid UUID) ClockSequence() (int, bool) { | ||||
| 	if len(uuid) != 16 { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	return int(binary.BigEndian.Uint16(uuid[8:10])) & 0x3fff, true | ||||
| } | ||||
							
								
								
									
										43
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/util.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/util.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| // Copyright 2011 Google Inc.  All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| package uuid | ||||
|  | ||||
| import ( | ||||
| 	"io" | ||||
| ) | ||||
|  | ||||
| // randomBits completely fills slice b with random data. | ||||
| func randomBits(b []byte) { | ||||
| 	if _, err := io.ReadFull(rander, b); err != nil { | ||||
| 		panic(err.Error()) // rand should never fail | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // xvalues returns the value of a byte as a hexadecimal digit or 255. | ||||
| var xvalues = [256]byte{ | ||||
| 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||
| 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||
| 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||
| 	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 255, 255, 255, 255, 255, 255, | ||||
| 	255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||
| 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||
| 	255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||
| 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||
| 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||
| 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||
| 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||
| 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||
| 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||
| 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||
| 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||
| 	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, | ||||
| } | ||||
|  | ||||
| // xtob converts the the first two hex bytes of x into a byte. | ||||
| func xtob(x string) (byte, bool) { | ||||
| 	b1 := xvalues[x[0]] | ||||
| 	b2 := xvalues[x[1]] | ||||
| 	return (b1 << 4) | b2, b1 != 255 && b2 != 255 | ||||
| } | ||||
							
								
								
									
										176
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/uuid.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/uuid.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,176 @@ | ||||
| // Copyright 2011 Google Inc.  All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| package uuid | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"crypto/rand" | ||||
| 	"encoding/hex" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // A UUID is a 128 bit (16 byte) Universal Unique IDentifier as defined in RFC | ||||
| // 4122. | ||||
| type UUID []byte | ||||
|  | ||||
| // A Version represents a UUIDs version. | ||||
| type Version byte | ||||
|  | ||||
| // A Variant represents a UUIDs variant. | ||||
| type Variant byte | ||||
|  | ||||
| // Constants returned by Variant. | ||||
| const ( | ||||
| 	Invalid   = Variant(iota) // Invalid UUID | ||||
| 	RFC4122                   // The variant specified in RFC4122 | ||||
| 	Reserved                  // Reserved, NCS backward compatibility. | ||||
| 	Microsoft                 // Reserved, Microsoft Corporation backward compatibility. | ||||
| 	Future                    // Reserved for future definition. | ||||
| ) | ||||
|  | ||||
| var rander = rand.Reader // random function | ||||
|  | ||||
| // New returns a new random (version 4) UUID as a string.  It is a convenience | ||||
| // function for NewRandom().String(). | ||||
| func New() string { | ||||
| 	return NewRandom().String() | ||||
| } | ||||
|  | ||||
| // Parse decodes s into a UUID or returns nil.  Both the UUID form of | ||||
| // xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and | ||||
| // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx are decoded. | ||||
| func Parse(s string) UUID { | ||||
| 	if len(s) == 36+9 { | ||||
| 		if strings.ToLower(s[:9]) != "urn:uuid:" { | ||||
| 			return nil | ||||
| 		} | ||||
| 		s = s[9:] | ||||
| 	} else if len(s) != 36 { | ||||
| 		return nil | ||||
| 	} | ||||
| 	if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' { | ||||
| 		return nil | ||||
| 	} | ||||
| 	var uuid [16]byte | ||||
| 	for i, x := range [16]int{ | ||||
| 		0, 2, 4, 6, | ||||
| 		9, 11, | ||||
| 		14, 16, | ||||
| 		19, 21, | ||||
| 		24, 26, 28, 30, 32, 34} { | ||||
| 		if v, ok := xtob(s[x:]); !ok { | ||||
| 			return nil | ||||
| 		} else { | ||||
| 			uuid[i] = v | ||||
| 		} | ||||
| 	} | ||||
| 	return uuid[:] | ||||
| } | ||||
|  | ||||
| // Equal returns true if uuid1 and uuid2 are equal. | ||||
| func Equal(uuid1, uuid2 UUID) bool { | ||||
| 	return bytes.Equal(uuid1, uuid2) | ||||
| } | ||||
|  | ||||
| // String returns the string form of uuid, xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | ||||
| // , or "" if uuid is invalid. | ||||
| func (uuid UUID) String() string { | ||||
| 	if len(uuid) != 16 { | ||||
| 		return "" | ||||
| 	} | ||||
| 	var buf [36]byte | ||||
| 	encodeHex(buf[:], uuid) | ||||
| 	return string(buf[:]) | ||||
| } | ||||
|  | ||||
| // URN returns the RFC 2141 URN form of uuid, | ||||
| // urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,  or "" if uuid is invalid. | ||||
| func (uuid UUID) URN() string { | ||||
| 	if len(uuid) != 16 { | ||||
| 		return "" | ||||
| 	} | ||||
| 	var buf [36 + 9]byte | ||||
| 	copy(buf[:], "urn:uuid:") | ||||
| 	encodeHex(buf[9:], uuid) | ||||
| 	return string(buf[:]) | ||||
| } | ||||
|  | ||||
| func encodeHex(dst []byte, uuid UUID) { | ||||
| 	hex.Encode(dst[:], uuid[:4]) | ||||
| 	dst[8] = '-' | ||||
| 	hex.Encode(dst[9:13], uuid[4:6]) | ||||
| 	dst[13] = '-' | ||||
| 	hex.Encode(dst[14:18], uuid[6:8]) | ||||
| 	dst[18] = '-' | ||||
| 	hex.Encode(dst[19:23], uuid[8:10]) | ||||
| 	dst[23] = '-' | ||||
| 	hex.Encode(dst[24:], uuid[10:]) | ||||
| } | ||||
|  | ||||
| // Variant returns the variant encoded in uuid.  It returns Invalid if | ||||
| // uuid is invalid. | ||||
| func (uuid UUID) Variant() Variant { | ||||
| 	if len(uuid) != 16 { | ||||
| 		return Invalid | ||||
| 	} | ||||
| 	switch { | ||||
| 	case (uuid[8] & 0xc0) == 0x80: | ||||
| 		return RFC4122 | ||||
| 	case (uuid[8] & 0xe0) == 0xc0: | ||||
| 		return Microsoft | ||||
| 	case (uuid[8] & 0xe0) == 0xe0: | ||||
| 		return Future | ||||
| 	default: | ||||
| 		return Reserved | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Version returns the version of uuid.  It returns false if uuid is not | ||||
| // valid. | ||||
| func (uuid UUID) Version() (Version, bool) { | ||||
| 	if len(uuid) != 16 { | ||||
| 		return 0, false | ||||
| 	} | ||||
| 	return Version(uuid[6] >> 4), true | ||||
| } | ||||
|  | ||||
| func (v Version) String() string { | ||||
| 	if v > 15 { | ||||
| 		return fmt.Sprintf("BAD_VERSION_%d", v) | ||||
| 	} | ||||
| 	return fmt.Sprintf("VERSION_%d", v) | ||||
| } | ||||
|  | ||||
| func (v Variant) String() string { | ||||
| 	switch v { | ||||
| 	case RFC4122: | ||||
| 		return "RFC4122" | ||||
| 	case Reserved: | ||||
| 		return "Reserved" | ||||
| 	case Microsoft: | ||||
| 		return "Microsoft" | ||||
| 	case Future: | ||||
| 		return "Future" | ||||
| 	case Invalid: | ||||
| 		return "Invalid" | ||||
| 	} | ||||
| 	return fmt.Sprintf("BadVariant%d", int(v)) | ||||
| } | ||||
|  | ||||
| // SetRand sets the random number generator to r, which implents io.Reader. | ||||
| // If r.Read returns an error when the package requests random data then | ||||
| // a panic will be issued. | ||||
| // | ||||
| // Calling SetRand with nil sets the random number generator to the default | ||||
| // generator. | ||||
| func SetRand(r io.Reader) { | ||||
| 	if r == nil { | ||||
| 		rander = rand.Reader | ||||
| 		return | ||||
| 	} | ||||
| 	rander = r | ||||
| } | ||||
							
								
								
									
										41
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/version1.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/version1.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| // Copyright 2011 Google Inc.  All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| package uuid | ||||
|  | ||||
| import ( | ||||
| 	"encoding/binary" | ||||
| ) | ||||
|  | ||||
| // NewUUID returns a Version 1 UUID based on the current NodeID and clock | ||||
| // sequence, and the current time.  If the NodeID has not been set by SetNodeID | ||||
| // or SetNodeInterface then it will be set automatically.  If the NodeID cannot | ||||
| // be set NewUUID returns nil.  If clock sequence has not been set by | ||||
| // SetClockSequence then it will be set automatically.  If GetTime fails to | ||||
| // return the current NewUUID returns nil. | ||||
| func NewUUID() UUID { | ||||
| 	if nodeID == nil { | ||||
| 		SetNodeInterface("") | ||||
| 	} | ||||
|  | ||||
| 	now, seq, err := GetTime() | ||||
| 	if err != nil { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	uuid := make([]byte, 16) | ||||
|  | ||||
| 	time_low := uint32(now & 0xffffffff) | ||||
| 	time_mid := uint16((now >> 32) & 0xffff) | ||||
| 	time_hi := uint16((now >> 48) & 0x0fff) | ||||
| 	time_hi |= 0x1000 // Version 1 | ||||
|  | ||||
| 	binary.BigEndian.PutUint32(uuid[0:], time_low) | ||||
| 	binary.BigEndian.PutUint16(uuid[4:], time_mid) | ||||
| 	binary.BigEndian.PutUint16(uuid[6:], time_hi) | ||||
| 	binary.BigEndian.PutUint16(uuid[8:], seq) | ||||
| 	copy(uuid[10:], nodeID) | ||||
|  | ||||
| 	return uuid | ||||
| } | ||||
							
								
								
									
										25
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/version4.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								vendor/github.com/mattermost/platform/vendor/github.com/pborman/uuid/version4.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| // Copyright 2011 Google Inc.  All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| package uuid | ||||
|  | ||||
| // Random returns a Random (Version 4) UUID or panics. | ||||
| // | ||||
| // The strength of the UUIDs is based on the strength of the crypto/rand | ||||
| // package. | ||||
| // | ||||
| // A note about uniqueness derived from from the UUID Wikipedia entry: | ||||
| // | ||||
| //  Randomly generated UUIDs have 122 random bits.  One's annual risk of being | ||||
| //  hit by a meteorite is estimated to be one chance in 17 billion, that | ||||
| //  means the probability is about 0.00000000006 (6 × 10−11), | ||||
| //  equivalent to the odds of creating a few tens of trillions of UUIDs in a | ||||
| //  year and having one duplicate. | ||||
| func NewRandom() UUID { | ||||
| 	uuid := make([]byte, 16) | ||||
| 	randomBits([]byte(uuid)) | ||||
| 	uuid[6] = (uuid[6] & 0x0f) | 0x40 // Version 4 | ||||
| 	uuid[8] = (uuid[8] & 0x3f) | 0x80 // Variant is 10 | ||||
| 	return uuid | ||||
| } | ||||
							
								
								
									
										897
									
								
								vendor/github.com/mattermost/platform/vendor/golang.org/x/crypto/bcrypt/LICENSE.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										897
									
								
								vendor/github.com/mattermost/platform/vendor/golang.org/x/crypto/bcrypt/LICENSE.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,897 @@ | ||||
| Mattermost Licensing | ||||
|  | ||||
| SOFTWARE LICENSING  | ||||
|  | ||||
| You are licensed to use compiled versions of the Mattermost platform produced by Mattermost, Inc. under an MIT LICENSE  | ||||
|  | ||||
| -	See MIT-COMPILED-LICENSE.md included in compiled versions for details | ||||
|  | ||||
| You may be licensed to use source code to create compiled versions not produced by Mattermost, Inc. in one of two ways: | ||||
|  | ||||
| 1. Under the Free Software Foundation’s GNU AGPL v.3.0, subject to the exceptions outlined in this policy; or  | ||||
| 2. Under a commercial license available from Mattermost, Inc. by contacting commercial@mattermost.com  | ||||
|  | ||||
| You are licensed to use the source code in Admin Tools and Configuration Files (templates/, config/, model/,  | ||||
| webapp/client, webapp/fonts, webapp/i18n, webapp/images and all subdirectories thereof) under the Apache License v2.0. | ||||
|  | ||||
| We promise that we will not enforce the copyleft provisions in AGPL v3.0 against you if your application (a) does not  | ||||
| link to the Mattermost Platform directly, but exclusively uses the Mattermost Admin Tools and Configuration Files, and | ||||
| (b) you have not modified, added to or adapted the source code of Mattermost in a way that results in the creation of  | ||||
| a “modified version” or “work based on” Mattermost as these terms are defined in the AGPL v3.0 license. | ||||
|  | ||||
| MATTERMOST TRADEMARK GUIDELINES | ||||
|  | ||||
| Your use of the mark Mattermost is subject to Mattermost, Inc's prior written approval and our organization’s Trademark  | ||||
| Standards of Use at http://www.mattermost.org/trademark-standards-of-use/. For trademark approval or any questions  | ||||
| you have about using these trademarks, please email trademark@mattermost.com  | ||||
|  | ||||
| ------------------------------------------------------------------------------------------------------------------------------ | ||||
|                                 | ||||
|                                Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "[]" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright [yyyy] [name of copyright owner] | ||||
|  | ||||
|    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. | ||||
|  | ||||
| ------------------------------------------------------------------------------ | ||||
|  | ||||
| The software is released under the terms of the GNU Affero General Public | ||||
| License, version 3. | ||||
|  | ||||
|                     GNU AFFERO GENERAL PUBLIC LICENSE | ||||
|                        Version 3, 19 November 2007 | ||||
|  | ||||
|  Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | ||||
|  Everyone is permitted to copy and distribute verbatim copies | ||||
|  of this license document, but changing it is not allowed. | ||||
|  | ||||
|                             Preamble | ||||
|  | ||||
|   The GNU Affero General Public License is a free, copyleft license for | ||||
| software and other kinds of works, specifically designed to ensure | ||||
| cooperation with the community in the case of network server software. | ||||
|  | ||||
|   The licenses for most software and other practical works are designed | ||||
| to take away your freedom to share and change the works.  By contrast, | ||||
| our General Public Licenses are intended to guarantee your freedom to | ||||
| share and change all versions of a program--to make sure it remains free | ||||
| software for all its users. | ||||
|  | ||||
|   When we speak of free software, we are referring to freedom, not | ||||
| price.  Our General Public Licenses are designed to make sure that you | ||||
| have the freedom to distribute copies of free software (and charge for | ||||
| them if you wish), that you receive source code or can get it if you | ||||
| want it, that you can change the software or use pieces of it in new | ||||
| free programs, and that you know you can do these things. | ||||
|  | ||||
|   Developers that use our General Public Licenses protect your rights | ||||
| with two steps: (1) assert copyright on the software, and (2) offer | ||||
| you this License which gives you legal permission to copy, distribute | ||||
| and/or modify the software. | ||||
|  | ||||
|   A secondary benefit of defending all users' freedom is that | ||||
| improvements made in alternate versions of the program, if they | ||||
| receive widespread use, become available for other developers to | ||||
| incorporate.  Many developers of free software are heartened and | ||||
| encouraged by the resulting cooperation.  However, in the case of | ||||
| software used on network servers, this result may fail to come about. | ||||
| The GNU General Public License permits making a modified version and | ||||
| letting the public access it on a server without ever releasing its | ||||
| source code to the public. | ||||
|  | ||||
|   The GNU Affero General Public License is designed specifically to | ||||
| ensure that, in such cases, the modified source code becomes available | ||||
| to the community.  It requires the operator of a network server to | ||||
| provide the source code of the modified version running there to the | ||||
| users of that server.  Therefore, public use of a modified version, on | ||||
| a publicly accessible server, gives the public access to the source | ||||
| code of the modified version. | ||||
|  | ||||
|   An older license, called the Affero General Public License and | ||||
| published by Affero, was designed to accomplish similar goals.  This is | ||||
| a different license, not a version of the Affero GPL, but Affero has | ||||
| released a new version of the Affero GPL which permits relicensing under | ||||
| this license. | ||||
|  | ||||
|   The precise terms and conditions for copying, distribution and | ||||
| modification follow. | ||||
|  | ||||
|                        TERMS AND CONDITIONS | ||||
|  | ||||
|   0. Definitions. | ||||
|  | ||||
|   "This License" refers to version 3 of the GNU Affero General Public License. | ||||
|  | ||||
|   "Copyright" also means copyright-like laws that apply to other kinds of | ||||
| works, such as semiconductor masks. | ||||
|  | ||||
|   "The Program" refers to any copyrightable work licensed under this | ||||
| License.  Each licensee is addressed as "you".  "Licensees" and | ||||
| "recipients" may be individuals or organizations. | ||||
|  | ||||
|   To "modify" a work means to copy from or adapt all or part of the work | ||||
| in a fashion requiring copyright permission, other than the making of an | ||||
| exact copy.  The resulting work is called a "modified version" of the | ||||
| earlier work or a work "based on" the earlier work. | ||||
|  | ||||
|   A "covered work" means either the unmodified Program or a work based | ||||
| on the Program. | ||||
|  | ||||
|   To "propagate" a work means to do anything with it that, without | ||||
| permission, would make you directly or secondarily liable for | ||||
| infringement under applicable copyright law, except executing it on a | ||||
| computer or modifying a private copy.  Propagation includes copying, | ||||
| distribution (with or without modification), making available to the | ||||
| public, and in some countries other activities as well. | ||||
|  | ||||
|   To "convey" a work means any kind of propagation that enables other | ||||
| parties to make or receive copies.  Mere interaction with a user through | ||||
| a computer network, with no transfer of a copy, is not conveying. | ||||
|  | ||||
|   An interactive user interface displays "Appropriate Legal Notices" | ||||
| to the extent that it includes a convenient and prominently visible | ||||
| feature that (1) displays an appropriate copyright notice, and (2) | ||||
| tells the user that there is no warranty for the work (except to the | ||||
| extent that warranties are provided), that licensees may convey the | ||||
| work under this License, and how to view a copy of this License.  If | ||||
| the interface presents a list of user commands or options, such as a | ||||
| menu, a prominent item in the list meets this criterion. | ||||
|  | ||||
|   1. Source Code. | ||||
|  | ||||
|   The "source code" for a work means the preferred form of the work | ||||
| for making modifications to it.  "Object code" means any non-source | ||||
| form of a work. | ||||
|  | ||||
|   A "Standard Interface" means an interface that either is an official | ||||
| standard defined by a recognized standards body, or, in the case of | ||||
| interfaces specified for a particular programming language, one that | ||||
| is widely used among developers working in that language. | ||||
|  | ||||
|   The "System Libraries" of an executable work include anything, other | ||||
| than the work as a whole, that (a) is included in the normal form of | ||||
| packaging a Major Component, but which is not part of that Major | ||||
| Component, and (b) serves only to enable use of the work with that | ||||
| Major Component, or to implement a Standard Interface for which an | ||||
| implementation is available to the public in source code form.  A | ||||
| "Major Component", in this context, means a major essential component | ||||
| (kernel, window system, and so on) of the specific operating system | ||||
| (if any) on which the executable work runs, or a compiler used to | ||||
| produce the work, or an object code interpreter used to run it. | ||||
|  | ||||
|   The "Corresponding Source" for a work in object code form means all | ||||
| the source code needed to generate, install, and (for an executable | ||||
| work) run the object code and to modify the work, including scripts to | ||||
| control those activities.  However, it does not include the work's | ||||
| System Libraries, or general-purpose tools or generally available free | ||||
| programs which are used unmodified in performing those activities but | ||||
| which are not part of the work.  For example, Corresponding Source | ||||
| includes interface definition files associated with source files for | ||||
| the work, and the source code for shared libraries and dynamically | ||||
| linked subprograms that the work is specifically designed to require, | ||||
| such as by intimate data communication or control flow between those | ||||
| subprograms and other parts of the work. | ||||
|  | ||||
|   The Corresponding Source need not include anything that users | ||||
| can regenerate automatically from other parts of the Corresponding | ||||
| Source. | ||||
|  | ||||
|   The Corresponding Source for a work in source code form is that | ||||
| same work. | ||||
|  | ||||
|   2. Basic Permissions. | ||||
|  | ||||
|   All rights granted under this License are granted for the term of | ||||
| copyright on the Program, and are irrevocable provided the stated | ||||
| conditions are met.  This License explicitly affirms your unlimited | ||||
| permission to run the unmodified Program.  The output from running a | ||||
| covered work is covered by this License only if the output, given its | ||||
| content, constitutes a covered work.  This License acknowledges your | ||||
| rights of fair use or other equivalent, as provided by copyright law. | ||||
|  | ||||
|   You may make, run and propagate covered works that you do not | ||||
| convey, without conditions so long as your license otherwise remains | ||||
| in force.  You may convey covered works to others for the sole purpose | ||||
| of having them make modifications exclusively for you, or provide you | ||||
| with facilities for running those works, provided that you comply with | ||||
| the terms of this License in conveying all material for which you do | ||||
| not control copyright.  Those thus making or running the covered works | ||||
| for you must do so exclusively on your behalf, under your direction | ||||
| and control, on terms that prohibit them from making any copies of | ||||
| your copyrighted material outside their relationship with you. | ||||
|  | ||||
|   Conveying under any other circumstances is permitted solely under | ||||
| the conditions stated below.  Sublicensing is not allowed; section 10 | ||||
| makes it unnecessary. | ||||
|  | ||||
|   3. Protecting Users' Legal Rights From Anti-Circumvention Law. | ||||
|  | ||||
|   No covered work shall be deemed part of an effective technological | ||||
| measure under any applicable law fulfilling obligations under article | ||||
| 11 of the WIPO copyright treaty adopted on 20 December 1996, or | ||||
| similar laws prohibiting or restricting circumvention of such | ||||
| measures. | ||||
|  | ||||
|   When you convey a covered work, you waive any legal power to forbid | ||||
| circumvention of technological measures to the extent such circumvention | ||||
| is effected by exercising rights under this License with respect to | ||||
| the covered work, and you disclaim any intention to limit operation or | ||||
| modification of the work as a means of enforcing, against the work's | ||||
| users, your or third parties' legal rights to forbid circumvention of | ||||
| technological measures. | ||||
|  | ||||
|   4. Conveying Verbatim Copies. | ||||
|  | ||||
|   You may convey verbatim copies of the Program's source code as you | ||||
| receive it, in any medium, provided that you conspicuously and | ||||
| appropriately publish on each copy an appropriate copyright notice; | ||||
| keep intact all notices stating that this License and any | ||||
| non-permissive terms added in accord with section 7 apply to the code; | ||||
| keep intact all notices of the absence of any warranty; and give all | ||||
| recipients a copy of this License along with the Program. | ||||
|  | ||||
|   You may charge any price or no price for each copy that you convey, | ||||
| and you may offer support or warranty protection for a fee. | ||||
|  | ||||
|   5. Conveying Modified Source Versions. | ||||
|  | ||||
|   You may convey a work based on the Program, or the modifications to | ||||
| produce it from the Program, in the form of source code under the | ||||
| terms of section 4, provided that you also meet all of these conditions: | ||||
|  | ||||
|     a) The work must carry prominent notices stating that you modified | ||||
|     it, and giving a relevant date. | ||||
|  | ||||
|     b) The work must carry prominent notices stating that it is | ||||
|     released under this License and any conditions added under section | ||||
|     7.  This requirement modifies the requirement in section 4 to | ||||
|     "keep intact all notices". | ||||
|  | ||||
|     c) You must license the entire work, as a whole, under this | ||||
|     License to anyone who comes into possession of a copy.  This | ||||
|     License will therefore apply, along with any applicable section 7 | ||||
|     additional terms, to the whole of the work, and all its parts, | ||||
|     regardless of how they are packaged.  This License gives no | ||||
|     permission to license the work in any other way, but it does not | ||||
|     invalidate such permission if you have separately received it. | ||||
|  | ||||
|     d) If the work has interactive user interfaces, each must display | ||||
|     Appropriate Legal Notices; however, if the Program has interactive | ||||
|     interfaces that do not display Appropriate Legal Notices, your | ||||
|     work need not make them do so. | ||||
|  | ||||
|   A compilation of a covered work with other separate and independent | ||||
| works, which are not by their nature extensions of the covered work, | ||||
| and which are not combined with it such as to form a larger program, | ||||
| in or on a volume of a storage or distribution medium, is called an | ||||
| "aggregate" if the compilation and its resulting copyright are not | ||||
| used to limit the access or legal rights of the compilation's users | ||||
| beyond what the individual works permit.  Inclusion of a covered work | ||||
| in an aggregate does not cause this License to apply to the other | ||||
| parts of the aggregate. | ||||
|  | ||||
|   6. Conveying Non-Source Forms. | ||||
|  | ||||
|   You may convey a covered work in object code form under the terms | ||||
| of sections 4 and 5, provided that you also convey the | ||||
| machine-readable Corresponding Source under the terms of this License, | ||||
| in one of these ways: | ||||
|  | ||||
|     a) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by the | ||||
|     Corresponding Source fixed on a durable physical medium | ||||
|     customarily used for software interchange. | ||||
|  | ||||
|     b) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by a | ||||
|     written offer, valid for at least three years and valid for as | ||||
|     long as you offer spare parts or customer support for that product | ||||
|     model, to give anyone who possesses the object code either (1) a | ||||
|     copy of the Corresponding Source for all the software in the | ||||
|     product that is covered by this License, on a durable physical | ||||
|     medium customarily used for software interchange, for a price no | ||||
|     more than your reasonable cost of physically performing this | ||||
|     conveying of source, or (2) access to copy the | ||||
|     Corresponding Source from a network server at no charge. | ||||
|  | ||||
|     c) Convey individual copies of the object code with a copy of the | ||||
|     written offer to provide the Corresponding Source.  This | ||||
|     alternative is allowed only occasionally and noncommercially, and | ||||
|     only if you received the object code with such an offer, in accord | ||||
|     with subsection 6b. | ||||
|  | ||||
|     d) Convey the object code by offering access from a designated | ||||
|     place (gratis or for a charge), and offer equivalent access to the | ||||
|     Corresponding Source in the same way through the same place at no | ||||
|     further charge.  You need not require recipients to copy the | ||||
|     Corresponding Source along with the object code.  If the place to | ||||
|     copy the object code is a network server, the Corresponding Source | ||||
|     may be on a different server (operated by you or a third party) | ||||
|     that supports equivalent copying facilities, provided you maintain | ||||
|     clear directions next to the object code saying where to find the | ||||
|     Corresponding Source.  Regardless of what server hosts the | ||||
|     Corresponding Source, you remain obligated to ensure that it is | ||||
|     available for as long as needed to satisfy these requirements. | ||||
|  | ||||
|     e) Convey the object code using peer-to-peer transmission, provided | ||||
|     you inform other peers where the object code and Corresponding | ||||
|     Source of the work are being offered to the general public at no | ||||
|     charge under subsection 6d. | ||||
|  | ||||
|   A separable portion of the object code, whose source code is excluded | ||||
| from the Corresponding Source as a System Library, need not be | ||||
| included in conveying the object code work. | ||||
|  | ||||
|   A "User Product" is either (1) a "consumer product", which means any | ||||
| tangible personal property which is normally used for personal, family, | ||||
| or household purposes, or (2) anything designed or sold for incorporation | ||||
| into a dwelling.  In determining whether a product is a consumer product, | ||||
| doubtful cases shall be resolved in favor of coverage.  For a particular | ||||
| product received by a particular user, "normally used" refers to a | ||||
| typical or common use of that class of product, regardless of the status | ||||
| of the particular user or of the way in which the particular user | ||||
| actually uses, or expects or is expected to use, the product.  A product | ||||
| is a consumer product regardless of whether the product has substantial | ||||
| commercial, industrial or non-consumer uses, unless such uses represent | ||||
| the only significant mode of use of the product. | ||||
|  | ||||
|   "Installation Information" for a User Product means any methods, | ||||
| procedures, authorization keys, or other information required to install | ||||
| and execute modified versions of a covered work in that User Product from | ||||
| a modified version of its Corresponding Source.  The information must | ||||
| suffice to ensure that the continued functioning of the modified object | ||||
| code is in no case prevented or interfered with solely because | ||||
| modification has been made. | ||||
|  | ||||
|   If you convey an object code work under this section in, or with, or | ||||
| specifically for use in, a User Product, and the conveying occurs as | ||||
| part of a transaction in which the right of possession and use of the | ||||
| User Product is transferred to the recipient in perpetuity or for a | ||||
| fixed term (regardless of how the transaction is characterized), the | ||||
| Corresponding Source conveyed under this section must be accompanied | ||||
| by the Installation Information.  But this requirement does not apply | ||||
| if neither you nor any third party retains the ability to install | ||||
| modified object code on the User Product (for example, the work has | ||||
| been installed in ROM). | ||||
|  | ||||
|   The requirement to provide Installation Information does not include a | ||||
| requirement to continue to provide support service, warranty, or updates | ||||
| for a work that has been modified or installed by the recipient, or for | ||||
| the User Product in which it has been modified or installed.  Access to a | ||||
| network may be denied when the modification itself materially and | ||||
| adversely affects the operation of the network or violates the rules and | ||||
| protocols for communication across the network. | ||||
|  | ||||
|   Corresponding Source conveyed, and Installation Information provided, | ||||
| in accord with this section must be in a format that is publicly | ||||
| documented (and with an implementation available to the public in | ||||
| source code form), and must require no special password or key for | ||||
| unpacking, reading or copying. | ||||
|  | ||||
|   7. Additional Terms. | ||||
|  | ||||
|   "Additional permissions" are terms that supplement the terms of this | ||||
| License by making exceptions from one or more of its conditions. | ||||
| Additional permissions that are applicable to the entire Program shall | ||||
| be treated as though they were included in this License, to the extent | ||||
| that they are valid under applicable law.  If additional permissions | ||||
| apply only to part of the Program, that part may be used separately | ||||
| under those permissions, but the entire Program remains governed by | ||||
| this License without regard to the additional permissions. | ||||
|  | ||||
|   When you convey a copy of a covered work, you may at your option | ||||
| remove any additional permissions from that copy, or from any part of | ||||
| it.  (Additional permissions may be written to require their own | ||||
| removal in certain cases when you modify the work.)  You may place | ||||
| additional permissions on material, added by you to a covered work, | ||||
| for which you have or can give appropriate copyright permission. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, for material you | ||||
| add to a covered work, you may (if authorized by the copyright holders of | ||||
| that material) supplement the terms of this License with terms: | ||||
|  | ||||
|     a) Disclaiming warranty or limiting liability differently from the | ||||
|     terms of sections 15 and 16 of this License; or | ||||
|  | ||||
|     b) Requiring preservation of specified reasonable legal notices or | ||||
|     author attributions in that material or in the Appropriate Legal | ||||
|     Notices displayed by works containing it; or | ||||
|  | ||||
|     c) Prohibiting misrepresentation of the origin of that material, or | ||||
|     requiring that modified versions of such material be marked in | ||||
|     reasonable ways as different from the original version; or | ||||
|  | ||||
|     d) Limiting the use for publicity purposes of names of licensors or | ||||
|     authors of the material; or | ||||
|  | ||||
|     e) Declining to grant rights under trademark law for use of some | ||||
|     trade names, trademarks, or service marks; or | ||||
|  | ||||
|     f) Requiring indemnification of licensors and authors of that | ||||
|     material by anyone who conveys the material (or modified versions of | ||||
|     it) with contractual assumptions of liability to the recipient, for | ||||
|     any liability that these contractual assumptions directly impose on | ||||
|     those licensors and authors. | ||||
|  | ||||
|   All other non-permissive additional terms are considered "further | ||||
| restrictions" within the meaning of section 10.  If the Program as you | ||||
| received it, or any part of it, contains a notice stating that it is | ||||
| governed by this License along with a term that is a further | ||||
| restriction, you may remove that term.  If a license document contains | ||||
| a further restriction but permits relicensing or conveying under this | ||||
| License, you may add to a covered work material governed by the terms | ||||
| of that license document, provided that the further restriction does | ||||
| not survive such relicensing or conveying. | ||||
|  | ||||
|   If you add terms to a covered work in accord with this section, you | ||||
| must place, in the relevant source files, a statement of the | ||||
| additional terms that apply to those files, or a notice indicating | ||||
| where to find the applicable terms. | ||||
|  | ||||
|   Additional terms, permissive or non-permissive, may be stated in the | ||||
| form of a separately written license, or stated as exceptions; | ||||
| the above requirements apply either way. | ||||
|  | ||||
|   8. Termination. | ||||
|  | ||||
|   You may not propagate or modify a covered work except as expressly | ||||
| provided under this License.  Any attempt otherwise to propagate or | ||||
| modify it is void, and will automatically terminate your rights under | ||||
| this License (including any patent licenses granted under the third | ||||
| paragraph of section 11). | ||||
|  | ||||
|   However, if you cease all violation of this License, then your | ||||
| license from a particular copyright holder is reinstated (a) | ||||
| provisionally, unless and until the copyright holder explicitly and | ||||
| finally terminates your license, and (b) permanently, if the copyright | ||||
| holder fails to notify you of the violation by some reasonable means | ||||
| prior to 60 days after the cessation. | ||||
|  | ||||
|   Moreover, your license from a particular copyright holder is | ||||
| reinstated permanently if the copyright holder notifies you of the | ||||
| violation by some reasonable means, this is the first time you have | ||||
| received notice of violation of this License (for any work) from that | ||||
| copyright holder, and you cure the violation prior to 30 days after | ||||
| your receipt of the notice. | ||||
|  | ||||
|   Termination of your rights under this section does not terminate the | ||||
| licenses of parties who have received copies or rights from you under | ||||
| this License.  If your rights have been terminated and not permanently | ||||
| reinstated, you do not qualify to receive new licenses for the same | ||||
| material under section 10. | ||||
|  | ||||
|   9. Acceptance Not Required for Having Copies. | ||||
|  | ||||
|   You are not required to accept this License in order to receive or | ||||
| run a copy of the Program.  Ancillary propagation of a covered work | ||||
| occurring solely as a consequence of using peer-to-peer transmission | ||||
| to receive a copy likewise does not require acceptance.  However, | ||||
| nothing other than this License grants you permission to propagate or | ||||
| modify any covered work.  These actions infringe copyright if you do | ||||
| not accept this License.  Therefore, by modifying or propagating a | ||||
| covered work, you indicate your acceptance of this License to do so. | ||||
|  | ||||
|   10. Automatic Licensing of Downstream Recipients. | ||||
|  | ||||
|   Each time you convey a covered work, the recipient automatically | ||||
| receives a license from the original licensors, to run, modify and | ||||
| propagate that work, subject to this License.  You are not responsible | ||||
| for enforcing compliance by third parties with this License. | ||||
|  | ||||
|   An "entity transaction" is a transaction transferring control of an | ||||
| organization, or substantially all assets of one, or subdividing an | ||||
| organization, or merging organizations.  If propagation of a covered | ||||
| work results from an entity transaction, each party to that | ||||
| transaction who receives a copy of the work also receives whatever | ||||
| licenses to the work the party's predecessor in interest had or could | ||||
| give under the previous paragraph, plus a right to possession of the | ||||
| Corresponding Source of the work from the predecessor in interest, if | ||||
| the predecessor has it or can get it with reasonable efforts. | ||||
|  | ||||
|   You may not impose any further restrictions on the exercise of the | ||||
| rights granted or affirmed under this License.  For example, you may | ||||
| not impose a license fee, royalty, or other charge for exercise of | ||||
| rights granted under this License, and you may not initiate litigation | ||||
| (including a cross-claim or counterclaim in a lawsuit) alleging that | ||||
| any patent claim is infringed by making, using, selling, offering for | ||||
| sale, or importing the Program or any portion of it. | ||||
|  | ||||
|   11. Patents. | ||||
|  | ||||
|   A "contributor" is a copyright holder who authorizes use under this | ||||
| License of the Program or a work on which the Program is based.  The | ||||
| work thus licensed is called the contributor's "contributor version". | ||||
|  | ||||
|   A contributor's "essential patent claims" are all patent claims | ||||
| owned or controlled by the contributor, whether already acquired or | ||||
| hereafter acquired, that would be infringed by some manner, permitted | ||||
| by this License, of making, using, or selling its contributor version, | ||||
| but do not include claims that would be infringed only as a | ||||
| consequence of further modification of the contributor version.  For | ||||
| purposes of this definition, "control" includes the right to grant | ||||
| patent sublicenses in a manner consistent with the requirements of | ||||
| this License. | ||||
|  | ||||
|   Each contributor grants you a non-exclusive, worldwide, royalty-free | ||||
| patent license under the contributor's essential patent claims, to | ||||
| make, use, sell, offer for sale, import and otherwise run, modify and | ||||
| propagate the contents of its contributor version. | ||||
|  | ||||
|   In the following three paragraphs, a "patent license" is any express | ||||
| agreement or commitment, however denominated, not to enforce a patent | ||||
| (such as an express permission to practice a patent or covenant not to | ||||
| sue for patent infringement).  To "grant" such a patent license to a | ||||
| party means to make such an agreement or commitment not to enforce a | ||||
| patent against the party. | ||||
|  | ||||
|   If you convey a covered work, knowingly relying on a patent license, | ||||
| and the Corresponding Source of the work is not available for anyone | ||||
| to copy, free of charge and under the terms of this License, through a | ||||
| publicly available network server or other readily accessible means, | ||||
| then you must either (1) cause the Corresponding Source to be so | ||||
| available, or (2) arrange to deprive yourself of the benefit of the | ||||
| patent license for this particular work, or (3) arrange, in a manner | ||||
| consistent with the requirements of this License, to extend the patent | ||||
| license to downstream recipients.  "Knowingly relying" means you have | ||||
| actual knowledge that, but for the patent license, your conveying the | ||||
| covered work in a country, or your recipient's use of the covered work | ||||
| in a country, would infringe one or more identifiable patents in that | ||||
| country that you have reason to believe are valid. | ||||
|  | ||||
|   If, pursuant to or in connection with a single transaction or | ||||
| arrangement, you convey, or propagate by procuring conveyance of, a | ||||
| covered work, and grant a patent license to some of the parties | ||||
| receiving the covered work authorizing them to use, propagate, modify | ||||
| or convey a specific copy of the covered work, then the patent license | ||||
| you grant is automatically extended to all recipients of the covered | ||||
| work and works based on it. | ||||
|  | ||||
|   A patent license is "discriminatory" if it does not include within | ||||
| the scope of its coverage, prohibits the exercise of, or is | ||||
| conditioned on the non-exercise of one or more of the rights that are | ||||
| specifically granted under this License.  You may not convey a covered | ||||
| work if you are a party to an arrangement with a third party that is | ||||
| in the business of distributing software, under which you make payment | ||||
| to the third party based on the extent of your activity of conveying | ||||
| the work, and under which the third party grants, to any of the | ||||
| parties who would receive the covered work from you, a discriminatory | ||||
| patent license (a) in connection with copies of the covered work | ||||
| conveyed by you (or copies made from those copies), or (b) primarily | ||||
| for and in connection with specific products or compilations that | ||||
| contain the covered work, unless you entered into that arrangement, | ||||
| or that patent license was granted, prior to 28 March 2007. | ||||
|  | ||||
|   Nothing in this License shall be construed as excluding or limiting | ||||
| any implied license or other defenses to infringement that may | ||||
| otherwise be available to you under applicable patent law. | ||||
|  | ||||
|   12. No Surrender of Others' Freedom. | ||||
|  | ||||
|   If conditions are imposed on you (whether by court order, agreement or | ||||
| otherwise) that contradict the conditions of this License, they do not | ||||
| excuse you from the conditions of this License.  If you cannot convey a | ||||
| covered work so as to satisfy simultaneously your obligations under this | ||||
| License and any other pertinent obligations, then as a consequence you may | ||||
| not convey it at all.  For example, if you agree to terms that obligate you | ||||
| to collect a royalty for further conveying from those to whom you convey | ||||
| the Program, the only way you could satisfy both those terms and this | ||||
| License would be to refrain entirely from conveying the Program. | ||||
|  | ||||
|   13. Remote Network Interaction; Use with the GNU General Public License. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, if you modify the | ||||
| Program, your modified version must prominently offer all users | ||||
| interacting with it remotely through a computer network (if your version | ||||
| supports such interaction) an opportunity to receive the Corresponding | ||||
| Source of your version by providing access to the Corresponding Source | ||||
| from a network server at no charge, through some standard or customary | ||||
| means of facilitating copying of software.  This Corresponding Source | ||||
| shall include the Corresponding Source for any work covered by version 3 | ||||
| of the GNU General Public License that is incorporated pursuant to the | ||||
| following paragraph. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, you have | ||||
| permission to link or combine any covered work with a work licensed | ||||
| under version 3 of the GNU General Public License into a single | ||||
| combined work, and to convey the resulting work.  The terms of this | ||||
| License will continue to apply to the part which is the covered work, | ||||
| but the work with which it is combined will remain governed by version | ||||
| 3 of the GNU General Public License. | ||||
|  | ||||
|   14. Revised Versions of this License. | ||||
|  | ||||
|   The Free Software Foundation may publish revised and/or new versions of | ||||
| the GNU Affero General Public License from time to time.  Such new versions | ||||
| will be similar in spirit to the present version, but may differ in detail to | ||||
| address new problems or concerns. | ||||
|  | ||||
|   Each version is given a distinguishing version number.  If the | ||||
| Program specifies that a certain numbered version of the GNU Affero General | ||||
| Public License "or any later version" applies to it, you have the | ||||
| option of following the terms and conditions either of that numbered | ||||
| version or of any later version published by the Free Software | ||||
| Foundation.  If the Program does not specify a version number of the | ||||
| GNU Affero General Public License, you may choose any version ever published | ||||
| by the Free Software Foundation. | ||||
|  | ||||
|   If the Program specifies that a proxy can decide which future | ||||
| versions of the GNU Affero General Public License can be used, that proxy's | ||||
| public statement of acceptance of a version permanently authorizes you | ||||
| to choose that version for the Program. | ||||
|  | ||||
|   Later license versions may give you additional or different | ||||
| permissions.  However, no additional obligations are imposed on any | ||||
| author or copyright holder as a result of your choosing to follow a | ||||
| later version. | ||||
|  | ||||
|   15. Disclaimer of Warranty. | ||||
|  | ||||
|   THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY | ||||
| APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT | ||||
| HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY | ||||
| OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, | ||||
| THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||||
| PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM | ||||
| IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF | ||||
| ALL NECESSARY SERVICING, REPAIR OR CORRECTION. | ||||
|  | ||||
|   16. Limitation of Liability. | ||||
|  | ||||
|   IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS | ||||
| THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY | ||||
| GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE | ||||
| USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF | ||||
| DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD | ||||
| PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), | ||||
| EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF | ||||
| SUCH DAMAGES. | ||||
|  | ||||
|   17. Interpretation of Sections 15 and 16. | ||||
|  | ||||
|   If the disclaimer of warranty and limitation of liability provided | ||||
| above cannot be given local legal effect according to their terms, | ||||
| reviewing courts shall apply local law that most closely approximates | ||||
| an absolute waiver of all civil liability in connection with the | ||||
| Program, unless a warranty or assumption of liability accompanies a | ||||
| copy of the Program in return for a fee. | ||||
|  | ||||
|                      END OF TERMS AND CONDITIONS | ||||
|  | ||||
|             How to Apply These Terms to Your New Programs | ||||
|  | ||||
|   If you develop a new program, and you want it to be of the greatest | ||||
| possible use to the public, the best way to achieve this is to make it | ||||
| free software which everyone can redistribute and change under these terms. | ||||
|  | ||||
|   To do so, attach the following notices to the program.  It is safest | ||||
| to attach them to the start of each source file to most effectively | ||||
| state the exclusion of warranty; and each file should have at least | ||||
| the "copyright" line and a pointer to where the full notice is found. | ||||
|  | ||||
|     <one line to give the program's name and a brief idea of what it does.> | ||||
|     Copyright (C) <year>  <name of author> | ||||
|  | ||||
|     This program is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU Affero General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
|  | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU Affero General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU Affero General Public License | ||||
|     along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  | ||||
| Also add information on how to contact you by electronic and paper mail. | ||||
|  | ||||
|   If your software can interact with users remotely through a computer | ||||
| network, you should also make sure that it provides a way for users to | ||||
| get its source.  For example, if your program is a web application, its | ||||
| interface could display a "Source" link that leads users to an archive | ||||
| of the code.  There are many ways you could offer source, and different | ||||
| solutions will be better for different programs; see section 13 for the | ||||
| specific requirements. | ||||
|  | ||||
|   You should also get your employer (if you work as a programmer) or school, | ||||
| if any, to sign a "copyright disclaimer" for the program, if necessary. | ||||
| For more information on this, and how to apply and follow the GNU AGPL, see | ||||
| <http://www.gnu.org/licenses/>. | ||||
							
								
								
									
										35
									
								
								vendor/github.com/mattermost/platform/vendor/golang.org/x/crypto/bcrypt/base64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								vendor/github.com/mattermost/platform/vendor/golang.org/x/crypto/bcrypt/base64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| // Copyright 2011 The Go 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 bcrypt | ||||
|  | ||||
| import "encoding/base64" | ||||
|  | ||||
| const alphabet = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" | ||||
|  | ||||
| var bcEncoding = base64.NewEncoding(alphabet) | ||||
|  | ||||
| func base64Encode(src []byte) []byte { | ||||
| 	n := bcEncoding.EncodedLen(len(src)) | ||||
| 	dst := make([]byte, n) | ||||
| 	bcEncoding.Encode(dst, src) | ||||
| 	for dst[n-1] == '=' { | ||||
| 		n-- | ||||
| 	} | ||||
| 	return dst[:n] | ||||
| } | ||||
|  | ||||
| func base64Decode(src []byte) ([]byte, error) { | ||||
| 	numOfEquals := 4 - (len(src) % 4) | ||||
| 	for i := 0; i < numOfEquals; i++ { | ||||
| 		src = append(src, '=') | ||||
| 	} | ||||
|  | ||||
| 	dst := make([]byte, bcEncoding.DecodedLen(len(src))) | ||||
| 	n, err := bcEncoding.Decode(dst, src) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return dst[:n], nil | ||||
| } | ||||
							
								
								
									
										294
									
								
								vendor/github.com/mattermost/platform/vendor/golang.org/x/crypto/bcrypt/bcrypt.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										294
									
								
								vendor/github.com/mattermost/platform/vendor/golang.org/x/crypto/bcrypt/bcrypt.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,294 @@ | ||||
| // Copyright 2011 The Go 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 bcrypt implements Provos and Mazières's bcrypt adaptive hashing | ||||
| // algorithm. See http://www.usenix.org/event/usenix99/provos/provos.pdf | ||||
| package bcrypt // import "golang.org/x/crypto/bcrypt" | ||||
|  | ||||
| // The code is a port of Provos and Mazières's C implementation. | ||||
| import ( | ||||
| 	"crypto/rand" | ||||
| 	"crypto/subtle" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"golang.org/x/crypto/blowfish" | ||||
| 	"io" | ||||
| 	"strconv" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	MinCost     int = 4  // the minimum allowable cost as passed in to GenerateFromPassword | ||||
| 	MaxCost     int = 31 // the maximum allowable cost as passed in to GenerateFromPassword | ||||
| 	DefaultCost int = 10 // the cost that will actually be set if a cost below MinCost is passed into GenerateFromPassword | ||||
| ) | ||||
|  | ||||
| // The error returned from CompareHashAndPassword when a password and hash do | ||||
| // not match. | ||||
| var ErrMismatchedHashAndPassword = errors.New("crypto/bcrypt: hashedPassword is not the hash of the given password") | ||||
|  | ||||
| // The error returned from CompareHashAndPassword when a hash is too short to | ||||
| // be a bcrypt hash. | ||||
| var ErrHashTooShort = errors.New("crypto/bcrypt: hashedSecret too short to be a bcrypted password") | ||||
|  | ||||
| // The error returned from CompareHashAndPassword when a hash was created with | ||||
| // a bcrypt algorithm newer than this implementation. | ||||
| type HashVersionTooNewError byte | ||||
|  | ||||
| func (hv HashVersionTooNewError) Error() string { | ||||
| 	return fmt.Sprintf("crypto/bcrypt: bcrypt algorithm version '%c' requested is newer than current version '%c'", byte(hv), majorVersion) | ||||
| } | ||||
|  | ||||
| // The error returned from CompareHashAndPassword when a hash starts with something other than '$' | ||||
| type InvalidHashPrefixError byte | ||||
|  | ||||
| func (ih InvalidHashPrefixError) Error() string { | ||||
| 	return fmt.Sprintf("crypto/bcrypt: bcrypt hashes must start with '$', but hashedSecret started with '%c'", byte(ih)) | ||||
| } | ||||
|  | ||||
| type InvalidCostError int | ||||
|  | ||||
| func (ic InvalidCostError) Error() string { | ||||
| 	return fmt.Sprintf("crypto/bcrypt: cost %d is outside allowed range (%d,%d)", int(ic), int(MinCost), int(MaxCost)) | ||||
| } | ||||
|  | ||||
| const ( | ||||
| 	majorVersion       = '2' | ||||
| 	minorVersion       = 'a' | ||||
| 	maxSaltSize        = 16 | ||||
| 	maxCryptedHashSize = 23 | ||||
| 	encodedSaltSize    = 22 | ||||
| 	encodedHashSize    = 31 | ||||
| 	minHashSize        = 59 | ||||
| ) | ||||
|  | ||||
| // magicCipherData is an IV for the 64 Blowfish encryption calls in | ||||
| // bcrypt(). It's the string "OrpheanBeholderScryDoubt" in big-endian bytes. | ||||
| var magicCipherData = []byte{ | ||||
| 	0x4f, 0x72, 0x70, 0x68, | ||||
| 	0x65, 0x61, 0x6e, 0x42, | ||||
| 	0x65, 0x68, 0x6f, 0x6c, | ||||
| 	0x64, 0x65, 0x72, 0x53, | ||||
| 	0x63, 0x72, 0x79, 0x44, | ||||
| 	0x6f, 0x75, 0x62, 0x74, | ||||
| } | ||||
|  | ||||
| type hashed struct { | ||||
| 	hash  []byte | ||||
| 	salt  []byte | ||||
| 	cost  int // allowed range is MinCost to MaxCost | ||||
| 	major byte | ||||
| 	minor byte | ||||
| } | ||||
|  | ||||
| // GenerateFromPassword returns the bcrypt hash of the password at the given | ||||
| // cost. If the cost given is less than MinCost, the cost will be set to | ||||
| // DefaultCost, instead. Use CompareHashAndPassword, as defined in this package, | ||||
| // to compare the returned hashed password with its cleartext version. | ||||
| func GenerateFromPassword(password []byte, cost int) ([]byte, error) { | ||||
| 	p, err := newFromPassword(password, cost) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return p.Hash(), nil | ||||
| } | ||||
|  | ||||
| // CompareHashAndPassword compares a bcrypt hashed password with its possible | ||||
| // plaintext equivalent. Returns nil on success, or an error on failure. | ||||
| func CompareHashAndPassword(hashedPassword, password []byte) error { | ||||
| 	p, err := newFromHash(hashedPassword) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	otherHash, err := bcrypt(password, p.cost, p.salt) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	otherP := &hashed{otherHash, p.salt, p.cost, p.major, p.minor} | ||||
| 	if subtle.ConstantTimeCompare(p.Hash(), otherP.Hash()) == 1 { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	return ErrMismatchedHashAndPassword | ||||
| } | ||||
|  | ||||
| // Cost returns the hashing cost used to create the given hashed | ||||
| // password. When, in the future, the hashing cost of a password system needs | ||||
| // to be increased in order to adjust for greater computational power, this | ||||
| // function allows one to establish which passwords need to be updated. | ||||
| func Cost(hashedPassword []byte) (int, error) { | ||||
| 	p, err := newFromHash(hashedPassword) | ||||
| 	if err != nil { | ||||
| 		return 0, err | ||||
| 	} | ||||
| 	return p.cost, nil | ||||
| } | ||||
|  | ||||
| func newFromPassword(password []byte, cost int) (*hashed, error) { | ||||
| 	if cost < MinCost { | ||||
| 		cost = DefaultCost | ||||
| 	} | ||||
| 	p := new(hashed) | ||||
| 	p.major = majorVersion | ||||
| 	p.minor = minorVersion | ||||
|  | ||||
| 	err := checkCost(cost) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	p.cost = cost | ||||
|  | ||||
| 	unencodedSalt := make([]byte, maxSaltSize) | ||||
| 	_, err = io.ReadFull(rand.Reader, unencodedSalt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	p.salt = base64Encode(unencodedSalt) | ||||
| 	hash, err := bcrypt(password, p.cost, p.salt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	p.hash = hash | ||||
| 	return p, err | ||||
| } | ||||
|  | ||||
| func newFromHash(hashedSecret []byte) (*hashed, error) { | ||||
| 	if len(hashedSecret) < minHashSize { | ||||
| 		return nil, ErrHashTooShort | ||||
| 	} | ||||
| 	p := new(hashed) | ||||
| 	n, err := p.decodeVersion(hashedSecret) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	hashedSecret = hashedSecret[n:] | ||||
| 	n, err = p.decodeCost(hashedSecret) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	hashedSecret = hashedSecret[n:] | ||||
|  | ||||
| 	// The "+2" is here because we'll have to append at most 2 '=' to the salt | ||||
| 	// when base64 decoding it in expensiveBlowfishSetup(). | ||||
| 	p.salt = make([]byte, encodedSaltSize, encodedSaltSize+2) | ||||
| 	copy(p.salt, hashedSecret[:encodedSaltSize]) | ||||
|  | ||||
| 	hashedSecret = hashedSecret[encodedSaltSize:] | ||||
| 	p.hash = make([]byte, len(hashedSecret)) | ||||
| 	copy(p.hash, hashedSecret) | ||||
|  | ||||
| 	return p, nil | ||||
| } | ||||
|  | ||||
| func bcrypt(password []byte, cost int, salt []byte) ([]byte, error) { | ||||
| 	cipherData := make([]byte, len(magicCipherData)) | ||||
| 	copy(cipherData, magicCipherData) | ||||
|  | ||||
| 	c, err := expensiveBlowfishSetup(password, uint32(cost), salt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < 24; i += 8 { | ||||
| 		for j := 0; j < 64; j++ { | ||||
| 			c.Encrypt(cipherData[i:i+8], cipherData[i:i+8]) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Bug compatibility with C bcrypt implementations. We only encode 23 of | ||||
| 	// the 24 bytes encrypted. | ||||
| 	hsh := base64Encode(cipherData[:maxCryptedHashSize]) | ||||
| 	return hsh, nil | ||||
| } | ||||
|  | ||||
| func expensiveBlowfishSetup(key []byte, cost uint32, salt []byte) (*blowfish.Cipher, error) { | ||||
|  | ||||
| 	csalt, err := base64Decode(salt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	// Bug compatibility with C bcrypt implementations. They use the trailing | ||||
| 	// NULL in the key string during expansion. | ||||
| 	ckey := append(key, 0) | ||||
|  | ||||
| 	c, err := blowfish.NewSaltedCipher(ckey, csalt) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	var i, rounds uint64 | ||||
| 	rounds = 1 << cost | ||||
| 	for i = 0; i < rounds; i++ { | ||||
| 		blowfish.ExpandKey(ckey, c) | ||||
| 		blowfish.ExpandKey(csalt, c) | ||||
| 	} | ||||
|  | ||||
| 	return c, nil | ||||
| } | ||||
|  | ||||
| func (p *hashed) Hash() []byte { | ||||
| 	arr := make([]byte, 60) | ||||
| 	arr[0] = '$' | ||||
| 	arr[1] = p.major | ||||
| 	n := 2 | ||||
| 	if p.minor != 0 { | ||||
| 		arr[2] = p.minor | ||||
| 		n = 3 | ||||
| 	} | ||||
| 	arr[n] = '$' | ||||
| 	n += 1 | ||||
| 	copy(arr[n:], []byte(fmt.Sprintf("%02d", p.cost))) | ||||
| 	n += 2 | ||||
| 	arr[n] = '$' | ||||
| 	n += 1 | ||||
| 	copy(arr[n:], p.salt) | ||||
| 	n += encodedSaltSize | ||||
| 	copy(arr[n:], p.hash) | ||||
| 	n += encodedHashSize | ||||
| 	return arr[:n] | ||||
| } | ||||
|  | ||||
| func (p *hashed) decodeVersion(sbytes []byte) (int, error) { | ||||
| 	if sbytes[0] != '$' { | ||||
| 		return -1, InvalidHashPrefixError(sbytes[0]) | ||||
| 	} | ||||
| 	if sbytes[1] > majorVersion { | ||||
| 		return -1, HashVersionTooNewError(sbytes[1]) | ||||
| 	} | ||||
| 	p.major = sbytes[1] | ||||
| 	n := 3 | ||||
| 	if sbytes[2] != '$' { | ||||
| 		p.minor = sbytes[2] | ||||
| 		n++ | ||||
| 	} | ||||
| 	return n, nil | ||||
| } | ||||
|  | ||||
| // sbytes should begin where decodeVersion left off. | ||||
| func (p *hashed) decodeCost(sbytes []byte) (int, error) { | ||||
| 	cost, err := strconv.Atoi(string(sbytes[0:2])) | ||||
| 	if err != nil { | ||||
| 		return -1, err | ||||
| 	} | ||||
| 	err = checkCost(cost) | ||||
| 	if err != nil { | ||||
| 		return -1, err | ||||
| 	} | ||||
| 	p.cost = cost | ||||
| 	return 3, nil | ||||
| } | ||||
|  | ||||
| func (p *hashed) String() string { | ||||
| 	return fmt.Sprintf("&{hash: %#v, salt: %#v, cost: %d, major: %c, minor: %c}", string(p.hash), p.salt, p.cost, p.major, p.minor) | ||||
| } | ||||
|  | ||||
| func checkCost(cost int) error { | ||||
| 	if cost < MinCost || cost > MaxCost { | ||||
| 		return InvalidCostError(cost) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										897
									
								
								vendor/github.com/mattermost/platform/vendor/golang.org/x/crypto/blowfish/LICENSE.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										897
									
								
								vendor/github.com/mattermost/platform/vendor/golang.org/x/crypto/blowfish/LICENSE.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,897 @@ | ||||
| Mattermost Licensing | ||||
|  | ||||
| SOFTWARE LICENSING  | ||||
|  | ||||
| You are licensed to use compiled versions of the Mattermost platform produced by Mattermost, Inc. under an MIT LICENSE  | ||||
|  | ||||
| -	See MIT-COMPILED-LICENSE.md included in compiled versions for details | ||||
|  | ||||
| You may be licensed to use source code to create compiled versions not produced by Mattermost, Inc. in one of two ways: | ||||
|  | ||||
| 1. Under the Free Software Foundation’s GNU AGPL v.3.0, subject to the exceptions outlined in this policy; or  | ||||
| 2. Under a commercial license available from Mattermost, Inc. by contacting commercial@mattermost.com  | ||||
|  | ||||
| You are licensed to use the source code in Admin Tools and Configuration Files (templates/, config/, model/,  | ||||
| webapp/client, webapp/fonts, webapp/i18n, webapp/images and all subdirectories thereof) under the Apache License v2.0. | ||||
|  | ||||
| We promise that we will not enforce the copyleft provisions in AGPL v3.0 against you if your application (a) does not  | ||||
| link to the Mattermost Platform directly, but exclusively uses the Mattermost Admin Tools and Configuration Files, and | ||||
| (b) you have not modified, added to or adapted the source code of Mattermost in a way that results in the creation of  | ||||
| a “modified version” or “work based on” Mattermost as these terms are defined in the AGPL v3.0 license. | ||||
|  | ||||
| MATTERMOST TRADEMARK GUIDELINES | ||||
|  | ||||
| Your use of the mark Mattermost is subject to Mattermost, Inc's prior written approval and our organization’s Trademark  | ||||
| Standards of Use at http://www.mattermost.org/trademark-standards-of-use/. For trademark approval or any questions  | ||||
| you have about using these trademarks, please email trademark@mattermost.com  | ||||
|  | ||||
| ------------------------------------------------------------------------------------------------------------------------------ | ||||
|                                 | ||||
|                                Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "[]" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright [yyyy] [name of copyright owner] | ||||
|  | ||||
|    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. | ||||
|  | ||||
| ------------------------------------------------------------------------------ | ||||
|  | ||||
| The software is released under the terms of the GNU Affero General Public | ||||
| License, version 3. | ||||
|  | ||||
|                     GNU AFFERO GENERAL PUBLIC LICENSE | ||||
|                        Version 3, 19 November 2007 | ||||
|  | ||||
|  Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | ||||
|  Everyone is permitted to copy and distribute verbatim copies | ||||
|  of this license document, but changing it is not allowed. | ||||
|  | ||||
|                             Preamble | ||||
|  | ||||
|   The GNU Affero General Public License is a free, copyleft license for | ||||
| software and other kinds of works, specifically designed to ensure | ||||
| cooperation with the community in the case of network server software. | ||||
|  | ||||
|   The licenses for most software and other practical works are designed | ||||
| to take away your freedom to share and change the works.  By contrast, | ||||
| our General Public Licenses are intended to guarantee your freedom to | ||||
| share and change all versions of a program--to make sure it remains free | ||||
| software for all its users. | ||||
|  | ||||
|   When we speak of free software, we are referring to freedom, not | ||||
| price.  Our General Public Licenses are designed to make sure that you | ||||
| have the freedom to distribute copies of free software (and charge for | ||||
| them if you wish), that you receive source code or can get it if you | ||||
| want it, that you can change the software or use pieces of it in new | ||||
| free programs, and that you know you can do these things. | ||||
|  | ||||
|   Developers that use our General Public Licenses protect your rights | ||||
| with two steps: (1) assert copyright on the software, and (2) offer | ||||
| you this License which gives you legal permission to copy, distribute | ||||
| and/or modify the software. | ||||
|  | ||||
|   A secondary benefit of defending all users' freedom is that | ||||
| improvements made in alternate versions of the program, if they | ||||
| receive widespread use, become available for other developers to | ||||
| incorporate.  Many developers of free software are heartened and | ||||
| encouraged by the resulting cooperation.  However, in the case of | ||||
| software used on network servers, this result may fail to come about. | ||||
| The GNU General Public License permits making a modified version and | ||||
| letting the public access it on a server without ever releasing its | ||||
| source code to the public. | ||||
|  | ||||
|   The GNU Affero General Public License is designed specifically to | ||||
| ensure that, in such cases, the modified source code becomes available | ||||
| to the community.  It requires the operator of a network server to | ||||
| provide the source code of the modified version running there to the | ||||
| users of that server.  Therefore, public use of a modified version, on | ||||
| a publicly accessible server, gives the public access to the source | ||||
| code of the modified version. | ||||
|  | ||||
|   An older license, called the Affero General Public License and | ||||
| published by Affero, was designed to accomplish similar goals.  This is | ||||
| a different license, not a version of the Affero GPL, but Affero has | ||||
| released a new version of the Affero GPL which permits relicensing under | ||||
| this license. | ||||
|  | ||||
|   The precise terms and conditions for copying, distribution and | ||||
| modification follow. | ||||
|  | ||||
|                        TERMS AND CONDITIONS | ||||
|  | ||||
|   0. Definitions. | ||||
|  | ||||
|   "This License" refers to version 3 of the GNU Affero General Public License. | ||||
|  | ||||
|   "Copyright" also means copyright-like laws that apply to other kinds of | ||||
| works, such as semiconductor masks. | ||||
|  | ||||
|   "The Program" refers to any copyrightable work licensed under this | ||||
| License.  Each licensee is addressed as "you".  "Licensees" and | ||||
| "recipients" may be individuals or organizations. | ||||
|  | ||||
|   To "modify" a work means to copy from or adapt all or part of the work | ||||
| in a fashion requiring copyright permission, other than the making of an | ||||
| exact copy.  The resulting work is called a "modified version" of the | ||||
| earlier work or a work "based on" the earlier work. | ||||
|  | ||||
|   A "covered work" means either the unmodified Program or a work based | ||||
| on the Program. | ||||
|  | ||||
|   To "propagate" a work means to do anything with it that, without | ||||
| permission, would make you directly or secondarily liable for | ||||
| infringement under applicable copyright law, except executing it on a | ||||
| computer or modifying a private copy.  Propagation includes copying, | ||||
| distribution (with or without modification), making available to the | ||||
| public, and in some countries other activities as well. | ||||
|  | ||||
|   To "convey" a work means any kind of propagation that enables other | ||||
| parties to make or receive copies.  Mere interaction with a user through | ||||
| a computer network, with no transfer of a copy, is not conveying. | ||||
|  | ||||
|   An interactive user interface displays "Appropriate Legal Notices" | ||||
| to the extent that it includes a convenient and prominently visible | ||||
| feature that (1) displays an appropriate copyright notice, and (2) | ||||
| tells the user that there is no warranty for the work (except to the | ||||
| extent that warranties are provided), that licensees may convey the | ||||
| work under this License, and how to view a copy of this License.  If | ||||
| the interface presents a list of user commands or options, such as a | ||||
| menu, a prominent item in the list meets this criterion. | ||||
|  | ||||
|   1. Source Code. | ||||
|  | ||||
|   The "source code" for a work means the preferred form of the work | ||||
| for making modifications to it.  "Object code" means any non-source | ||||
| form of a work. | ||||
|  | ||||
|   A "Standard Interface" means an interface that either is an official | ||||
| standard defined by a recognized standards body, or, in the case of | ||||
| interfaces specified for a particular programming language, one that | ||||
| is widely used among developers working in that language. | ||||
|  | ||||
|   The "System Libraries" of an executable work include anything, other | ||||
| than the work as a whole, that (a) is included in the normal form of | ||||
| packaging a Major Component, but which is not part of that Major | ||||
| Component, and (b) serves only to enable use of the work with that | ||||
| Major Component, or to implement a Standard Interface for which an | ||||
| implementation is available to the public in source code form.  A | ||||
| "Major Component", in this context, means a major essential component | ||||
| (kernel, window system, and so on) of the specific operating system | ||||
| (if any) on which the executable work runs, or a compiler used to | ||||
| produce the work, or an object code interpreter used to run it. | ||||
|  | ||||
|   The "Corresponding Source" for a work in object code form means all | ||||
| the source code needed to generate, install, and (for an executable | ||||
| work) run the object code and to modify the work, including scripts to | ||||
| control those activities.  However, it does not include the work's | ||||
| System Libraries, or general-purpose tools or generally available free | ||||
| programs which are used unmodified in performing those activities but | ||||
| which are not part of the work.  For example, Corresponding Source | ||||
| includes interface definition files associated with source files for | ||||
| the work, and the source code for shared libraries and dynamically | ||||
| linked subprograms that the work is specifically designed to require, | ||||
| such as by intimate data communication or control flow between those | ||||
| subprograms and other parts of the work. | ||||
|  | ||||
|   The Corresponding Source need not include anything that users | ||||
| can regenerate automatically from other parts of the Corresponding | ||||
| Source. | ||||
|  | ||||
|   The Corresponding Source for a work in source code form is that | ||||
| same work. | ||||
|  | ||||
|   2. Basic Permissions. | ||||
|  | ||||
|   All rights granted under this License are granted for the term of | ||||
| copyright on the Program, and are irrevocable provided the stated | ||||
| conditions are met.  This License explicitly affirms your unlimited | ||||
| permission to run the unmodified Program.  The output from running a | ||||
| covered work is covered by this License only if the output, given its | ||||
| content, constitutes a covered work.  This License acknowledges your | ||||
| rights of fair use or other equivalent, as provided by copyright law. | ||||
|  | ||||
|   You may make, run and propagate covered works that you do not | ||||
| convey, without conditions so long as your license otherwise remains | ||||
| in force.  You may convey covered works to others for the sole purpose | ||||
| of having them make modifications exclusively for you, or provide you | ||||
| with facilities for running those works, provided that you comply with | ||||
| the terms of this License in conveying all material for which you do | ||||
| not control copyright.  Those thus making or running the covered works | ||||
| for you must do so exclusively on your behalf, under your direction | ||||
| and control, on terms that prohibit them from making any copies of | ||||
| your copyrighted material outside their relationship with you. | ||||
|  | ||||
|   Conveying under any other circumstances is permitted solely under | ||||
| the conditions stated below.  Sublicensing is not allowed; section 10 | ||||
| makes it unnecessary. | ||||
|  | ||||
|   3. Protecting Users' Legal Rights From Anti-Circumvention Law. | ||||
|  | ||||
|   No covered work shall be deemed part of an effective technological | ||||
| measure under any applicable law fulfilling obligations under article | ||||
| 11 of the WIPO copyright treaty adopted on 20 December 1996, or | ||||
| similar laws prohibiting or restricting circumvention of such | ||||
| measures. | ||||
|  | ||||
|   When you convey a covered work, you waive any legal power to forbid | ||||
| circumvention of technological measures to the extent such circumvention | ||||
| is effected by exercising rights under this License with respect to | ||||
| the covered work, and you disclaim any intention to limit operation or | ||||
| modification of the work as a means of enforcing, against the work's | ||||
| users, your or third parties' legal rights to forbid circumvention of | ||||
| technological measures. | ||||
|  | ||||
|   4. Conveying Verbatim Copies. | ||||
|  | ||||
|   You may convey verbatim copies of the Program's source code as you | ||||
| receive it, in any medium, provided that you conspicuously and | ||||
| appropriately publish on each copy an appropriate copyright notice; | ||||
| keep intact all notices stating that this License and any | ||||
| non-permissive terms added in accord with section 7 apply to the code; | ||||
| keep intact all notices of the absence of any warranty; and give all | ||||
| recipients a copy of this License along with the Program. | ||||
|  | ||||
|   You may charge any price or no price for each copy that you convey, | ||||
| and you may offer support or warranty protection for a fee. | ||||
|  | ||||
|   5. Conveying Modified Source Versions. | ||||
|  | ||||
|   You may convey a work based on the Program, or the modifications to | ||||
| produce it from the Program, in the form of source code under the | ||||
| terms of section 4, provided that you also meet all of these conditions: | ||||
|  | ||||
|     a) The work must carry prominent notices stating that you modified | ||||
|     it, and giving a relevant date. | ||||
|  | ||||
|     b) The work must carry prominent notices stating that it is | ||||
|     released under this License and any conditions added under section | ||||
|     7.  This requirement modifies the requirement in section 4 to | ||||
|     "keep intact all notices". | ||||
|  | ||||
|     c) You must license the entire work, as a whole, under this | ||||
|     License to anyone who comes into possession of a copy.  This | ||||
|     License will therefore apply, along with any applicable section 7 | ||||
|     additional terms, to the whole of the work, and all its parts, | ||||
|     regardless of how they are packaged.  This License gives no | ||||
|     permission to license the work in any other way, but it does not | ||||
|     invalidate such permission if you have separately received it. | ||||
|  | ||||
|     d) If the work has interactive user interfaces, each must display | ||||
|     Appropriate Legal Notices; however, if the Program has interactive | ||||
|     interfaces that do not display Appropriate Legal Notices, your | ||||
|     work need not make them do so. | ||||
|  | ||||
|   A compilation of a covered work with other separate and independent | ||||
| works, which are not by their nature extensions of the covered work, | ||||
| and which are not combined with it such as to form a larger program, | ||||
| in or on a volume of a storage or distribution medium, is called an | ||||
| "aggregate" if the compilation and its resulting copyright are not | ||||
| used to limit the access or legal rights of the compilation's users | ||||
| beyond what the individual works permit.  Inclusion of a covered work | ||||
| in an aggregate does not cause this License to apply to the other | ||||
| parts of the aggregate. | ||||
|  | ||||
|   6. Conveying Non-Source Forms. | ||||
|  | ||||
|   You may convey a covered work in object code form under the terms | ||||
| of sections 4 and 5, provided that you also convey the | ||||
| machine-readable Corresponding Source under the terms of this License, | ||||
| in one of these ways: | ||||
|  | ||||
|     a) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by the | ||||
|     Corresponding Source fixed on a durable physical medium | ||||
|     customarily used for software interchange. | ||||
|  | ||||
|     b) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by a | ||||
|     written offer, valid for at least three years and valid for as | ||||
|     long as you offer spare parts or customer support for that product | ||||
|     model, to give anyone who possesses the object code either (1) a | ||||
|     copy of the Corresponding Source for all the software in the | ||||
|     product that is covered by this License, on a durable physical | ||||
|     medium customarily used for software interchange, for a price no | ||||
|     more than your reasonable cost of physically performing this | ||||
|     conveying of source, or (2) access to copy the | ||||
|     Corresponding Source from a network server at no charge. | ||||
|  | ||||
|     c) Convey individual copies of the object code with a copy of the | ||||
|     written offer to provide the Corresponding Source.  This | ||||
|     alternative is allowed only occasionally and noncommercially, and | ||||
|     only if you received the object code with such an offer, in accord | ||||
|     with subsection 6b. | ||||
|  | ||||
|     d) Convey the object code by offering access from a designated | ||||
|     place (gratis or for a charge), and offer equivalent access to the | ||||
|     Corresponding Source in the same way through the same place at no | ||||
|     further charge.  You need not require recipients to copy the | ||||
|     Corresponding Source along with the object code.  If the place to | ||||
|     copy the object code is a network server, the Corresponding Source | ||||
|     may be on a different server (operated by you or a third party) | ||||
|     that supports equivalent copying facilities, provided you maintain | ||||
|     clear directions next to the object code saying where to find the | ||||
|     Corresponding Source.  Regardless of what server hosts the | ||||
|     Corresponding Source, you remain obligated to ensure that it is | ||||
|     available for as long as needed to satisfy these requirements. | ||||
|  | ||||
|     e) Convey the object code using peer-to-peer transmission, provided | ||||
|     you inform other peers where the object code and Corresponding | ||||
|     Source of the work are being offered to the general public at no | ||||
|     charge under subsection 6d. | ||||
|  | ||||
|   A separable portion of the object code, whose source code is excluded | ||||
| from the Corresponding Source as a System Library, need not be | ||||
| included in conveying the object code work. | ||||
|  | ||||
|   A "User Product" is either (1) a "consumer product", which means any | ||||
| tangible personal property which is normally used for personal, family, | ||||
| or household purposes, or (2) anything designed or sold for incorporation | ||||
| into a dwelling.  In determining whether a product is a consumer product, | ||||
| doubtful cases shall be resolved in favor of coverage.  For a particular | ||||
| product received by a particular user, "normally used" refers to a | ||||
| typical or common use of that class of product, regardless of the status | ||||
| of the particular user or of the way in which the particular user | ||||
| actually uses, or expects or is expected to use, the product.  A product | ||||
| is a consumer product regardless of whether the product has substantial | ||||
| commercial, industrial or non-consumer uses, unless such uses represent | ||||
| the only significant mode of use of the product. | ||||
|  | ||||
|   "Installation Information" for a User Product means any methods, | ||||
| procedures, authorization keys, or other information required to install | ||||
| and execute modified versions of a covered work in that User Product from | ||||
| a modified version of its Corresponding Source.  The information must | ||||
| suffice to ensure that the continued functioning of the modified object | ||||
| code is in no case prevented or interfered with solely because | ||||
| modification has been made. | ||||
|  | ||||
|   If you convey an object code work under this section in, or with, or | ||||
| specifically for use in, a User Product, and the conveying occurs as | ||||
| part of a transaction in which the right of possession and use of the | ||||
| User Product is transferred to the recipient in perpetuity or for a | ||||
| fixed term (regardless of how the transaction is characterized), the | ||||
| Corresponding Source conveyed under this section must be accompanied | ||||
| by the Installation Information.  But this requirement does not apply | ||||
| if neither you nor any third party retains the ability to install | ||||
| modified object code on the User Product (for example, the work has | ||||
| been installed in ROM). | ||||
|  | ||||
|   The requirement to provide Installation Information does not include a | ||||
| requirement to continue to provide support service, warranty, or updates | ||||
| for a work that has been modified or installed by the recipient, or for | ||||
| the User Product in which it has been modified or installed.  Access to a | ||||
| network may be denied when the modification itself materially and | ||||
| adversely affects the operation of the network or violates the rules and | ||||
| protocols for communication across the network. | ||||
|  | ||||
|   Corresponding Source conveyed, and Installation Information provided, | ||||
| in accord with this section must be in a format that is publicly | ||||
| documented (and with an implementation available to the public in | ||||
| source code form), and must require no special password or key for | ||||
| unpacking, reading or copying. | ||||
|  | ||||
|   7. Additional Terms. | ||||
|  | ||||
|   "Additional permissions" are terms that supplement the terms of this | ||||
| License by making exceptions from one or more of its conditions. | ||||
| Additional permissions that are applicable to the entire Program shall | ||||
| be treated as though they were included in this License, to the extent | ||||
| that they are valid under applicable law.  If additional permissions | ||||
| apply only to part of the Program, that part may be used separately | ||||
| under those permissions, but the entire Program remains governed by | ||||
| this License without regard to the additional permissions. | ||||
|  | ||||
|   When you convey a copy of a covered work, you may at your option | ||||
| remove any additional permissions from that copy, or from any part of | ||||
| it.  (Additional permissions may be written to require their own | ||||
| removal in certain cases when you modify the work.)  You may place | ||||
| additional permissions on material, added by you to a covered work, | ||||
| for which you have or can give appropriate copyright permission. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, for material you | ||||
| add to a covered work, you may (if authorized by the copyright holders of | ||||
| that material) supplement the terms of this License with terms: | ||||
|  | ||||
|     a) Disclaiming warranty or limiting liability differently from the | ||||
|     terms of sections 15 and 16 of this License; or | ||||
|  | ||||
|     b) Requiring preservation of specified reasonable legal notices or | ||||
|     author attributions in that material or in the Appropriate Legal | ||||
|     Notices displayed by works containing it; or | ||||
|  | ||||
|     c) Prohibiting misrepresentation of the origin of that material, or | ||||
|     requiring that modified versions of such material be marked in | ||||
|     reasonable ways as different from the original version; or | ||||
|  | ||||
|     d) Limiting the use for publicity purposes of names of licensors or | ||||
|     authors of the material; or | ||||
|  | ||||
|     e) Declining to grant rights under trademark law for use of some | ||||
|     trade names, trademarks, or service marks; or | ||||
|  | ||||
|     f) Requiring indemnification of licensors and authors of that | ||||
|     material by anyone who conveys the material (or modified versions of | ||||
|     it) with contractual assumptions of liability to the recipient, for | ||||
|     any liability that these contractual assumptions directly impose on | ||||
|     those licensors and authors. | ||||
|  | ||||
|   All other non-permissive additional terms are considered "further | ||||
| restrictions" within the meaning of section 10.  If the Program as you | ||||
| received it, or any part of it, contains a notice stating that it is | ||||
| governed by this License along with a term that is a further | ||||
| restriction, you may remove that term.  If a license document contains | ||||
| a further restriction but permits relicensing or conveying under this | ||||
| License, you may add to a covered work material governed by the terms | ||||
| of that license document, provided that the further restriction does | ||||
| not survive such relicensing or conveying. | ||||
|  | ||||
|   If you add terms to a covered work in accord with this section, you | ||||
| must place, in the relevant source files, a statement of the | ||||
| additional terms that apply to those files, or a notice indicating | ||||
| where to find the applicable terms. | ||||
|  | ||||
|   Additional terms, permissive or non-permissive, may be stated in the | ||||
| form of a separately written license, or stated as exceptions; | ||||
| the above requirements apply either way. | ||||
|  | ||||
|   8. Termination. | ||||
|  | ||||
|   You may not propagate or modify a covered work except as expressly | ||||
| provided under this License.  Any attempt otherwise to propagate or | ||||
| modify it is void, and will automatically terminate your rights under | ||||
| this License (including any patent licenses granted under the third | ||||
| paragraph of section 11). | ||||
|  | ||||
|   However, if you cease all violation of this License, then your | ||||
| license from a particular copyright holder is reinstated (a) | ||||
| provisionally, unless and until the copyright holder explicitly and | ||||
| finally terminates your license, and (b) permanently, if the copyright | ||||
| holder fails to notify you of the violation by some reasonable means | ||||
| prior to 60 days after the cessation. | ||||
|  | ||||
|   Moreover, your license from a particular copyright holder is | ||||
| reinstated permanently if the copyright holder notifies you of the | ||||
| violation by some reasonable means, this is the first time you have | ||||
| received notice of violation of this License (for any work) from that | ||||
| copyright holder, and you cure the violation prior to 30 days after | ||||
| your receipt of the notice. | ||||
|  | ||||
|   Termination of your rights under this section does not terminate the | ||||
| licenses of parties who have received copies or rights from you under | ||||
| this License.  If your rights have been terminated and not permanently | ||||
| reinstated, you do not qualify to receive new licenses for the same | ||||
| material under section 10. | ||||
|  | ||||
|   9. Acceptance Not Required for Having Copies. | ||||
|  | ||||
|   You are not required to accept this License in order to receive or | ||||
| run a copy of the Program.  Ancillary propagation of a covered work | ||||
| occurring solely as a consequence of using peer-to-peer transmission | ||||
| to receive a copy likewise does not require acceptance.  However, | ||||
| nothing other than this License grants you permission to propagate or | ||||
| modify any covered work.  These actions infringe copyright if you do | ||||
| not accept this License.  Therefore, by modifying or propagating a | ||||
| covered work, you indicate your acceptance of this License to do so. | ||||
|  | ||||
|   10. Automatic Licensing of Downstream Recipients. | ||||
|  | ||||
|   Each time you convey a covered work, the recipient automatically | ||||
| receives a license from the original licensors, to run, modify and | ||||
| propagate that work, subject to this License.  You are not responsible | ||||
| for enforcing compliance by third parties with this License. | ||||
|  | ||||
|   An "entity transaction" is a transaction transferring control of an | ||||
| organization, or substantially all assets of one, or subdividing an | ||||
| organization, or merging organizations.  If propagation of a covered | ||||
| work results from an entity transaction, each party to that | ||||
| transaction who receives a copy of the work also receives whatever | ||||
| licenses to the work the party's predecessor in interest had or could | ||||
| give under the previous paragraph, plus a right to possession of the | ||||
| Corresponding Source of the work from the predecessor in interest, if | ||||
| the predecessor has it or can get it with reasonable efforts. | ||||
|  | ||||
|   You may not impose any further restrictions on the exercise of the | ||||
| rights granted or affirmed under this License.  For example, you may | ||||
| not impose a license fee, royalty, or other charge for exercise of | ||||
| rights granted under this License, and you may not initiate litigation | ||||
| (including a cross-claim or counterclaim in a lawsuit) alleging that | ||||
| any patent claim is infringed by making, using, selling, offering for | ||||
| sale, or importing the Program or any portion of it. | ||||
|  | ||||
|   11. Patents. | ||||
|  | ||||
|   A "contributor" is a copyright holder who authorizes use under this | ||||
| License of the Program or a work on which the Program is based.  The | ||||
| work thus licensed is called the contributor's "contributor version". | ||||
|  | ||||
|   A contributor's "essential patent claims" are all patent claims | ||||
| owned or controlled by the contributor, whether already acquired or | ||||
| hereafter acquired, that would be infringed by some manner, permitted | ||||
| by this License, of making, using, or selling its contributor version, | ||||
| but do not include claims that would be infringed only as a | ||||
| consequence of further modification of the contributor version.  For | ||||
| purposes of this definition, "control" includes the right to grant | ||||
| patent sublicenses in a manner consistent with the requirements of | ||||
| this License. | ||||
|  | ||||
|   Each contributor grants you a non-exclusive, worldwide, royalty-free | ||||
| patent license under the contributor's essential patent claims, to | ||||
| make, use, sell, offer for sale, import and otherwise run, modify and | ||||
| propagate the contents of its contributor version. | ||||
|  | ||||
|   In the following three paragraphs, a "patent license" is any express | ||||
| agreement or commitment, however denominated, not to enforce a patent | ||||
| (such as an express permission to practice a patent or covenant not to | ||||
| sue for patent infringement).  To "grant" such a patent license to a | ||||
| party means to make such an agreement or commitment not to enforce a | ||||
| patent against the party. | ||||
|  | ||||
|   If you convey a covered work, knowingly relying on a patent license, | ||||
| and the Corresponding Source of the work is not available for anyone | ||||
| to copy, free of charge and under the terms of this License, through a | ||||
| publicly available network server or other readily accessible means, | ||||
| then you must either (1) cause the Corresponding Source to be so | ||||
| available, or (2) arrange to deprive yourself of the benefit of the | ||||
| patent license for this particular work, or (3) arrange, in a manner | ||||
| consistent with the requirements of this License, to extend the patent | ||||
| license to downstream recipients.  "Knowingly relying" means you have | ||||
| actual knowledge that, but for the patent license, your conveying the | ||||
| covered work in a country, or your recipient's use of the covered work | ||||
| in a country, would infringe one or more identifiable patents in that | ||||
| country that you have reason to believe are valid. | ||||
|  | ||||
|   If, pursuant to or in connection with a single transaction or | ||||
| arrangement, you convey, or propagate by procuring conveyance of, a | ||||
| covered work, and grant a patent license to some of the parties | ||||
| receiving the covered work authorizing them to use, propagate, modify | ||||
| or convey a specific copy of the covered work, then the patent license | ||||
| you grant is automatically extended to all recipients of the covered | ||||
| work and works based on it. | ||||
|  | ||||
|   A patent license is "discriminatory" if it does not include within | ||||
| the scope of its coverage, prohibits the exercise of, or is | ||||
| conditioned on the non-exercise of one or more of the rights that are | ||||
| specifically granted under this License.  You may not convey a covered | ||||
| work if you are a party to an arrangement with a third party that is | ||||
| in the business of distributing software, under which you make payment | ||||
| to the third party based on the extent of your activity of conveying | ||||
| the work, and under which the third party grants, to any of the | ||||
| parties who would receive the covered work from you, a discriminatory | ||||
| patent license (a) in connection with copies of the covered work | ||||
| conveyed by you (or copies made from those copies), or (b) primarily | ||||
| for and in connection with specific products or compilations that | ||||
| contain the covered work, unless you entered into that arrangement, | ||||
| or that patent license was granted, prior to 28 March 2007. | ||||
|  | ||||
|   Nothing in this License shall be construed as excluding or limiting | ||||
| any implied license or other defenses to infringement that may | ||||
| otherwise be available to you under applicable patent law. | ||||
|  | ||||
|   12. No Surrender of Others' Freedom. | ||||
|  | ||||
|   If conditions are imposed on you (whether by court order, agreement or | ||||
| otherwise) that contradict the conditions of this License, they do not | ||||
| excuse you from the conditions of this License.  If you cannot convey a | ||||
| covered work so as to satisfy simultaneously your obligations under this | ||||
| License and any other pertinent obligations, then as a consequence you may | ||||
| not convey it at all.  For example, if you agree to terms that obligate you | ||||
| to collect a royalty for further conveying from those to whom you convey | ||||
| the Program, the only way you could satisfy both those terms and this | ||||
| License would be to refrain entirely from conveying the Program. | ||||
|  | ||||
|   13. Remote Network Interaction; Use with the GNU General Public License. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, if you modify the | ||||
| Program, your modified version must prominently offer all users | ||||
| interacting with it remotely through a computer network (if your version | ||||
| supports such interaction) an opportunity to receive the Corresponding | ||||
| Source of your version by providing access to the Corresponding Source | ||||
| from a network server at no charge, through some standard or customary | ||||
| means of facilitating copying of software.  This Corresponding Source | ||||
| shall include the Corresponding Source for any work covered by version 3 | ||||
| of the GNU General Public License that is incorporated pursuant to the | ||||
| following paragraph. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, you have | ||||
| permission to link or combine any covered work with a work licensed | ||||
| under version 3 of the GNU General Public License into a single | ||||
| combined work, and to convey the resulting work.  The terms of this | ||||
| License will continue to apply to the part which is the covered work, | ||||
| but the work with which it is combined will remain governed by version | ||||
| 3 of the GNU General Public License. | ||||
|  | ||||
|   14. Revised Versions of this License. | ||||
|  | ||||
|   The Free Software Foundation may publish revised and/or new versions of | ||||
| the GNU Affero General Public License from time to time.  Such new versions | ||||
| will be similar in spirit to the present version, but may differ in detail to | ||||
| address new problems or concerns. | ||||
|  | ||||
|   Each version is given a distinguishing version number.  If the | ||||
| Program specifies that a certain numbered version of the GNU Affero General | ||||
| Public License "or any later version" applies to it, you have the | ||||
| option of following the terms and conditions either of that numbered | ||||
| version or of any later version published by the Free Software | ||||
| Foundation.  If the Program does not specify a version number of the | ||||
| GNU Affero General Public License, you may choose any version ever published | ||||
| by the Free Software Foundation. | ||||
|  | ||||
|   If the Program specifies that a proxy can decide which future | ||||
| versions of the GNU Affero General Public License can be used, that proxy's | ||||
| public statement of acceptance of a version permanently authorizes you | ||||
| to choose that version for the Program. | ||||
|  | ||||
|   Later license versions may give you additional or different | ||||
| permissions.  However, no additional obligations are imposed on any | ||||
| author or copyright holder as a result of your choosing to follow a | ||||
| later version. | ||||
|  | ||||
|   15. Disclaimer of Warranty. | ||||
|  | ||||
|   THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY | ||||
| APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT | ||||
| HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY | ||||
| OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, | ||||
| THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||||
| PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM | ||||
| IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF | ||||
| ALL NECESSARY SERVICING, REPAIR OR CORRECTION. | ||||
|  | ||||
|   16. Limitation of Liability. | ||||
|  | ||||
|   IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS | ||||
| THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY | ||||
| GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE | ||||
| USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF | ||||
| DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD | ||||
| PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), | ||||
| EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF | ||||
| SUCH DAMAGES. | ||||
|  | ||||
|   17. Interpretation of Sections 15 and 16. | ||||
|  | ||||
|   If the disclaimer of warranty and limitation of liability provided | ||||
| above cannot be given local legal effect according to their terms, | ||||
| reviewing courts shall apply local law that most closely approximates | ||||
| an absolute waiver of all civil liability in connection with the | ||||
| Program, unless a warranty or assumption of liability accompanies a | ||||
| copy of the Program in return for a fee. | ||||
|  | ||||
|                      END OF TERMS AND CONDITIONS | ||||
|  | ||||
|             How to Apply These Terms to Your New Programs | ||||
|  | ||||
|   If you develop a new program, and you want it to be of the greatest | ||||
| possible use to the public, the best way to achieve this is to make it | ||||
| free software which everyone can redistribute and change under these terms. | ||||
|  | ||||
|   To do so, attach the following notices to the program.  It is safest | ||||
| to attach them to the start of each source file to most effectively | ||||
| state the exclusion of warranty; and each file should have at least | ||||
| the "copyright" line and a pointer to where the full notice is found. | ||||
|  | ||||
|     <one line to give the program's name and a brief idea of what it does.> | ||||
|     Copyright (C) <year>  <name of author> | ||||
|  | ||||
|     This program is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU Affero General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
|  | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU Affero General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU Affero General Public License | ||||
|     along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  | ||||
| Also add information on how to contact you by electronic and paper mail. | ||||
|  | ||||
|   If your software can interact with users remotely through a computer | ||||
| network, you should also make sure that it provides a way for users to | ||||
| get its source.  For example, if your program is a web application, its | ||||
| interface could display a "Source" link that leads users to an archive | ||||
| of the code.  There are many ways you could offer source, and different | ||||
| solutions will be better for different programs; see section 13 for the | ||||
| specific requirements. | ||||
|  | ||||
|   You should also get your employer (if you work as a programmer) or school, | ||||
| if any, to sign a "copyright disclaimer" for the program, if necessary. | ||||
| For more information on this, and how to apply and follow the GNU AGPL, see | ||||
| <http://www.gnu.org/licenses/>. | ||||
							
								
								
									
										159
									
								
								vendor/github.com/mattermost/platform/vendor/golang.org/x/crypto/blowfish/block.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										159
									
								
								vendor/github.com/mattermost/platform/vendor/golang.org/x/crypto/blowfish/block.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,159 @@ | ||||
| // Copyright 2010 The Go 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 blowfish | ||||
|  | ||||
| // getNextWord returns the next big-endian uint32 value from the byte slice | ||||
| // at the given position in a circular manner, updating the position. | ||||
| func getNextWord(b []byte, pos *int) uint32 { | ||||
| 	var w uint32 | ||||
| 	j := *pos | ||||
| 	for i := 0; i < 4; i++ { | ||||
| 		w = w<<8 | uint32(b[j]) | ||||
| 		j++ | ||||
| 		if j >= len(b) { | ||||
| 			j = 0 | ||||
| 		} | ||||
| 	} | ||||
| 	*pos = j | ||||
| 	return w | ||||
| } | ||||
|  | ||||
| // ExpandKey performs a key expansion on the given *Cipher. Specifically, it | ||||
| // performs the Blowfish algorithm's key schedule which sets up the *Cipher's | ||||
| // pi and substitution tables for calls to Encrypt. This is used, primarily, | ||||
| // by the bcrypt package to reuse the Blowfish key schedule during its | ||||
| // set up. It's unlikely that you need to use this directly. | ||||
| func ExpandKey(key []byte, c *Cipher) { | ||||
| 	j := 0 | ||||
| 	for i := 0; i < 18; i++ { | ||||
| 		// Using inlined getNextWord for performance. | ||||
| 		var d uint32 | ||||
| 		for k := 0; k < 4; k++ { | ||||
| 			d = d<<8 | uint32(key[j]) | ||||
| 			j++ | ||||
| 			if j >= len(key) { | ||||
| 				j = 0 | ||||
| 			} | ||||
| 		} | ||||
| 		c.p[i] ^= d | ||||
| 	} | ||||
|  | ||||
| 	var l, r uint32 | ||||
| 	for i := 0; i < 18; i += 2 { | ||||
| 		l, r = encryptBlock(l, r, c) | ||||
| 		c.p[i], c.p[i+1] = l, r | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < 256; i += 2 { | ||||
| 		l, r = encryptBlock(l, r, c) | ||||
| 		c.s0[i], c.s0[i+1] = l, r | ||||
| 	} | ||||
| 	for i := 0; i < 256; i += 2 { | ||||
| 		l, r = encryptBlock(l, r, c) | ||||
| 		c.s1[i], c.s1[i+1] = l, r | ||||
| 	} | ||||
| 	for i := 0; i < 256; i += 2 { | ||||
| 		l, r = encryptBlock(l, r, c) | ||||
| 		c.s2[i], c.s2[i+1] = l, r | ||||
| 	} | ||||
| 	for i := 0; i < 256; i += 2 { | ||||
| 		l, r = encryptBlock(l, r, c) | ||||
| 		c.s3[i], c.s3[i+1] = l, r | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // This is similar to ExpandKey, but folds the salt during the key | ||||
| // schedule. While ExpandKey is essentially expandKeyWithSalt with an all-zero | ||||
| // salt passed in, reusing ExpandKey turns out to be a place of inefficiency | ||||
| // and specializing it here is useful. | ||||
| func expandKeyWithSalt(key []byte, salt []byte, c *Cipher) { | ||||
| 	j := 0 | ||||
| 	for i := 0; i < 18; i++ { | ||||
| 		c.p[i] ^= getNextWord(key, &j) | ||||
| 	} | ||||
|  | ||||
| 	j = 0 | ||||
| 	var l, r uint32 | ||||
| 	for i := 0; i < 18; i += 2 { | ||||
| 		l ^= getNextWord(salt, &j) | ||||
| 		r ^= getNextWord(salt, &j) | ||||
| 		l, r = encryptBlock(l, r, c) | ||||
| 		c.p[i], c.p[i+1] = l, r | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < 256; i += 2 { | ||||
| 		l ^= getNextWord(salt, &j) | ||||
| 		r ^= getNextWord(salt, &j) | ||||
| 		l, r = encryptBlock(l, r, c) | ||||
| 		c.s0[i], c.s0[i+1] = l, r | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < 256; i += 2 { | ||||
| 		l ^= getNextWord(salt, &j) | ||||
| 		r ^= getNextWord(salt, &j) | ||||
| 		l, r = encryptBlock(l, r, c) | ||||
| 		c.s1[i], c.s1[i+1] = l, r | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < 256; i += 2 { | ||||
| 		l ^= getNextWord(salt, &j) | ||||
| 		r ^= getNextWord(salt, &j) | ||||
| 		l, r = encryptBlock(l, r, c) | ||||
| 		c.s2[i], c.s2[i+1] = l, r | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < 256; i += 2 { | ||||
| 		l ^= getNextWord(salt, &j) | ||||
| 		r ^= getNextWord(salt, &j) | ||||
| 		l, r = encryptBlock(l, r, c) | ||||
| 		c.s3[i], c.s3[i+1] = l, r | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func encryptBlock(l, r uint32, c *Cipher) (uint32, uint32) { | ||||
| 	xl, xr := l, r | ||||
| 	xl ^= c.p[0] | ||||
| 	xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[1] | ||||
| 	xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[2] | ||||
| 	xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[3] | ||||
| 	xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[4] | ||||
| 	xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[5] | ||||
| 	xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[6] | ||||
| 	xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[7] | ||||
| 	xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[8] | ||||
| 	xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[9] | ||||
| 	xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[10] | ||||
| 	xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[11] | ||||
| 	xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[12] | ||||
| 	xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[13] | ||||
| 	xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[14] | ||||
| 	xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[15] | ||||
| 	xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[16] | ||||
| 	xr ^= c.p[17] | ||||
| 	return xr, xl | ||||
| } | ||||
|  | ||||
| func decryptBlock(l, r uint32, c *Cipher) (uint32, uint32) { | ||||
| 	xl, xr := l, r | ||||
| 	xl ^= c.p[17] | ||||
| 	xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[16] | ||||
| 	xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[15] | ||||
| 	xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[14] | ||||
| 	xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[13] | ||||
| 	xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[12] | ||||
| 	xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[11] | ||||
| 	xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[10] | ||||
| 	xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[9] | ||||
| 	xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[8] | ||||
| 	xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[7] | ||||
| 	xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[6] | ||||
| 	xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[5] | ||||
| 	xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[4] | ||||
| 	xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[3] | ||||
| 	xr ^= ((c.s0[byte(xl>>24)] + c.s1[byte(xl>>16)]) ^ c.s2[byte(xl>>8)]) + c.s3[byte(xl)] ^ c.p[2] | ||||
| 	xl ^= ((c.s0[byte(xr>>24)] + c.s1[byte(xr>>16)]) ^ c.s2[byte(xr>>8)]) + c.s3[byte(xr)] ^ c.p[1] | ||||
| 	xr ^= c.p[0] | ||||
| 	return xr, xl | ||||
| } | ||||
							
								
								
									
										91
									
								
								vendor/github.com/mattermost/platform/vendor/golang.org/x/crypto/blowfish/cipher.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								vendor/github.com/mattermost/platform/vendor/golang.org/x/crypto/blowfish/cipher.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,91 @@ | ||||
| // Copyright 2010 The Go 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 blowfish implements Bruce Schneier's Blowfish encryption algorithm. | ||||
| package blowfish // import "golang.org/x/crypto/blowfish" | ||||
|  | ||||
| // The code is a port of Bruce Schneier's C implementation. | ||||
| // See http://www.schneier.com/blowfish.html. | ||||
|  | ||||
| import "strconv" | ||||
|  | ||||
| // The Blowfish block size in bytes. | ||||
| const BlockSize = 8 | ||||
|  | ||||
| // A Cipher is an instance of Blowfish encryption using a particular key. | ||||
| type Cipher struct { | ||||
| 	p              [18]uint32 | ||||
| 	s0, s1, s2, s3 [256]uint32 | ||||
| } | ||||
|  | ||||
| type KeySizeError int | ||||
|  | ||||
| func (k KeySizeError) Error() string { | ||||
| 	return "crypto/blowfish: invalid key size " + strconv.Itoa(int(k)) | ||||
| } | ||||
|  | ||||
| // NewCipher creates and returns a Cipher. | ||||
| // The key argument should be the Blowfish key, from 1 to 56 bytes. | ||||
| func NewCipher(key []byte) (*Cipher, error) { | ||||
| 	var result Cipher | ||||
| 	if k := len(key); k < 1 || k > 56 { | ||||
| 		return nil, KeySizeError(k) | ||||
| 	} | ||||
| 	initCipher(&result) | ||||
| 	ExpandKey(key, &result) | ||||
| 	return &result, nil | ||||
| } | ||||
|  | ||||
| // NewSaltedCipher creates a returns a Cipher that folds a salt into its key | ||||
| // schedule. For most purposes, NewCipher, instead of NewSaltedCipher, is | ||||
| // sufficient and desirable. For bcrypt compatibility, the key can be over 56 | ||||
| // bytes. | ||||
| func NewSaltedCipher(key, salt []byte) (*Cipher, error) { | ||||
| 	if len(salt) == 0 { | ||||
| 		return NewCipher(key) | ||||
| 	} | ||||
| 	var result Cipher | ||||
| 	if k := len(key); k < 1 { | ||||
| 		return nil, KeySizeError(k) | ||||
| 	} | ||||
| 	initCipher(&result) | ||||
| 	expandKeyWithSalt(key, salt, &result) | ||||
| 	return &result, nil | ||||
| } | ||||
|  | ||||
| // BlockSize returns the Blowfish block size, 8 bytes. | ||||
| // It is necessary to satisfy the Block interface in the | ||||
| // package "crypto/cipher". | ||||
| func (c *Cipher) BlockSize() int { return BlockSize } | ||||
|  | ||||
| // Encrypt encrypts the 8-byte buffer src using the key k | ||||
| // and stores the result in dst. | ||||
| // Note that for amounts of data larger than a block, | ||||
| // it is not safe to just call Encrypt on successive blocks; | ||||
| // instead, use an encryption mode like CBC (see crypto/cipher/cbc.go). | ||||
| func (c *Cipher) Encrypt(dst, src []byte) { | ||||
| 	l := uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3]) | ||||
| 	r := uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7]) | ||||
| 	l, r = encryptBlock(l, r, c) | ||||
| 	dst[0], dst[1], dst[2], dst[3] = byte(l>>24), byte(l>>16), byte(l>>8), byte(l) | ||||
| 	dst[4], dst[5], dst[6], dst[7] = byte(r>>24), byte(r>>16), byte(r>>8), byte(r) | ||||
| } | ||||
|  | ||||
| // Decrypt decrypts the 8-byte buffer src using the key k | ||||
| // and stores the result in dst. | ||||
| func (c *Cipher) Decrypt(dst, src []byte) { | ||||
| 	l := uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3]) | ||||
| 	r := uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7]) | ||||
| 	l, r = decryptBlock(l, r, c) | ||||
| 	dst[0], dst[1], dst[2], dst[3] = byte(l>>24), byte(l>>16), byte(l>>8), byte(l) | ||||
| 	dst[4], dst[5], dst[6], dst[7] = byte(r>>24), byte(r>>16), byte(r>>8), byte(r) | ||||
| } | ||||
|  | ||||
| func initCipher(c *Cipher) { | ||||
| 	copy(c.p[0:], p[0:]) | ||||
| 	copy(c.s0[0:], s0[0:]) | ||||
| 	copy(c.s1[0:], s1[0:]) | ||||
| 	copy(c.s2[0:], s2[0:]) | ||||
| 	copy(c.s3[0:], s3[0:]) | ||||
| } | ||||
							
								
								
									
										199
									
								
								vendor/github.com/mattermost/platform/vendor/golang.org/x/crypto/blowfish/const.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										199
									
								
								vendor/github.com/mattermost/platform/vendor/golang.org/x/crypto/blowfish/const.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,199 @@ | ||||
| // Copyright 2010 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| // The startup permutation array and substitution boxes. | ||||
| // They are the hexadecimal digits of PI; see: | ||||
| // http://www.schneier.com/code/constants.txt. | ||||
|  | ||||
| package blowfish | ||||
|  | ||||
| var s0 = [256]uint32{ | ||||
| 	0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, | ||||
| 	0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, | ||||
| 	0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658, | ||||
| 	0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, | ||||
| 	0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, | ||||
| 	0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, | ||||
| 	0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6, | ||||
| 	0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, | ||||
| 	0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, | ||||
| 	0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, | ||||
| 	0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1, | ||||
| 	0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, | ||||
| 	0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, | ||||
| 	0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, | ||||
| 	0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, | ||||
| 	0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, | ||||
| 	0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, | ||||
| 	0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, | ||||
| 	0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, | ||||
| 	0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, | ||||
| 	0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, | ||||
| 	0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, | ||||
| 	0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, | ||||
| 	0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, | ||||
| 	0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, | ||||
| 	0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, | ||||
| 	0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8, | ||||
| 	0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, | ||||
| 	0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, | ||||
| 	0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, | ||||
| 	0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0, | ||||
| 	0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, | ||||
| 	0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, | ||||
| 	0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, | ||||
| 	0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, | ||||
| 	0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, | ||||
| 	0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, | ||||
| 	0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, | ||||
| 	0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, | ||||
| 	0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, | ||||
| 	0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, | ||||
| 	0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, | ||||
| 	0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, | ||||
| } | ||||
|  | ||||
| var s1 = [256]uint32{ | ||||
| 	0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, | ||||
| 	0x9cee60b8, 0x8fedb266, 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, | ||||
| 	0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, | ||||
| 	0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, | ||||
| 	0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, | ||||
| 	0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, | ||||
| 	0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, | ||||
| 	0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, | ||||
| 	0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, | ||||
| 	0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, | ||||
| 	0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, | ||||
| 	0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, | ||||
| 	0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, | ||||
| 	0x501adde6, 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, | ||||
| 	0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, | ||||
| 	0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, | ||||
| 	0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, | ||||
| 	0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, | ||||
| 	0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, | ||||
| 	0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, | ||||
| 	0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, | ||||
| 	0x1939260f, 0x19c27960, 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, | ||||
| 	0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, | ||||
| 	0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, | ||||
| 	0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, | ||||
| 	0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, | ||||
| 	0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, | ||||
| 	0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, | ||||
| 	0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, | ||||
| 	0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, | ||||
| 	0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, | ||||
| 	0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, | ||||
| 	0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, | ||||
| 	0xdb6c4f15, 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, | ||||
| 	0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, | ||||
| 	0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, | ||||
| 	0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, | ||||
| 	0x1dadf43e, 0x233f7061, 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, | ||||
| 	0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, | ||||
| 	0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, | ||||
| 	0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, | ||||
| 	0x675fda79, 0xe3674340, 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, | ||||
| 	0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7, | ||||
| } | ||||
|  | ||||
| var s2 = [256]uint32{ | ||||
| 	0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, | ||||
| 	0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, | ||||
| 	0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, | ||||
| 	0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, | ||||
| 	0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, | ||||
| 	0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, | ||||
| 	0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, | ||||
| 	0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, | ||||
| 	0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, | ||||
| 	0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, | ||||
| 	0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 0x55a867bc, 0xa1159a58, | ||||
| 	0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, | ||||
| 	0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, | ||||
| 	0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, | ||||
| 	0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 0x257b7834, 0x602a9c60, | ||||
| 	0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, | ||||
| 	0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, | ||||
| 	0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, | ||||
| 	0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, 0x992eff74, | ||||
| 	0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, | ||||
| 	0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, | ||||
| 	0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, | ||||
| 	0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, | ||||
| 	0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, | ||||
| 	0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, | ||||
| 	0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, | ||||
| 	0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, | ||||
| 	0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, | ||||
| 	0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, | ||||
| 	0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, | ||||
| 	0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, | ||||
| 	0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, | ||||
| 	0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, | ||||
| 	0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, | ||||
| 	0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, 0xdcb7da83, 0x573906fe, | ||||
| 	0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, | ||||
| 	0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, | ||||
| 	0x006058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, | ||||
| 	0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, 0x4b7c0188, | ||||
| 	0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, | ||||
| 	0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, | ||||
| 	0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, | ||||
| 	0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0, | ||||
| } | ||||
|  | ||||
| var s3 = [256]uint32{ | ||||
| 	0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, | ||||
| 	0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, | ||||
| 	0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79, | ||||
| 	0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, | ||||
| 	0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, | ||||
| 	0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, | ||||
| 	0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, | ||||
| 	0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, | ||||
| 	0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, | ||||
| 	0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, | ||||
| 	0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, | ||||
| 	0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, | ||||
| 	0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, | ||||
| 	0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, | ||||
| 	0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5, | ||||
| 	0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, | ||||
| 	0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, | ||||
| 	0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, | ||||
| 	0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd, | ||||
| 	0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, | ||||
| 	0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, | ||||
| 	0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, | ||||
| 	0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc, | ||||
| 	0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, | ||||
| 	0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, | ||||
| 	0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, | ||||
| 	0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, | ||||
| 	0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, | ||||
| 	0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, | ||||
| 	0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, | ||||
| 	0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, | ||||
| 	0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, | ||||
| 	0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, | ||||
| 	0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, | ||||
| 	0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623, | ||||
| 	0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, | ||||
| 	0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, | ||||
| 	0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, | ||||
| 	0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3, | ||||
| 	0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, | ||||
| 	0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, | ||||
| 	0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, | ||||
| 	0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6, | ||||
| } | ||||
|  | ||||
| var p = [18]uint32{ | ||||
| 	0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, | ||||
| 	0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, | ||||
| 	0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b, | ||||
| } | ||||
							
								
								
									
										897
									
								
								vendor/github.com/mattermost/platform/vendor/gopkg.in/yaml.v2/LICENSE.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										897
									
								
								vendor/github.com/mattermost/platform/vendor/gopkg.in/yaml.v2/LICENSE.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,897 @@ | ||||
| Mattermost Licensing | ||||
|  | ||||
| SOFTWARE LICENSING  | ||||
|  | ||||
| You are licensed to use compiled versions of the Mattermost platform produced by Mattermost, Inc. under an MIT LICENSE  | ||||
|  | ||||
| -	See MIT-COMPILED-LICENSE.md included in compiled versions for details | ||||
|  | ||||
| You may be licensed to use source code to create compiled versions not produced by Mattermost, Inc. in one of two ways: | ||||
|  | ||||
| 1. Under the Free Software Foundation’s GNU AGPL v.3.0, subject to the exceptions outlined in this policy; or  | ||||
| 2. Under a commercial license available from Mattermost, Inc. by contacting commercial@mattermost.com  | ||||
|  | ||||
| You are licensed to use the source code in Admin Tools and Configuration Files (templates/, config/, model/,  | ||||
| webapp/client, webapp/fonts, webapp/i18n, webapp/images and all subdirectories thereof) under the Apache License v2.0. | ||||
|  | ||||
| We promise that we will not enforce the copyleft provisions in AGPL v3.0 against you if your application (a) does not  | ||||
| link to the Mattermost Platform directly, but exclusively uses the Mattermost Admin Tools and Configuration Files, and | ||||
| (b) you have not modified, added to or adapted the source code of Mattermost in a way that results in the creation of  | ||||
| a “modified version” or “work based on” Mattermost as these terms are defined in the AGPL v3.0 license. | ||||
|  | ||||
| MATTERMOST TRADEMARK GUIDELINES | ||||
|  | ||||
| Your use of the mark Mattermost is subject to Mattermost, Inc's prior written approval and our organization’s Trademark  | ||||
| Standards of Use at http://www.mattermost.org/trademark-standards-of-use/. For trademark approval or any questions  | ||||
| you have about using these trademarks, please email trademark@mattermost.com  | ||||
|  | ||||
| ------------------------------------------------------------------------------------------------------------------------------ | ||||
|                                 | ||||
|                                Apache License | ||||
|                            Version 2.0, January 2004 | ||||
|                         http://www.apache.org/licenses/ | ||||
|  | ||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||||
|  | ||||
|    1. Definitions. | ||||
|  | ||||
|       "License" shall mean the terms and conditions for use, reproduction, | ||||
|       and distribution as defined by Sections 1 through 9 of this document. | ||||
|  | ||||
|       "Licensor" shall mean the copyright owner or entity authorized by | ||||
|       the copyright owner that is granting the License. | ||||
|  | ||||
|       "Legal Entity" shall mean the union of the acting entity and all | ||||
|       other entities that control, are controlled by, or are under common | ||||
|       control with that entity. For the purposes of this definition, | ||||
|       "control" means (i) the power, direct or indirect, to cause the | ||||
|       direction or management of such entity, whether by contract or | ||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||||
|       outstanding shares, or (iii) beneficial ownership of such entity. | ||||
|  | ||||
|       "You" (or "Your") shall mean an individual or Legal Entity | ||||
|       exercising permissions granted by this License. | ||||
|  | ||||
|       "Source" form shall mean the preferred form for making modifications, | ||||
|       including but not limited to software source code, documentation | ||||
|       source, and configuration files. | ||||
|  | ||||
|       "Object" form shall mean any form resulting from mechanical | ||||
|       transformation or translation of a Source form, including but | ||||
|       not limited to compiled object code, generated documentation, | ||||
|       and conversions to other media types. | ||||
|  | ||||
|       "Work" shall mean the work of authorship, whether in Source or | ||||
|       Object form, made available under the License, as indicated by a | ||||
|       copyright notice that is included in or attached to the work | ||||
|       (an example is provided in the Appendix below). | ||||
|  | ||||
|       "Derivative Works" shall mean any work, whether in Source or Object | ||||
|       form, that is based on (or derived from) the Work and for which the | ||||
|       editorial revisions, annotations, elaborations, or other modifications | ||||
|       represent, as a whole, an original work of authorship. For the purposes | ||||
|       of this License, Derivative Works shall not include works that remain | ||||
|       separable from, or merely link (or bind by name) to the interfaces of, | ||||
|       the Work and Derivative Works thereof. | ||||
|  | ||||
|       "Contribution" shall mean any work of authorship, including | ||||
|       the original version of the Work and any modifications or additions | ||||
|       to that Work or Derivative Works thereof, that is intentionally | ||||
|       submitted to Licensor for inclusion in the Work by the copyright owner | ||||
|       or by an individual or Legal Entity authorized to submit on behalf of | ||||
|       the copyright owner. For the purposes of this definition, "submitted" | ||||
|       means any form of electronic, verbal, or written communication sent | ||||
|       to the Licensor or its representatives, including but not limited to | ||||
|       communication on electronic mailing lists, source code control systems, | ||||
|       and issue tracking systems that are managed by, or on behalf of, the | ||||
|       Licensor for the purpose of discussing and improving the Work, but | ||||
|       excluding communication that is conspicuously marked or otherwise | ||||
|       designated in writing by the copyright owner as "Not a Contribution." | ||||
|  | ||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity | ||||
|       on behalf of whom a Contribution has been received by Licensor and | ||||
|       subsequently incorporated within the Work. | ||||
|  | ||||
|    2. Grant of Copyright License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       copyright license to reproduce, prepare Derivative Works of, | ||||
|       publicly display, publicly perform, sublicense, and distribute the | ||||
|       Work and such Derivative Works in Source or Object form. | ||||
|  | ||||
|    3. Grant of Patent License. Subject to the terms and conditions of | ||||
|       this License, each Contributor hereby grants to You a perpetual, | ||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||||
|       (except as stated in this section) patent license to make, have made, | ||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, | ||||
|       where such license applies only to those patent claims licensable | ||||
|       by such Contributor that are necessarily infringed by their | ||||
|       Contribution(s) alone or by combination of their Contribution(s) | ||||
|       with the Work to which such Contribution(s) was submitted. If You | ||||
|       institute patent litigation against any entity (including a | ||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work | ||||
|       or a Contribution incorporated within the Work constitutes direct | ||||
|       or contributory patent infringement, then any patent licenses | ||||
|       granted to You under this License for that Work shall terminate | ||||
|       as of the date such litigation is filed. | ||||
|  | ||||
|    4. Redistribution. You may reproduce and distribute copies of the | ||||
|       Work or Derivative Works thereof in any medium, with or without | ||||
|       modifications, and in Source or Object form, provided that You | ||||
|       meet the following conditions: | ||||
|  | ||||
|       (a) You must give any other recipients of the Work or | ||||
|           Derivative Works a copy of this License; and | ||||
|  | ||||
|       (b) You must cause any modified files to carry prominent notices | ||||
|           stating that You changed the files; and | ||||
|  | ||||
|       (c) You must retain, in the Source form of any Derivative Works | ||||
|           that You distribute, all copyright, patent, trademark, and | ||||
|           attribution notices from the Source form of the Work, | ||||
|           excluding those notices that do not pertain to any part of | ||||
|           the Derivative Works; and | ||||
|  | ||||
|       (d) If the Work includes a "NOTICE" text file as part of its | ||||
|           distribution, then any Derivative Works that You distribute must | ||||
|           include a readable copy of the attribution notices contained | ||||
|           within such NOTICE file, excluding those notices that do not | ||||
|           pertain to any part of the Derivative Works, in at least one | ||||
|           of the following places: within a NOTICE text file distributed | ||||
|           as part of the Derivative Works; within the Source form or | ||||
|           documentation, if provided along with the Derivative Works; or, | ||||
|           within a display generated by the Derivative Works, if and | ||||
|           wherever such third-party notices normally appear. The contents | ||||
|           of the NOTICE file are for informational purposes only and | ||||
|           do not modify the License. You may add Your own attribution | ||||
|           notices within Derivative Works that You distribute, alongside | ||||
|           or as an addendum to the NOTICE text from the Work, provided | ||||
|           that such additional attribution notices cannot be construed | ||||
|           as modifying the License. | ||||
|  | ||||
|       You may add Your own copyright statement to Your modifications and | ||||
|       may provide additional or different license terms and conditions | ||||
|       for use, reproduction, or distribution of Your modifications, or | ||||
|       for any such Derivative Works as a whole, provided Your use, | ||||
|       reproduction, and distribution of the Work otherwise complies with | ||||
|       the conditions stated in this License. | ||||
|  | ||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, | ||||
|       any Contribution intentionally submitted for inclusion in the Work | ||||
|       by You to the Licensor shall be under the terms and conditions of | ||||
|       this License, without any additional terms or conditions. | ||||
|       Notwithstanding the above, nothing herein shall supersede or modify | ||||
|       the terms of any separate license agreement you may have executed | ||||
|       with Licensor regarding such Contributions. | ||||
|  | ||||
|    6. Trademarks. This License does not grant permission to use the trade | ||||
|       names, trademarks, service marks, or product names of the Licensor, | ||||
|       except as required for reasonable and customary use in describing the | ||||
|       origin of the Work and reproducing the content of the NOTICE file. | ||||
|  | ||||
|    7. Disclaimer of Warranty. Unless required by applicable law or | ||||
|       agreed to in writing, Licensor provides the Work (and each | ||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, | ||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||||
|       implied, including, without limitation, any warranties or conditions | ||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the | ||||
|       appropriateness of using or redistributing the Work and assume any | ||||
|       risks associated with Your exercise of permissions under this License. | ||||
|  | ||||
|    8. Limitation of Liability. In no event and under no legal theory, | ||||
|       whether in tort (including negligence), contract, or otherwise, | ||||
|       unless required by applicable law (such as deliberate and grossly | ||||
|       negligent acts) or agreed to in writing, shall any Contributor be | ||||
|       liable to You for damages, including any direct, indirect, special, | ||||
|       incidental, or consequential damages of any character arising as a | ||||
|       result of this License or out of the use or inability to use the | ||||
|       Work (including but not limited to damages for loss of goodwill, | ||||
|       work stoppage, computer failure or malfunction, or any and all | ||||
|       other commercial damages or losses), even if such Contributor | ||||
|       has been advised of the possibility of such damages. | ||||
|  | ||||
|    9. Accepting Warranty or Additional Liability. While redistributing | ||||
|       the Work or Derivative Works thereof, You may choose to offer, | ||||
|       and charge a fee for, acceptance of support, warranty, indemnity, | ||||
|       or other liability obligations and/or rights consistent with this | ||||
|       License. However, in accepting such obligations, You may act only | ||||
|       on Your own behalf and on Your sole responsibility, not on behalf | ||||
|       of any other Contributor, and only if You agree to indemnify, | ||||
|       defend, and hold each Contributor harmless for any liability | ||||
|       incurred by, or claims asserted against, such Contributor by reason | ||||
|       of your accepting any such warranty or additional liability. | ||||
|  | ||||
|    END OF TERMS AND CONDITIONS | ||||
|  | ||||
|    APPENDIX: How to apply the Apache License to your work. | ||||
|  | ||||
|       To apply the Apache License to your work, attach the following | ||||
|       boilerplate notice, with the fields enclosed by brackets "[]" | ||||
|       replaced with your own identifying information. (Don't include | ||||
|       the brackets!)  The text should be enclosed in the appropriate | ||||
|       comment syntax for the file format. We also recommend that a | ||||
|       file or class name and description of purpose be included on the | ||||
|       same "printed page" as the copyright notice for easier | ||||
|       identification within third-party archives. | ||||
|  | ||||
|    Copyright [yyyy] [name of copyright owner] | ||||
|  | ||||
|    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. | ||||
|  | ||||
| ------------------------------------------------------------------------------ | ||||
|  | ||||
| The software is released under the terms of the GNU Affero General Public | ||||
| License, version 3. | ||||
|  | ||||
|                     GNU AFFERO GENERAL PUBLIC LICENSE | ||||
|                        Version 3, 19 November 2007 | ||||
|  | ||||
|  Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | ||||
|  Everyone is permitted to copy and distribute verbatim copies | ||||
|  of this license document, but changing it is not allowed. | ||||
|  | ||||
|                             Preamble | ||||
|  | ||||
|   The GNU Affero General Public License is a free, copyleft license for | ||||
| software and other kinds of works, specifically designed to ensure | ||||
| cooperation with the community in the case of network server software. | ||||
|  | ||||
|   The licenses for most software and other practical works are designed | ||||
| to take away your freedom to share and change the works.  By contrast, | ||||
| our General Public Licenses are intended to guarantee your freedom to | ||||
| share and change all versions of a program--to make sure it remains free | ||||
| software for all its users. | ||||
|  | ||||
|   When we speak of free software, we are referring to freedom, not | ||||
| price.  Our General Public Licenses are designed to make sure that you | ||||
| have the freedom to distribute copies of free software (and charge for | ||||
| them if you wish), that you receive source code or can get it if you | ||||
| want it, that you can change the software or use pieces of it in new | ||||
| free programs, and that you know you can do these things. | ||||
|  | ||||
|   Developers that use our General Public Licenses protect your rights | ||||
| with two steps: (1) assert copyright on the software, and (2) offer | ||||
| you this License which gives you legal permission to copy, distribute | ||||
| and/or modify the software. | ||||
|  | ||||
|   A secondary benefit of defending all users' freedom is that | ||||
| improvements made in alternate versions of the program, if they | ||||
| receive widespread use, become available for other developers to | ||||
| incorporate.  Many developers of free software are heartened and | ||||
| encouraged by the resulting cooperation.  However, in the case of | ||||
| software used on network servers, this result may fail to come about. | ||||
| The GNU General Public License permits making a modified version and | ||||
| letting the public access it on a server without ever releasing its | ||||
| source code to the public. | ||||
|  | ||||
|   The GNU Affero General Public License is designed specifically to | ||||
| ensure that, in such cases, the modified source code becomes available | ||||
| to the community.  It requires the operator of a network server to | ||||
| provide the source code of the modified version running there to the | ||||
| users of that server.  Therefore, public use of a modified version, on | ||||
| a publicly accessible server, gives the public access to the source | ||||
| code of the modified version. | ||||
|  | ||||
|   An older license, called the Affero General Public License and | ||||
| published by Affero, was designed to accomplish similar goals.  This is | ||||
| a different license, not a version of the Affero GPL, but Affero has | ||||
| released a new version of the Affero GPL which permits relicensing under | ||||
| this license. | ||||
|  | ||||
|   The precise terms and conditions for copying, distribution and | ||||
| modification follow. | ||||
|  | ||||
|                        TERMS AND CONDITIONS | ||||
|  | ||||
|   0. Definitions. | ||||
|  | ||||
|   "This License" refers to version 3 of the GNU Affero General Public License. | ||||
|  | ||||
|   "Copyright" also means copyright-like laws that apply to other kinds of | ||||
| works, such as semiconductor masks. | ||||
|  | ||||
|   "The Program" refers to any copyrightable work licensed under this | ||||
| License.  Each licensee is addressed as "you".  "Licensees" and | ||||
| "recipients" may be individuals or organizations. | ||||
|  | ||||
|   To "modify" a work means to copy from or adapt all or part of the work | ||||
| in a fashion requiring copyright permission, other than the making of an | ||||
| exact copy.  The resulting work is called a "modified version" of the | ||||
| earlier work or a work "based on" the earlier work. | ||||
|  | ||||
|   A "covered work" means either the unmodified Program or a work based | ||||
| on the Program. | ||||
|  | ||||
|   To "propagate" a work means to do anything with it that, without | ||||
| permission, would make you directly or secondarily liable for | ||||
| infringement under applicable copyright law, except executing it on a | ||||
| computer or modifying a private copy.  Propagation includes copying, | ||||
| distribution (with or without modification), making available to the | ||||
| public, and in some countries other activities as well. | ||||
|  | ||||
|   To "convey" a work means any kind of propagation that enables other | ||||
| parties to make or receive copies.  Mere interaction with a user through | ||||
| a computer network, with no transfer of a copy, is not conveying. | ||||
|  | ||||
|   An interactive user interface displays "Appropriate Legal Notices" | ||||
| to the extent that it includes a convenient and prominently visible | ||||
| feature that (1) displays an appropriate copyright notice, and (2) | ||||
| tells the user that there is no warranty for the work (except to the | ||||
| extent that warranties are provided), that licensees may convey the | ||||
| work under this License, and how to view a copy of this License.  If | ||||
| the interface presents a list of user commands or options, such as a | ||||
| menu, a prominent item in the list meets this criterion. | ||||
|  | ||||
|   1. Source Code. | ||||
|  | ||||
|   The "source code" for a work means the preferred form of the work | ||||
| for making modifications to it.  "Object code" means any non-source | ||||
| form of a work. | ||||
|  | ||||
|   A "Standard Interface" means an interface that either is an official | ||||
| standard defined by a recognized standards body, or, in the case of | ||||
| interfaces specified for a particular programming language, one that | ||||
| is widely used among developers working in that language. | ||||
|  | ||||
|   The "System Libraries" of an executable work include anything, other | ||||
| than the work as a whole, that (a) is included in the normal form of | ||||
| packaging a Major Component, but which is not part of that Major | ||||
| Component, and (b) serves only to enable use of the work with that | ||||
| Major Component, or to implement a Standard Interface for which an | ||||
| implementation is available to the public in source code form.  A | ||||
| "Major Component", in this context, means a major essential component | ||||
| (kernel, window system, and so on) of the specific operating system | ||||
| (if any) on which the executable work runs, or a compiler used to | ||||
| produce the work, or an object code interpreter used to run it. | ||||
|  | ||||
|   The "Corresponding Source" for a work in object code form means all | ||||
| the source code needed to generate, install, and (for an executable | ||||
| work) run the object code and to modify the work, including scripts to | ||||
| control those activities.  However, it does not include the work's | ||||
| System Libraries, or general-purpose tools or generally available free | ||||
| programs which are used unmodified in performing those activities but | ||||
| which are not part of the work.  For example, Corresponding Source | ||||
| includes interface definition files associated with source files for | ||||
| the work, and the source code for shared libraries and dynamically | ||||
| linked subprograms that the work is specifically designed to require, | ||||
| such as by intimate data communication or control flow between those | ||||
| subprograms and other parts of the work. | ||||
|  | ||||
|   The Corresponding Source need not include anything that users | ||||
| can regenerate automatically from other parts of the Corresponding | ||||
| Source. | ||||
|  | ||||
|   The Corresponding Source for a work in source code form is that | ||||
| same work. | ||||
|  | ||||
|   2. Basic Permissions. | ||||
|  | ||||
|   All rights granted under this License are granted for the term of | ||||
| copyright on the Program, and are irrevocable provided the stated | ||||
| conditions are met.  This License explicitly affirms your unlimited | ||||
| permission to run the unmodified Program.  The output from running a | ||||
| covered work is covered by this License only if the output, given its | ||||
| content, constitutes a covered work.  This License acknowledges your | ||||
| rights of fair use or other equivalent, as provided by copyright law. | ||||
|  | ||||
|   You may make, run and propagate covered works that you do not | ||||
| convey, without conditions so long as your license otherwise remains | ||||
| in force.  You may convey covered works to others for the sole purpose | ||||
| of having them make modifications exclusively for you, or provide you | ||||
| with facilities for running those works, provided that you comply with | ||||
| the terms of this License in conveying all material for which you do | ||||
| not control copyright.  Those thus making or running the covered works | ||||
| for you must do so exclusively on your behalf, under your direction | ||||
| and control, on terms that prohibit them from making any copies of | ||||
| your copyrighted material outside their relationship with you. | ||||
|  | ||||
|   Conveying under any other circumstances is permitted solely under | ||||
| the conditions stated below.  Sublicensing is not allowed; section 10 | ||||
| makes it unnecessary. | ||||
|  | ||||
|   3. Protecting Users' Legal Rights From Anti-Circumvention Law. | ||||
|  | ||||
|   No covered work shall be deemed part of an effective technological | ||||
| measure under any applicable law fulfilling obligations under article | ||||
| 11 of the WIPO copyright treaty adopted on 20 December 1996, or | ||||
| similar laws prohibiting or restricting circumvention of such | ||||
| measures. | ||||
|  | ||||
|   When you convey a covered work, you waive any legal power to forbid | ||||
| circumvention of technological measures to the extent such circumvention | ||||
| is effected by exercising rights under this License with respect to | ||||
| the covered work, and you disclaim any intention to limit operation or | ||||
| modification of the work as a means of enforcing, against the work's | ||||
| users, your or third parties' legal rights to forbid circumvention of | ||||
| technological measures. | ||||
|  | ||||
|   4. Conveying Verbatim Copies. | ||||
|  | ||||
|   You may convey verbatim copies of the Program's source code as you | ||||
| receive it, in any medium, provided that you conspicuously and | ||||
| appropriately publish on each copy an appropriate copyright notice; | ||||
| keep intact all notices stating that this License and any | ||||
| non-permissive terms added in accord with section 7 apply to the code; | ||||
| keep intact all notices of the absence of any warranty; and give all | ||||
| recipients a copy of this License along with the Program. | ||||
|  | ||||
|   You may charge any price or no price for each copy that you convey, | ||||
| and you may offer support or warranty protection for a fee. | ||||
|  | ||||
|   5. Conveying Modified Source Versions. | ||||
|  | ||||
|   You may convey a work based on the Program, or the modifications to | ||||
| produce it from the Program, in the form of source code under the | ||||
| terms of section 4, provided that you also meet all of these conditions: | ||||
|  | ||||
|     a) The work must carry prominent notices stating that you modified | ||||
|     it, and giving a relevant date. | ||||
|  | ||||
|     b) The work must carry prominent notices stating that it is | ||||
|     released under this License and any conditions added under section | ||||
|     7.  This requirement modifies the requirement in section 4 to | ||||
|     "keep intact all notices". | ||||
|  | ||||
|     c) You must license the entire work, as a whole, under this | ||||
|     License to anyone who comes into possession of a copy.  This | ||||
|     License will therefore apply, along with any applicable section 7 | ||||
|     additional terms, to the whole of the work, and all its parts, | ||||
|     regardless of how they are packaged.  This License gives no | ||||
|     permission to license the work in any other way, but it does not | ||||
|     invalidate such permission if you have separately received it. | ||||
|  | ||||
|     d) If the work has interactive user interfaces, each must display | ||||
|     Appropriate Legal Notices; however, if the Program has interactive | ||||
|     interfaces that do not display Appropriate Legal Notices, your | ||||
|     work need not make them do so. | ||||
|  | ||||
|   A compilation of a covered work with other separate and independent | ||||
| works, which are not by their nature extensions of the covered work, | ||||
| and which are not combined with it such as to form a larger program, | ||||
| in or on a volume of a storage or distribution medium, is called an | ||||
| "aggregate" if the compilation and its resulting copyright are not | ||||
| used to limit the access or legal rights of the compilation's users | ||||
| beyond what the individual works permit.  Inclusion of a covered work | ||||
| in an aggregate does not cause this License to apply to the other | ||||
| parts of the aggregate. | ||||
|  | ||||
|   6. Conveying Non-Source Forms. | ||||
|  | ||||
|   You may convey a covered work in object code form under the terms | ||||
| of sections 4 and 5, provided that you also convey the | ||||
| machine-readable Corresponding Source under the terms of this License, | ||||
| in one of these ways: | ||||
|  | ||||
|     a) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by the | ||||
|     Corresponding Source fixed on a durable physical medium | ||||
|     customarily used for software interchange. | ||||
|  | ||||
|     b) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by a | ||||
|     written offer, valid for at least three years and valid for as | ||||
|     long as you offer spare parts or customer support for that product | ||||
|     model, to give anyone who possesses the object code either (1) a | ||||
|     copy of the Corresponding Source for all the software in the | ||||
|     product that is covered by this License, on a durable physical | ||||
|     medium customarily used for software interchange, for a price no | ||||
|     more than your reasonable cost of physically performing this | ||||
|     conveying of source, or (2) access to copy the | ||||
|     Corresponding Source from a network server at no charge. | ||||
|  | ||||
|     c) Convey individual copies of the object code with a copy of the | ||||
|     written offer to provide the Corresponding Source.  This | ||||
|     alternative is allowed only occasionally and noncommercially, and | ||||
|     only if you received the object code with such an offer, in accord | ||||
|     with subsection 6b. | ||||
|  | ||||
|     d) Convey the object code by offering access from a designated | ||||
|     place (gratis or for a charge), and offer equivalent access to the | ||||
|     Corresponding Source in the same way through the same place at no | ||||
|     further charge.  You need not require recipients to copy the | ||||
|     Corresponding Source along with the object code.  If the place to | ||||
|     copy the object code is a network server, the Corresponding Source | ||||
|     may be on a different server (operated by you or a third party) | ||||
|     that supports equivalent copying facilities, provided you maintain | ||||
|     clear directions next to the object code saying where to find the | ||||
|     Corresponding Source.  Regardless of what server hosts the | ||||
|     Corresponding Source, you remain obligated to ensure that it is | ||||
|     available for as long as needed to satisfy these requirements. | ||||
|  | ||||
|     e) Convey the object code using peer-to-peer transmission, provided | ||||
|     you inform other peers where the object code and Corresponding | ||||
|     Source of the work are being offered to the general public at no | ||||
|     charge under subsection 6d. | ||||
|  | ||||
|   A separable portion of the object code, whose source code is excluded | ||||
| from the Corresponding Source as a System Library, need not be | ||||
| included in conveying the object code work. | ||||
|  | ||||
|   A "User Product" is either (1) a "consumer product", which means any | ||||
| tangible personal property which is normally used for personal, family, | ||||
| or household purposes, or (2) anything designed or sold for incorporation | ||||
| into a dwelling.  In determining whether a product is a consumer product, | ||||
| doubtful cases shall be resolved in favor of coverage.  For a particular | ||||
| product received by a particular user, "normally used" refers to a | ||||
| typical or common use of that class of product, regardless of the status | ||||
| of the particular user or of the way in which the particular user | ||||
| actually uses, or expects or is expected to use, the product.  A product | ||||
| is a consumer product regardless of whether the product has substantial | ||||
| commercial, industrial or non-consumer uses, unless such uses represent | ||||
| the only significant mode of use of the product. | ||||
|  | ||||
|   "Installation Information" for a User Product means any methods, | ||||
| procedures, authorization keys, or other information required to install | ||||
| and execute modified versions of a covered work in that User Product from | ||||
| a modified version of its Corresponding Source.  The information must | ||||
| suffice to ensure that the continued functioning of the modified object | ||||
| code is in no case prevented or interfered with solely because | ||||
| modification has been made. | ||||
|  | ||||
|   If you convey an object code work under this section in, or with, or | ||||
| specifically for use in, a User Product, and the conveying occurs as | ||||
| part of a transaction in which the right of possession and use of the | ||||
| User Product is transferred to the recipient in perpetuity or for a | ||||
| fixed term (regardless of how the transaction is characterized), the | ||||
| Corresponding Source conveyed under this section must be accompanied | ||||
| by the Installation Information.  But this requirement does not apply | ||||
| if neither you nor any third party retains the ability to install | ||||
| modified object code on the User Product (for example, the work has | ||||
| been installed in ROM). | ||||
|  | ||||
|   The requirement to provide Installation Information does not include a | ||||
| requirement to continue to provide support service, warranty, or updates | ||||
| for a work that has been modified or installed by the recipient, or for | ||||
| the User Product in which it has been modified or installed.  Access to a | ||||
| network may be denied when the modification itself materially and | ||||
| adversely affects the operation of the network or violates the rules and | ||||
| protocols for communication across the network. | ||||
|  | ||||
|   Corresponding Source conveyed, and Installation Information provided, | ||||
| in accord with this section must be in a format that is publicly | ||||
| documented (and with an implementation available to the public in | ||||
| source code form), and must require no special password or key for | ||||
| unpacking, reading or copying. | ||||
|  | ||||
|   7. Additional Terms. | ||||
|  | ||||
|   "Additional permissions" are terms that supplement the terms of this | ||||
| License by making exceptions from one or more of its conditions. | ||||
| Additional permissions that are applicable to the entire Program shall | ||||
| be treated as though they were included in this License, to the extent | ||||
| that they are valid under applicable law.  If additional permissions | ||||
| apply only to part of the Program, that part may be used separately | ||||
| under those permissions, but the entire Program remains governed by | ||||
| this License without regard to the additional permissions. | ||||
|  | ||||
|   When you convey a copy of a covered work, you may at your option | ||||
| remove any additional permissions from that copy, or from any part of | ||||
| it.  (Additional permissions may be written to require their own | ||||
| removal in certain cases when you modify the work.)  You may place | ||||
| additional permissions on material, added by you to a covered work, | ||||
| for which you have or can give appropriate copyright permission. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, for material you | ||||
| add to a covered work, you may (if authorized by the copyright holders of | ||||
| that material) supplement the terms of this License with terms: | ||||
|  | ||||
|     a) Disclaiming warranty or limiting liability differently from the | ||||
|     terms of sections 15 and 16 of this License; or | ||||
|  | ||||
|     b) Requiring preservation of specified reasonable legal notices or | ||||
|     author attributions in that material or in the Appropriate Legal | ||||
|     Notices displayed by works containing it; or | ||||
|  | ||||
|     c) Prohibiting misrepresentation of the origin of that material, or | ||||
|     requiring that modified versions of such material be marked in | ||||
|     reasonable ways as different from the original version; or | ||||
|  | ||||
|     d) Limiting the use for publicity purposes of names of licensors or | ||||
|     authors of the material; or | ||||
|  | ||||
|     e) Declining to grant rights under trademark law for use of some | ||||
|     trade names, trademarks, or service marks; or | ||||
|  | ||||
|     f) Requiring indemnification of licensors and authors of that | ||||
|     material by anyone who conveys the material (or modified versions of | ||||
|     it) with contractual assumptions of liability to the recipient, for | ||||
|     any liability that these contractual assumptions directly impose on | ||||
|     those licensors and authors. | ||||
|  | ||||
|   All other non-permissive additional terms are considered "further | ||||
| restrictions" within the meaning of section 10.  If the Program as you | ||||
| received it, or any part of it, contains a notice stating that it is | ||||
| governed by this License along with a term that is a further | ||||
| restriction, you may remove that term.  If a license document contains | ||||
| a further restriction but permits relicensing or conveying under this | ||||
| License, you may add to a covered work material governed by the terms | ||||
| of that license document, provided that the further restriction does | ||||
| not survive such relicensing or conveying. | ||||
|  | ||||
|   If you add terms to a covered work in accord with this section, you | ||||
| must place, in the relevant source files, a statement of the | ||||
| additional terms that apply to those files, or a notice indicating | ||||
| where to find the applicable terms. | ||||
|  | ||||
|   Additional terms, permissive or non-permissive, may be stated in the | ||||
| form of a separately written license, or stated as exceptions; | ||||
| the above requirements apply either way. | ||||
|  | ||||
|   8. Termination. | ||||
|  | ||||
|   You may not propagate or modify a covered work except as expressly | ||||
| provided under this License.  Any attempt otherwise to propagate or | ||||
| modify it is void, and will automatically terminate your rights under | ||||
| this License (including any patent licenses granted under the third | ||||
| paragraph of section 11). | ||||
|  | ||||
|   However, if you cease all violation of this License, then your | ||||
| license from a particular copyright holder is reinstated (a) | ||||
| provisionally, unless and until the copyright holder explicitly and | ||||
| finally terminates your license, and (b) permanently, if the copyright | ||||
| holder fails to notify you of the violation by some reasonable means | ||||
| prior to 60 days after the cessation. | ||||
|  | ||||
|   Moreover, your license from a particular copyright holder is | ||||
| reinstated permanently if the copyright holder notifies you of the | ||||
| violation by some reasonable means, this is the first time you have | ||||
| received notice of violation of this License (for any work) from that | ||||
| copyright holder, and you cure the violation prior to 30 days after | ||||
| your receipt of the notice. | ||||
|  | ||||
|   Termination of your rights under this section does not terminate the | ||||
| licenses of parties who have received copies or rights from you under | ||||
| this License.  If your rights have been terminated and not permanently | ||||
| reinstated, you do not qualify to receive new licenses for the same | ||||
| material under section 10. | ||||
|  | ||||
|   9. Acceptance Not Required for Having Copies. | ||||
|  | ||||
|   You are not required to accept this License in order to receive or | ||||
| run a copy of the Program.  Ancillary propagation of a covered work | ||||
| occurring solely as a consequence of using peer-to-peer transmission | ||||
| to receive a copy likewise does not require acceptance.  However, | ||||
| nothing other than this License grants you permission to propagate or | ||||
| modify any covered work.  These actions infringe copyright if you do | ||||
| not accept this License.  Therefore, by modifying or propagating a | ||||
| covered work, you indicate your acceptance of this License to do so. | ||||
|  | ||||
|   10. Automatic Licensing of Downstream Recipients. | ||||
|  | ||||
|   Each time you convey a covered work, the recipient automatically | ||||
| receives a license from the original licensors, to run, modify and | ||||
| propagate that work, subject to this License.  You are not responsible | ||||
| for enforcing compliance by third parties with this License. | ||||
|  | ||||
|   An "entity transaction" is a transaction transferring control of an | ||||
| organization, or substantially all assets of one, or subdividing an | ||||
| organization, or merging organizations.  If propagation of a covered | ||||
| work results from an entity transaction, each party to that | ||||
| transaction who receives a copy of the work also receives whatever | ||||
| licenses to the work the party's predecessor in interest had or could | ||||
| give under the previous paragraph, plus a right to possession of the | ||||
| Corresponding Source of the work from the predecessor in interest, if | ||||
| the predecessor has it or can get it with reasonable efforts. | ||||
|  | ||||
|   You may not impose any further restrictions on the exercise of the | ||||
| rights granted or affirmed under this License.  For example, you may | ||||
| not impose a license fee, royalty, or other charge for exercise of | ||||
| rights granted under this License, and you may not initiate litigation | ||||
| (including a cross-claim or counterclaim in a lawsuit) alleging that | ||||
| any patent claim is infringed by making, using, selling, offering for | ||||
| sale, or importing the Program or any portion of it. | ||||
|  | ||||
|   11. Patents. | ||||
|  | ||||
|   A "contributor" is a copyright holder who authorizes use under this | ||||
| License of the Program or a work on which the Program is based.  The | ||||
| work thus licensed is called the contributor's "contributor version". | ||||
|  | ||||
|   A contributor's "essential patent claims" are all patent claims | ||||
| owned or controlled by the contributor, whether already acquired or | ||||
| hereafter acquired, that would be infringed by some manner, permitted | ||||
| by this License, of making, using, or selling its contributor version, | ||||
| but do not include claims that would be infringed only as a | ||||
| consequence of further modification of the contributor version.  For | ||||
| purposes of this definition, "control" includes the right to grant | ||||
| patent sublicenses in a manner consistent with the requirements of | ||||
| this License. | ||||
|  | ||||
|   Each contributor grants you a non-exclusive, worldwide, royalty-free | ||||
| patent license under the contributor's essential patent claims, to | ||||
| make, use, sell, offer for sale, import and otherwise run, modify and | ||||
| propagate the contents of its contributor version. | ||||
|  | ||||
|   In the following three paragraphs, a "patent license" is any express | ||||
| agreement or commitment, however denominated, not to enforce a patent | ||||
| (such as an express permission to practice a patent or covenant not to | ||||
| sue for patent infringement).  To "grant" such a patent license to a | ||||
| party means to make such an agreement or commitment not to enforce a | ||||
| patent against the party. | ||||
|  | ||||
|   If you convey a covered work, knowingly relying on a patent license, | ||||
| and the Corresponding Source of the work is not available for anyone | ||||
| to copy, free of charge and under the terms of this License, through a | ||||
| publicly available network server or other readily accessible means, | ||||
| then you must either (1) cause the Corresponding Source to be so | ||||
| available, or (2) arrange to deprive yourself of the benefit of the | ||||
| patent license for this particular work, or (3) arrange, in a manner | ||||
| consistent with the requirements of this License, to extend the patent | ||||
| license to downstream recipients.  "Knowingly relying" means you have | ||||
| actual knowledge that, but for the patent license, your conveying the | ||||
| covered work in a country, or your recipient's use of the covered work | ||||
| in a country, would infringe one or more identifiable patents in that | ||||
| country that you have reason to believe are valid. | ||||
|  | ||||
|   If, pursuant to or in connection with a single transaction or | ||||
| arrangement, you convey, or propagate by procuring conveyance of, a | ||||
| covered work, and grant a patent license to some of the parties | ||||
| receiving the covered work authorizing them to use, propagate, modify | ||||
| or convey a specific copy of the covered work, then the patent license | ||||
| you grant is automatically extended to all recipients of the covered | ||||
| work and works based on it. | ||||
|  | ||||
|   A patent license is "discriminatory" if it does not include within | ||||
| the scope of its coverage, prohibits the exercise of, or is | ||||
| conditioned on the non-exercise of one or more of the rights that are | ||||
| specifically granted under this License.  You may not convey a covered | ||||
| work if you are a party to an arrangement with a third party that is | ||||
| in the business of distributing software, under which you make payment | ||||
| to the third party based on the extent of your activity of conveying | ||||
| the work, and under which the third party grants, to any of the | ||||
| parties who would receive the covered work from you, a discriminatory | ||||
| patent license (a) in connection with copies of the covered work | ||||
| conveyed by you (or copies made from those copies), or (b) primarily | ||||
| for and in connection with specific products or compilations that | ||||
| contain the covered work, unless you entered into that arrangement, | ||||
| or that patent license was granted, prior to 28 March 2007. | ||||
|  | ||||
|   Nothing in this License shall be construed as excluding or limiting | ||||
| any implied license or other defenses to infringement that may | ||||
| otherwise be available to you under applicable patent law. | ||||
|  | ||||
|   12. No Surrender of Others' Freedom. | ||||
|  | ||||
|   If conditions are imposed on you (whether by court order, agreement or | ||||
| otherwise) that contradict the conditions of this License, they do not | ||||
| excuse you from the conditions of this License.  If you cannot convey a | ||||
| covered work so as to satisfy simultaneously your obligations under this | ||||
| License and any other pertinent obligations, then as a consequence you may | ||||
| not convey it at all.  For example, if you agree to terms that obligate you | ||||
| to collect a royalty for further conveying from those to whom you convey | ||||
| the Program, the only way you could satisfy both those terms and this | ||||
| License would be to refrain entirely from conveying the Program. | ||||
|  | ||||
|   13. Remote Network Interaction; Use with the GNU General Public License. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, if you modify the | ||||
| Program, your modified version must prominently offer all users | ||||
| interacting with it remotely through a computer network (if your version | ||||
| supports such interaction) an opportunity to receive the Corresponding | ||||
| Source of your version by providing access to the Corresponding Source | ||||
| from a network server at no charge, through some standard or customary | ||||
| means of facilitating copying of software.  This Corresponding Source | ||||
| shall include the Corresponding Source for any work covered by version 3 | ||||
| of the GNU General Public License that is incorporated pursuant to the | ||||
| following paragraph. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, you have | ||||
| permission to link or combine any covered work with a work licensed | ||||
| under version 3 of the GNU General Public License into a single | ||||
| combined work, and to convey the resulting work.  The terms of this | ||||
| License will continue to apply to the part which is the covered work, | ||||
| but the work with which it is combined will remain governed by version | ||||
| 3 of the GNU General Public License. | ||||
|  | ||||
|   14. Revised Versions of this License. | ||||
|  | ||||
|   The Free Software Foundation may publish revised and/or new versions of | ||||
| the GNU Affero General Public License from time to time.  Such new versions | ||||
| will be similar in spirit to the present version, but may differ in detail to | ||||
| address new problems or concerns. | ||||
|  | ||||
|   Each version is given a distinguishing version number.  If the | ||||
| Program specifies that a certain numbered version of the GNU Affero General | ||||
| Public License "or any later version" applies to it, you have the | ||||
| option of following the terms and conditions either of that numbered | ||||
| version or of any later version published by the Free Software | ||||
| Foundation.  If the Program does not specify a version number of the | ||||
| GNU Affero General Public License, you may choose any version ever published | ||||
| by the Free Software Foundation. | ||||
|  | ||||
|   If the Program specifies that a proxy can decide which future | ||||
| versions of the GNU Affero General Public License can be used, that proxy's | ||||
| public statement of acceptance of a version permanently authorizes you | ||||
| to choose that version for the Program. | ||||
|  | ||||
|   Later license versions may give you additional or different | ||||
| permissions.  However, no additional obligations are imposed on any | ||||
| author or copyright holder as a result of your choosing to follow a | ||||
| later version. | ||||
|  | ||||
|   15. Disclaimer of Warranty. | ||||
|  | ||||
|   THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY | ||||
| APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT | ||||
| HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY | ||||
| OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, | ||||
| THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||||
| PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM | ||||
| IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF | ||||
| ALL NECESSARY SERVICING, REPAIR OR CORRECTION. | ||||
|  | ||||
|   16. Limitation of Liability. | ||||
|  | ||||
|   IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS | ||||
| THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY | ||||
| GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE | ||||
| USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF | ||||
| DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD | ||||
| PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), | ||||
| EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF | ||||
| SUCH DAMAGES. | ||||
|  | ||||
|   17. Interpretation of Sections 15 and 16. | ||||
|  | ||||
|   If the disclaimer of warranty and limitation of liability provided | ||||
| above cannot be given local legal effect according to their terms, | ||||
| reviewing courts shall apply local law that most closely approximates | ||||
| an absolute waiver of all civil liability in connection with the | ||||
| Program, unless a warranty or assumption of liability accompanies a | ||||
| copy of the Program in return for a fee. | ||||
|  | ||||
|                      END OF TERMS AND CONDITIONS | ||||
|  | ||||
|             How to Apply These Terms to Your New Programs | ||||
|  | ||||
|   If you develop a new program, and you want it to be of the greatest | ||||
| possible use to the public, the best way to achieve this is to make it | ||||
| free software which everyone can redistribute and change under these terms. | ||||
|  | ||||
|   To do so, attach the following notices to the program.  It is safest | ||||
| to attach them to the start of each source file to most effectively | ||||
| state the exclusion of warranty; and each file should have at least | ||||
| the "copyright" line and a pointer to where the full notice is found. | ||||
|  | ||||
|     <one line to give the program's name and a brief idea of what it does.> | ||||
|     Copyright (C) <year>  <name of author> | ||||
|  | ||||
|     This program is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU Affero General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
|  | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU Affero General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU Affero General Public License | ||||
|     along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  | ||||
| Also add information on how to contact you by electronic and paper mail. | ||||
|  | ||||
|   If your software can interact with users remotely through a computer | ||||
| network, you should also make sure that it provides a way for users to | ||||
| get its source.  For example, if your program is a web application, its | ||||
| interface could display a "Source" link that leads users to an archive | ||||
| of the code.  There are many ways you could offer source, and different | ||||
| solutions will be better for different programs; see section 13 for the | ||||
| specific requirements. | ||||
|  | ||||
|   You should also get your employer (if you work as a programmer) or school, | ||||
| if any, to sign a "copyright disclaimer" for the program, if necessary. | ||||
| For more information on this, and how to apply and follow the GNU AGPL, see | ||||
| <http://www.gnu.org/licenses/>. | ||||
							
								
								
									
										742
									
								
								vendor/github.com/mattermost/platform/vendor/gopkg.in/yaml.v2/apic.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										742
									
								
								vendor/github.com/mattermost/platform/vendor/gopkg.in/yaml.v2/apic.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,742 @@ | ||||
| package yaml | ||||
|  | ||||
| import ( | ||||
| 	"io" | ||||
| 	"os" | ||||
| ) | ||||
|  | ||||
| func yaml_insert_token(parser *yaml_parser_t, pos int, token *yaml_token_t) { | ||||
| 	//fmt.Println("yaml_insert_token", "pos:", pos, "typ:", token.typ, "head:", parser.tokens_head, "len:", len(parser.tokens)) | ||||
|  | ||||
| 	// Check if we can move the queue at the beginning of the buffer. | ||||
| 	if parser.tokens_head > 0 && len(parser.tokens) == cap(parser.tokens) { | ||||
| 		if parser.tokens_head != len(parser.tokens) { | ||||
| 			copy(parser.tokens, parser.tokens[parser.tokens_head:]) | ||||
| 		} | ||||
| 		parser.tokens = parser.tokens[:len(parser.tokens)-parser.tokens_head] | ||||
| 		parser.tokens_head = 0 | ||||
| 	} | ||||
| 	parser.tokens = append(parser.tokens, *token) | ||||
| 	if pos < 0 { | ||||
| 		return | ||||
| 	} | ||||
| 	copy(parser.tokens[parser.tokens_head+pos+1:], parser.tokens[parser.tokens_head+pos:]) | ||||
| 	parser.tokens[parser.tokens_head+pos] = *token | ||||
| } | ||||
|  | ||||
| // Create a new parser object. | ||||
| func yaml_parser_initialize(parser *yaml_parser_t) bool { | ||||
| 	*parser = yaml_parser_t{ | ||||
| 		raw_buffer: make([]byte, 0, input_raw_buffer_size), | ||||
| 		buffer:     make([]byte, 0, input_buffer_size), | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| // Destroy a parser object. | ||||
| func yaml_parser_delete(parser *yaml_parser_t) { | ||||
| 	*parser = yaml_parser_t{} | ||||
| } | ||||
|  | ||||
| // String read handler. | ||||
| func yaml_string_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { | ||||
| 	if parser.input_pos == len(parser.input) { | ||||
| 		return 0, io.EOF | ||||
| 	} | ||||
| 	n = copy(buffer, parser.input[parser.input_pos:]) | ||||
| 	parser.input_pos += n | ||||
| 	return n, nil | ||||
| } | ||||
|  | ||||
| // File read handler. | ||||
| func yaml_file_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { | ||||
| 	return parser.input_file.Read(buffer) | ||||
| } | ||||
|  | ||||
| // Set a string input. | ||||
| func yaml_parser_set_input_string(parser *yaml_parser_t, input []byte) { | ||||
| 	if parser.read_handler != nil { | ||||
| 		panic("must set the input source only once") | ||||
| 	} | ||||
| 	parser.read_handler = yaml_string_read_handler | ||||
| 	parser.input = input | ||||
| 	parser.input_pos = 0 | ||||
| } | ||||
|  | ||||
| // Set a file input. | ||||
| func yaml_parser_set_input_file(parser *yaml_parser_t, file *os.File) { | ||||
| 	if parser.read_handler != nil { | ||||
| 		panic("must set the input source only once") | ||||
| 	} | ||||
| 	parser.read_handler = yaml_file_read_handler | ||||
| 	parser.input_file = file | ||||
| } | ||||
|  | ||||
| // Set the source encoding. | ||||
| func yaml_parser_set_encoding(parser *yaml_parser_t, encoding yaml_encoding_t) { | ||||
| 	if parser.encoding != yaml_ANY_ENCODING { | ||||
| 		panic("must set the encoding only once") | ||||
| 	} | ||||
| 	parser.encoding = encoding | ||||
| } | ||||
|  | ||||
| // Create a new emitter object. | ||||
| func yaml_emitter_initialize(emitter *yaml_emitter_t) bool { | ||||
| 	*emitter = yaml_emitter_t{ | ||||
| 		buffer:     make([]byte, output_buffer_size), | ||||
| 		raw_buffer: make([]byte, 0, output_raw_buffer_size), | ||||
| 		states:     make([]yaml_emitter_state_t, 0, initial_stack_size), | ||||
| 		events:     make([]yaml_event_t, 0, initial_queue_size), | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| // Destroy an emitter object. | ||||
| func yaml_emitter_delete(emitter *yaml_emitter_t) { | ||||
| 	*emitter = yaml_emitter_t{} | ||||
| } | ||||
|  | ||||
| // String write handler. | ||||
| func yaml_string_write_handler(emitter *yaml_emitter_t, buffer []byte) error { | ||||
| 	*emitter.output_buffer = append(*emitter.output_buffer, buffer...) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // File write handler. | ||||
| func yaml_file_write_handler(emitter *yaml_emitter_t, buffer []byte) error { | ||||
| 	_, err := emitter.output_file.Write(buffer) | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // Set a string output. | ||||
| func yaml_emitter_set_output_string(emitter *yaml_emitter_t, output_buffer *[]byte) { | ||||
| 	if emitter.write_handler != nil { | ||||
| 		panic("must set the output target only once") | ||||
| 	} | ||||
| 	emitter.write_handler = yaml_string_write_handler | ||||
| 	emitter.output_buffer = output_buffer | ||||
| } | ||||
|  | ||||
| // Set a file output. | ||||
| func yaml_emitter_set_output_file(emitter *yaml_emitter_t, file io.Writer) { | ||||
| 	if emitter.write_handler != nil { | ||||
| 		panic("must set the output target only once") | ||||
| 	} | ||||
| 	emitter.write_handler = yaml_file_write_handler | ||||
| 	emitter.output_file = file | ||||
| } | ||||
|  | ||||
| // Set the output encoding. | ||||
| func yaml_emitter_set_encoding(emitter *yaml_emitter_t, encoding yaml_encoding_t) { | ||||
| 	if emitter.encoding != yaml_ANY_ENCODING { | ||||
| 		panic("must set the output encoding only once") | ||||
| 	} | ||||
| 	emitter.encoding = encoding | ||||
| } | ||||
|  | ||||
| // Set the canonical output style. | ||||
| func yaml_emitter_set_canonical(emitter *yaml_emitter_t, canonical bool) { | ||||
| 	emitter.canonical = canonical | ||||
| } | ||||
|  | ||||
| //// Set the indentation increment. | ||||
| func yaml_emitter_set_indent(emitter *yaml_emitter_t, indent int) { | ||||
| 	if indent < 2 || indent > 9 { | ||||
| 		indent = 2 | ||||
| 	} | ||||
| 	emitter.best_indent = indent | ||||
| } | ||||
|  | ||||
| // Set the preferred line width. | ||||
| func yaml_emitter_set_width(emitter *yaml_emitter_t, width int) { | ||||
| 	if width < 0 { | ||||
| 		width = -1 | ||||
| 	} | ||||
| 	emitter.best_width = width | ||||
| } | ||||
|  | ||||
| // Set if unescaped non-ASCII characters are allowed. | ||||
| func yaml_emitter_set_unicode(emitter *yaml_emitter_t, unicode bool) { | ||||
| 	emitter.unicode = unicode | ||||
| } | ||||
|  | ||||
| // Set the preferred line break character. | ||||
| func yaml_emitter_set_break(emitter *yaml_emitter_t, line_break yaml_break_t) { | ||||
| 	emitter.line_break = line_break | ||||
| } | ||||
|  | ||||
| ///* | ||||
| // * Destroy a token object. | ||||
| // */ | ||||
| // | ||||
| //YAML_DECLARE(void) | ||||
| //yaml_token_delete(yaml_token_t *token) | ||||
| //{ | ||||
| //    assert(token);  // Non-NULL token object expected. | ||||
| // | ||||
| //    switch (token.type) | ||||
| //    { | ||||
| //        case YAML_TAG_DIRECTIVE_TOKEN: | ||||
| //            yaml_free(token.data.tag_directive.handle); | ||||
| //            yaml_free(token.data.tag_directive.prefix); | ||||
| //            break; | ||||
| // | ||||
| //        case YAML_ALIAS_TOKEN: | ||||
| //            yaml_free(token.data.alias.value); | ||||
| //            break; | ||||
| // | ||||
| //        case YAML_ANCHOR_TOKEN: | ||||
| //            yaml_free(token.data.anchor.value); | ||||
| //            break; | ||||
| // | ||||
| //        case YAML_TAG_TOKEN: | ||||
| //            yaml_free(token.data.tag.handle); | ||||
| //            yaml_free(token.data.tag.suffix); | ||||
| //            break; | ||||
| // | ||||
| //        case YAML_SCALAR_TOKEN: | ||||
| //            yaml_free(token.data.scalar.value); | ||||
| //            break; | ||||
| // | ||||
| //        default: | ||||
| //            break; | ||||
| //    } | ||||
| // | ||||
| //    memset(token, 0, sizeof(yaml_token_t)); | ||||
| //} | ||||
| // | ||||
| ///* | ||||
| // * Check if a string is a valid UTF-8 sequence. | ||||
| // * | ||||
| // * Check 'reader.c' for more details on UTF-8 encoding. | ||||
| // */ | ||||
| // | ||||
| //static int | ||||
| //yaml_check_utf8(yaml_char_t *start, size_t length) | ||||
| //{ | ||||
| //    yaml_char_t *end = start+length; | ||||
| //    yaml_char_t *pointer = start; | ||||
| // | ||||
| //    while (pointer < end) { | ||||
| //        unsigned char octet; | ||||
| //        unsigned int width; | ||||
| //        unsigned int value; | ||||
| //        size_t k; | ||||
| // | ||||
| //        octet = pointer[0]; | ||||
| //        width = (octet & 0x80) == 0x00 ? 1 : | ||||
| //                (octet & 0xE0) == 0xC0 ? 2 : | ||||
| //                (octet & 0xF0) == 0xE0 ? 3 : | ||||
| //                (octet & 0xF8) == 0xF0 ? 4 : 0; | ||||
| //        value = (octet & 0x80) == 0x00 ? octet & 0x7F : | ||||
| //                (octet & 0xE0) == 0xC0 ? octet & 0x1F : | ||||
| //                (octet & 0xF0) == 0xE0 ? octet & 0x0F : | ||||
| //                (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0; | ||||
| //        if (!width) return 0; | ||||
| //        if (pointer+width > end) return 0; | ||||
| //        for (k = 1; k < width; k ++) { | ||||
| //            octet = pointer[k]; | ||||
| //            if ((octet & 0xC0) != 0x80) return 0; | ||||
| //            value = (value << 6) + (octet & 0x3F); | ||||
| //        } | ||||
| //        if (!((width == 1) || | ||||
| //            (width == 2 && value >= 0x80) || | ||||
| //            (width == 3 && value >= 0x800) || | ||||
| //            (width == 4 && value >= 0x10000))) return 0; | ||||
| // | ||||
| //        pointer += width; | ||||
| //    } | ||||
| // | ||||
| //    return 1; | ||||
| //} | ||||
| // | ||||
|  | ||||
| // Create STREAM-START. | ||||
| func yaml_stream_start_event_initialize(event *yaml_event_t, encoding yaml_encoding_t) bool { | ||||
| 	*event = yaml_event_t{ | ||||
| 		typ:      yaml_STREAM_START_EVENT, | ||||
| 		encoding: encoding, | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| // Create STREAM-END. | ||||
| func yaml_stream_end_event_initialize(event *yaml_event_t) bool { | ||||
| 	*event = yaml_event_t{ | ||||
| 		typ: yaml_STREAM_END_EVENT, | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| // Create DOCUMENT-START. | ||||
| func yaml_document_start_event_initialize(event *yaml_event_t, version_directive *yaml_version_directive_t, | ||||
| 	tag_directives []yaml_tag_directive_t, implicit bool) bool { | ||||
| 	*event = yaml_event_t{ | ||||
| 		typ:               yaml_DOCUMENT_START_EVENT, | ||||
| 		version_directive: version_directive, | ||||
| 		tag_directives:    tag_directives, | ||||
| 		implicit:          implicit, | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| // Create DOCUMENT-END. | ||||
| func yaml_document_end_event_initialize(event *yaml_event_t, implicit bool) bool { | ||||
| 	*event = yaml_event_t{ | ||||
| 		typ:      yaml_DOCUMENT_END_EVENT, | ||||
| 		implicit: implicit, | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| ///* | ||||
| // * Create ALIAS. | ||||
| // */ | ||||
| // | ||||
| //YAML_DECLARE(int) | ||||
| //yaml_alias_event_initialize(event *yaml_event_t, anchor *yaml_char_t) | ||||
| //{ | ||||
| //    mark yaml_mark_t = { 0, 0, 0 } | ||||
| //    anchor_copy *yaml_char_t = NULL | ||||
| // | ||||
| //    assert(event) // Non-NULL event object is expected. | ||||
| //    assert(anchor) // Non-NULL anchor is expected. | ||||
| // | ||||
| //    if (!yaml_check_utf8(anchor, strlen((char *)anchor))) return 0 | ||||
| // | ||||
| //    anchor_copy = yaml_strdup(anchor) | ||||
| //    if (!anchor_copy) | ||||
| //        return 0 | ||||
| // | ||||
| //    ALIAS_EVENT_INIT(*event, anchor_copy, mark, mark) | ||||
| // | ||||
| //    return 1 | ||||
| //} | ||||
|  | ||||
| // Create SCALAR. | ||||
| func yaml_scalar_event_initialize(event *yaml_event_t, anchor, tag, value []byte, plain_implicit, quoted_implicit bool, style yaml_scalar_style_t) bool { | ||||
| 	*event = yaml_event_t{ | ||||
| 		typ:             yaml_SCALAR_EVENT, | ||||
| 		anchor:          anchor, | ||||
| 		tag:             tag, | ||||
| 		value:           value, | ||||
| 		implicit:        plain_implicit, | ||||
| 		quoted_implicit: quoted_implicit, | ||||
| 		style:           yaml_style_t(style), | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| // Create SEQUENCE-START. | ||||
| func yaml_sequence_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_sequence_style_t) bool { | ||||
| 	*event = yaml_event_t{ | ||||
| 		typ:      yaml_SEQUENCE_START_EVENT, | ||||
| 		anchor:   anchor, | ||||
| 		tag:      tag, | ||||
| 		implicit: implicit, | ||||
| 		style:    yaml_style_t(style), | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| // Create SEQUENCE-END. | ||||
| func yaml_sequence_end_event_initialize(event *yaml_event_t) bool { | ||||
| 	*event = yaml_event_t{ | ||||
| 		typ: yaml_SEQUENCE_END_EVENT, | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| // Create MAPPING-START. | ||||
| func yaml_mapping_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_mapping_style_t) bool { | ||||
| 	*event = yaml_event_t{ | ||||
| 		typ:      yaml_MAPPING_START_EVENT, | ||||
| 		anchor:   anchor, | ||||
| 		tag:      tag, | ||||
| 		implicit: implicit, | ||||
| 		style:    yaml_style_t(style), | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| // Create MAPPING-END. | ||||
| func yaml_mapping_end_event_initialize(event *yaml_event_t) bool { | ||||
| 	*event = yaml_event_t{ | ||||
| 		typ: yaml_MAPPING_END_EVENT, | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| // Destroy an event object. | ||||
| func yaml_event_delete(event *yaml_event_t) { | ||||
| 	*event = yaml_event_t{} | ||||
| } | ||||
|  | ||||
| ///* | ||||
| // * Create a document object. | ||||
| // */ | ||||
| // | ||||
| //YAML_DECLARE(int) | ||||
| //yaml_document_initialize(document *yaml_document_t, | ||||
| //        version_directive *yaml_version_directive_t, | ||||
| //        tag_directives_start *yaml_tag_directive_t, | ||||
| //        tag_directives_end *yaml_tag_directive_t, | ||||
| //        start_implicit int, end_implicit int) | ||||
| //{ | ||||
| //    struct { | ||||
| //        error yaml_error_type_t | ||||
| //    } context | ||||
| //    struct { | ||||
| //        start *yaml_node_t | ||||
| //        end *yaml_node_t | ||||
| //        top *yaml_node_t | ||||
| //    } nodes = { NULL, NULL, NULL } | ||||
| //    version_directive_copy *yaml_version_directive_t = NULL | ||||
| //    struct { | ||||
| //        start *yaml_tag_directive_t | ||||
| //        end *yaml_tag_directive_t | ||||
| //        top *yaml_tag_directive_t | ||||
| //    } tag_directives_copy = { NULL, NULL, NULL } | ||||
| //    value yaml_tag_directive_t = { NULL, NULL } | ||||
| //    mark yaml_mark_t = { 0, 0, 0 } | ||||
| // | ||||
| //    assert(document) // Non-NULL document object is expected. | ||||
| //    assert((tag_directives_start && tag_directives_end) || | ||||
| //            (tag_directives_start == tag_directives_end)) | ||||
| //                            // Valid tag directives are expected. | ||||
| // | ||||
| //    if (!STACK_INIT(&context, nodes, INITIAL_STACK_SIZE)) goto error | ||||
| // | ||||
| //    if (version_directive) { | ||||
| //        version_directive_copy = yaml_malloc(sizeof(yaml_version_directive_t)) | ||||
| //        if (!version_directive_copy) goto error | ||||
| //        version_directive_copy.major = version_directive.major | ||||
| //        version_directive_copy.minor = version_directive.minor | ||||
| //    } | ||||
| // | ||||
| //    if (tag_directives_start != tag_directives_end) { | ||||
| //        tag_directive *yaml_tag_directive_t | ||||
| //        if (!STACK_INIT(&context, tag_directives_copy, INITIAL_STACK_SIZE)) | ||||
| //            goto error | ||||
| //        for (tag_directive = tag_directives_start | ||||
| //                tag_directive != tag_directives_end; tag_directive ++) { | ||||
| //            assert(tag_directive.handle) | ||||
| //            assert(tag_directive.prefix) | ||||
| //            if (!yaml_check_utf8(tag_directive.handle, | ||||
| //                        strlen((char *)tag_directive.handle))) | ||||
| //                goto error | ||||
| //            if (!yaml_check_utf8(tag_directive.prefix, | ||||
| //                        strlen((char *)tag_directive.prefix))) | ||||
| //                goto error | ||||
| //            value.handle = yaml_strdup(tag_directive.handle) | ||||
| //            value.prefix = yaml_strdup(tag_directive.prefix) | ||||
| //            if (!value.handle || !value.prefix) goto error | ||||
| //            if (!PUSH(&context, tag_directives_copy, value)) | ||||
| //                goto error | ||||
| //            value.handle = NULL | ||||
| //            value.prefix = NULL | ||||
| //        } | ||||
| //    } | ||||
| // | ||||
| //    DOCUMENT_INIT(*document, nodes.start, nodes.end, version_directive_copy, | ||||
| //            tag_directives_copy.start, tag_directives_copy.top, | ||||
| //            start_implicit, end_implicit, mark, mark) | ||||
| // | ||||
| //    return 1 | ||||
| // | ||||
| //error: | ||||
| //    STACK_DEL(&context, nodes) | ||||
| //    yaml_free(version_directive_copy) | ||||
| //    while (!STACK_EMPTY(&context, tag_directives_copy)) { | ||||
| //        value yaml_tag_directive_t = POP(&context, tag_directives_copy) | ||||
| //        yaml_free(value.handle) | ||||
| //        yaml_free(value.prefix) | ||||
| //    } | ||||
| //    STACK_DEL(&context, tag_directives_copy) | ||||
| //    yaml_free(value.handle) | ||||
| //    yaml_free(value.prefix) | ||||
| // | ||||
| //    return 0 | ||||
| //} | ||||
| // | ||||
| ///* | ||||
| // * Destroy a document object. | ||||
| // */ | ||||
| // | ||||
| //YAML_DECLARE(void) | ||||
| //yaml_document_delete(document *yaml_document_t) | ||||
| //{ | ||||
| //    struct { | ||||
| //        error yaml_error_type_t | ||||
| //    } context | ||||
| //    tag_directive *yaml_tag_directive_t | ||||
| // | ||||
| //    context.error = YAML_NO_ERROR // Eliminate a compliler warning. | ||||
| // | ||||
| //    assert(document) // Non-NULL document object is expected. | ||||
| // | ||||
| //    while (!STACK_EMPTY(&context, document.nodes)) { | ||||
| //        node yaml_node_t = POP(&context, document.nodes) | ||||
| //        yaml_free(node.tag) | ||||
| //        switch (node.type) { | ||||
| //            case YAML_SCALAR_NODE: | ||||
| //                yaml_free(node.data.scalar.value) | ||||
| //                break | ||||
| //            case YAML_SEQUENCE_NODE: | ||||
| //                STACK_DEL(&context, node.data.sequence.items) | ||||
| //                break | ||||
| //            case YAML_MAPPING_NODE: | ||||
| //                STACK_DEL(&context, node.data.mapping.pairs) | ||||
| //                break | ||||
| //            default: | ||||
| //                assert(0) // Should not happen. | ||||
| //        } | ||||
| //    } | ||||
| //    STACK_DEL(&context, document.nodes) | ||||
| // | ||||
| //    yaml_free(document.version_directive) | ||||
| //    for (tag_directive = document.tag_directives.start | ||||
| //            tag_directive != document.tag_directives.end | ||||
| //            tag_directive++) { | ||||
| //        yaml_free(tag_directive.handle) | ||||
| //        yaml_free(tag_directive.prefix) | ||||
| //    } | ||||
| //    yaml_free(document.tag_directives.start) | ||||
| // | ||||
| //    memset(document, 0, sizeof(yaml_document_t)) | ||||
| //} | ||||
| // | ||||
| ///** | ||||
| // * Get a document node. | ||||
| // */ | ||||
| // | ||||
| //YAML_DECLARE(yaml_node_t *) | ||||
| //yaml_document_get_node(document *yaml_document_t, index int) | ||||
| //{ | ||||
| //    assert(document) // Non-NULL document object is expected. | ||||
| // | ||||
| //    if (index > 0 && document.nodes.start + index <= document.nodes.top) { | ||||
| //        return document.nodes.start + index - 1 | ||||
| //    } | ||||
| //    return NULL | ||||
| //} | ||||
| // | ||||
| ///** | ||||
| // * Get the root object. | ||||
| // */ | ||||
| // | ||||
| //YAML_DECLARE(yaml_node_t *) | ||||
| //yaml_document_get_root_node(document *yaml_document_t) | ||||
| //{ | ||||
| //    assert(document) // Non-NULL document object is expected. | ||||
| // | ||||
| //    if (document.nodes.top != document.nodes.start) { | ||||
| //        return document.nodes.start | ||||
| //    } | ||||
| //    return NULL | ||||
| //} | ||||
| // | ||||
| ///* | ||||
| // * Add a scalar node to a document. | ||||
| // */ | ||||
| // | ||||
| //YAML_DECLARE(int) | ||||
| //yaml_document_add_scalar(document *yaml_document_t, | ||||
| //        tag *yaml_char_t, value *yaml_char_t, length int, | ||||
| //        style yaml_scalar_style_t) | ||||
| //{ | ||||
| //    struct { | ||||
| //        error yaml_error_type_t | ||||
| //    } context | ||||
| //    mark yaml_mark_t = { 0, 0, 0 } | ||||
| //    tag_copy *yaml_char_t = NULL | ||||
| //    value_copy *yaml_char_t = NULL | ||||
| //    node yaml_node_t | ||||
| // | ||||
| //    assert(document) // Non-NULL document object is expected. | ||||
| //    assert(value) // Non-NULL value is expected. | ||||
| // | ||||
| //    if (!tag) { | ||||
| //        tag = (yaml_char_t *)YAML_DEFAULT_SCALAR_TAG | ||||
| //    } | ||||
| // | ||||
| //    if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error | ||||
| //    tag_copy = yaml_strdup(tag) | ||||
| //    if (!tag_copy) goto error | ||||
| // | ||||
| //    if (length < 0) { | ||||
| //        length = strlen((char *)value) | ||||
| //    } | ||||
| // | ||||
| //    if (!yaml_check_utf8(value, length)) goto error | ||||
| //    value_copy = yaml_malloc(length+1) | ||||
| //    if (!value_copy) goto error | ||||
| //    memcpy(value_copy, value, length) | ||||
| //    value_copy[length] = '\0' | ||||
| // | ||||
| //    SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark) | ||||
| //    if (!PUSH(&context, document.nodes, node)) goto error | ||||
| // | ||||
| //    return document.nodes.top - document.nodes.start | ||||
| // | ||||
| //error: | ||||
| //    yaml_free(tag_copy) | ||||
| //    yaml_free(value_copy) | ||||
| // | ||||
| //    return 0 | ||||
| //} | ||||
| // | ||||
| ///* | ||||
| // * Add a sequence node to a document. | ||||
| // */ | ||||
| // | ||||
| //YAML_DECLARE(int) | ||||
| //yaml_document_add_sequence(document *yaml_document_t, | ||||
| //        tag *yaml_char_t, style yaml_sequence_style_t) | ||||
| //{ | ||||
| //    struct { | ||||
| //        error yaml_error_type_t | ||||
| //    } context | ||||
| //    mark yaml_mark_t = { 0, 0, 0 } | ||||
| //    tag_copy *yaml_char_t = NULL | ||||
| //    struct { | ||||
| //        start *yaml_node_item_t | ||||
| //        end *yaml_node_item_t | ||||
| //        top *yaml_node_item_t | ||||
| //    } items = { NULL, NULL, NULL } | ||||
| //    node yaml_node_t | ||||
| // | ||||
| //    assert(document) // Non-NULL document object is expected. | ||||
| // | ||||
| //    if (!tag) { | ||||
| //        tag = (yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG | ||||
| //    } | ||||
| // | ||||
| //    if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error | ||||
| //    tag_copy = yaml_strdup(tag) | ||||
| //    if (!tag_copy) goto error | ||||
| // | ||||
| //    if (!STACK_INIT(&context, items, INITIAL_STACK_SIZE)) goto error | ||||
| // | ||||
| //    SEQUENCE_NODE_INIT(node, tag_copy, items.start, items.end, | ||||
| //            style, mark, mark) | ||||
| //    if (!PUSH(&context, document.nodes, node)) goto error | ||||
| // | ||||
| //    return document.nodes.top - document.nodes.start | ||||
| // | ||||
| //error: | ||||
| //    STACK_DEL(&context, items) | ||||
| //    yaml_free(tag_copy) | ||||
| // | ||||
| //    return 0 | ||||
| //} | ||||
| // | ||||
| ///* | ||||
| // * Add a mapping node to a document. | ||||
| // */ | ||||
| // | ||||
| //YAML_DECLARE(int) | ||||
| //yaml_document_add_mapping(document *yaml_document_t, | ||||
| //        tag *yaml_char_t, style yaml_mapping_style_t) | ||||
| //{ | ||||
| //    struct { | ||||
| //        error yaml_error_type_t | ||||
| //    } context | ||||
| //    mark yaml_mark_t = { 0, 0, 0 } | ||||
| //    tag_copy *yaml_char_t = NULL | ||||
| //    struct { | ||||
| //        start *yaml_node_pair_t | ||||
| //        end *yaml_node_pair_t | ||||
| //        top *yaml_node_pair_t | ||||
| //    } pairs = { NULL, NULL, NULL } | ||||
| //    node yaml_node_t | ||||
| // | ||||
| //    assert(document) // Non-NULL document object is expected. | ||||
| // | ||||
| //    if (!tag) { | ||||
| //        tag = (yaml_char_t *)YAML_DEFAULT_MAPPING_TAG | ||||
| //    } | ||||
| // | ||||
| //    if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error | ||||
| //    tag_copy = yaml_strdup(tag) | ||||
| //    if (!tag_copy) goto error | ||||
| // | ||||
| //    if (!STACK_INIT(&context, pairs, INITIAL_STACK_SIZE)) goto error | ||||
| // | ||||
| //    MAPPING_NODE_INIT(node, tag_copy, pairs.start, pairs.end, | ||||
| //            style, mark, mark) | ||||
| //    if (!PUSH(&context, document.nodes, node)) goto error | ||||
| // | ||||
| //    return document.nodes.top - document.nodes.start | ||||
| // | ||||
| //error: | ||||
| //    STACK_DEL(&context, pairs) | ||||
| //    yaml_free(tag_copy) | ||||
| // | ||||
| //    return 0 | ||||
| //} | ||||
| // | ||||
| ///* | ||||
| // * Append an item to a sequence node. | ||||
| // */ | ||||
| // | ||||
| //YAML_DECLARE(int) | ||||
| //yaml_document_append_sequence_item(document *yaml_document_t, | ||||
| //        sequence int, item int) | ||||
| //{ | ||||
| //    struct { | ||||
| //        error yaml_error_type_t | ||||
| //    } context | ||||
| // | ||||
| //    assert(document) // Non-NULL document is required. | ||||
| //    assert(sequence > 0 | ||||
| //            && document.nodes.start + sequence <= document.nodes.top) | ||||
| //                            // Valid sequence id is required. | ||||
| //    assert(document.nodes.start[sequence-1].type == YAML_SEQUENCE_NODE) | ||||
| //                            // A sequence node is required. | ||||
| //    assert(item > 0 && document.nodes.start + item <= document.nodes.top) | ||||
| //                            // Valid item id is required. | ||||
| // | ||||
| //    if (!PUSH(&context, | ||||
| //                document.nodes.start[sequence-1].data.sequence.items, item)) | ||||
| //        return 0 | ||||
| // | ||||
| //    return 1 | ||||
| //} | ||||
| // | ||||
| ///* | ||||
| // * Append a pair of a key and a value to a mapping node. | ||||
| // */ | ||||
| // | ||||
| //YAML_DECLARE(int) | ||||
| //yaml_document_append_mapping_pair(document *yaml_document_t, | ||||
| //        mapping int, key int, value int) | ||||
| //{ | ||||
| //    struct { | ||||
| //        error yaml_error_type_t | ||||
| //    } context | ||||
| // | ||||
| //    pair yaml_node_pair_t | ||||
| // | ||||
| //    assert(document) // Non-NULL document is required. | ||||
| //    assert(mapping > 0 | ||||
| //            && document.nodes.start + mapping <= document.nodes.top) | ||||
| //                            // Valid mapping id is required. | ||||
| //    assert(document.nodes.start[mapping-1].type == YAML_MAPPING_NODE) | ||||
| //                            // A mapping node is required. | ||||
| //    assert(key > 0 && document.nodes.start + key <= document.nodes.top) | ||||
| //                            // Valid key id is required. | ||||
| //    assert(value > 0 && document.nodes.start + value <= document.nodes.top) | ||||
| //                            // Valid value id is required. | ||||
| // | ||||
| //    pair.key = key | ||||
| //    pair.value = value | ||||
| // | ||||
| //    if (!PUSH(&context, | ||||
| //                document.nodes.start[mapping-1].data.mapping.pairs, pair)) | ||||
| //        return 0 | ||||
| // | ||||
| //    return 1 | ||||
| //} | ||||
| // | ||||
| // | ||||
							
								
								
									
										683
									
								
								vendor/github.com/mattermost/platform/vendor/gopkg.in/yaml.v2/decode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										683
									
								
								vendor/github.com/mattermost/platform/vendor/gopkg.in/yaml.v2/decode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,683 @@ | ||||
| package yaml | ||||
|  | ||||
| import ( | ||||
| 	"encoding" | ||||
| 	"encoding/base64" | ||||
| 	"fmt" | ||||
| 	"math" | ||||
| 	"reflect" | ||||
| 	"strconv" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	documentNode = 1 << iota | ||||
| 	mappingNode | ||||
| 	sequenceNode | ||||
| 	scalarNode | ||||
| 	aliasNode | ||||
| ) | ||||
|  | ||||
| type node struct { | ||||
| 	kind         int | ||||
| 	line, column int | ||||
| 	tag          string | ||||
| 	value        string | ||||
| 	implicit     bool | ||||
| 	children     []*node | ||||
| 	anchors      map[string]*node | ||||
| } | ||||
|  | ||||
| // ---------------------------------------------------------------------------- | ||||
| // Parser, produces a node tree out of a libyaml event stream. | ||||
|  | ||||
| type parser struct { | ||||
| 	parser yaml_parser_t | ||||
| 	event  yaml_event_t | ||||
| 	doc    *node | ||||
| } | ||||
|  | ||||
| func newParser(b []byte) *parser { | ||||
| 	p := parser{} | ||||
| 	if !yaml_parser_initialize(&p.parser) { | ||||
| 		panic("failed to initialize YAML emitter") | ||||
| 	} | ||||
|  | ||||
| 	if len(b) == 0 { | ||||
| 		b = []byte{'\n'} | ||||
| 	} | ||||
|  | ||||
| 	yaml_parser_set_input_string(&p.parser, b) | ||||
|  | ||||
| 	p.skip() | ||||
| 	if p.event.typ != yaml_STREAM_START_EVENT { | ||||
| 		panic("expected stream start event, got " + strconv.Itoa(int(p.event.typ))) | ||||
| 	} | ||||
| 	p.skip() | ||||
| 	return &p | ||||
| } | ||||
|  | ||||
| func (p *parser) destroy() { | ||||
| 	if p.event.typ != yaml_NO_EVENT { | ||||
| 		yaml_event_delete(&p.event) | ||||
| 	} | ||||
| 	yaml_parser_delete(&p.parser) | ||||
| } | ||||
|  | ||||
| func (p *parser) skip() { | ||||
| 	if p.event.typ != yaml_NO_EVENT { | ||||
| 		if p.event.typ == yaml_STREAM_END_EVENT { | ||||
| 			failf("attempted to go past the end of stream; corrupted value?") | ||||
| 		} | ||||
| 		yaml_event_delete(&p.event) | ||||
| 	} | ||||
| 	if !yaml_parser_parse(&p.parser, &p.event) { | ||||
| 		p.fail() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (p *parser) fail() { | ||||
| 	var where string | ||||
| 	var line int | ||||
| 	if p.parser.problem_mark.line != 0 { | ||||
| 		line = p.parser.problem_mark.line | ||||
| 	} else if p.parser.context_mark.line != 0 { | ||||
| 		line = p.parser.context_mark.line | ||||
| 	} | ||||
| 	if line != 0 { | ||||
| 		where = "line " + strconv.Itoa(line) + ": " | ||||
| 	} | ||||
| 	var msg string | ||||
| 	if len(p.parser.problem) > 0 { | ||||
| 		msg = p.parser.problem | ||||
| 	} else { | ||||
| 		msg = "unknown problem parsing YAML content" | ||||
| 	} | ||||
| 	failf("%s%s", where, msg) | ||||
| } | ||||
|  | ||||
| func (p *parser) anchor(n *node, anchor []byte) { | ||||
| 	if anchor != nil { | ||||
| 		p.doc.anchors[string(anchor)] = n | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (p *parser) parse() *node { | ||||
| 	switch p.event.typ { | ||||
| 	case yaml_SCALAR_EVENT: | ||||
| 		return p.scalar() | ||||
| 	case yaml_ALIAS_EVENT: | ||||
| 		return p.alias() | ||||
| 	case yaml_MAPPING_START_EVENT: | ||||
| 		return p.mapping() | ||||
| 	case yaml_SEQUENCE_START_EVENT: | ||||
| 		return p.sequence() | ||||
| 	case yaml_DOCUMENT_START_EVENT: | ||||
| 		return p.document() | ||||
| 	case yaml_STREAM_END_EVENT: | ||||
| 		// Happens when attempting to decode an empty buffer. | ||||
| 		return nil | ||||
| 	default: | ||||
| 		panic("attempted to parse unknown event: " + strconv.Itoa(int(p.event.typ))) | ||||
| 	} | ||||
| 	panic("unreachable") | ||||
| } | ||||
|  | ||||
| func (p *parser) node(kind int) *node { | ||||
| 	return &node{ | ||||
| 		kind:   kind, | ||||
| 		line:   p.event.start_mark.line, | ||||
| 		column: p.event.start_mark.column, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (p *parser) document() *node { | ||||
| 	n := p.node(documentNode) | ||||
| 	n.anchors = make(map[string]*node) | ||||
| 	p.doc = n | ||||
| 	p.skip() | ||||
| 	n.children = append(n.children, p.parse()) | ||||
| 	if p.event.typ != yaml_DOCUMENT_END_EVENT { | ||||
| 		panic("expected end of document event but got " + strconv.Itoa(int(p.event.typ))) | ||||
| 	} | ||||
| 	p.skip() | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| func (p *parser) alias() *node { | ||||
| 	n := p.node(aliasNode) | ||||
| 	n.value = string(p.event.anchor) | ||||
| 	p.skip() | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| func (p *parser) scalar() *node { | ||||
| 	n := p.node(scalarNode) | ||||
| 	n.value = string(p.event.value) | ||||
| 	n.tag = string(p.event.tag) | ||||
| 	n.implicit = p.event.implicit | ||||
| 	p.anchor(n, p.event.anchor) | ||||
| 	p.skip() | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| func (p *parser) sequence() *node { | ||||
| 	n := p.node(sequenceNode) | ||||
| 	p.anchor(n, p.event.anchor) | ||||
| 	p.skip() | ||||
| 	for p.event.typ != yaml_SEQUENCE_END_EVENT { | ||||
| 		n.children = append(n.children, p.parse()) | ||||
| 	} | ||||
| 	p.skip() | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| func (p *parser) mapping() *node { | ||||
| 	n := p.node(mappingNode) | ||||
| 	p.anchor(n, p.event.anchor) | ||||
| 	p.skip() | ||||
| 	for p.event.typ != yaml_MAPPING_END_EVENT { | ||||
| 		n.children = append(n.children, p.parse(), p.parse()) | ||||
| 	} | ||||
| 	p.skip() | ||||
| 	return n | ||||
| } | ||||
|  | ||||
| // ---------------------------------------------------------------------------- | ||||
| // Decoder, unmarshals a node into a provided value. | ||||
|  | ||||
| type decoder struct { | ||||
| 	doc     *node | ||||
| 	aliases map[string]bool | ||||
| 	mapType reflect.Type | ||||
| 	terrors []string | ||||
| } | ||||
|  | ||||
| var ( | ||||
| 	mapItemType    = reflect.TypeOf(MapItem{}) | ||||
| 	durationType   = reflect.TypeOf(time.Duration(0)) | ||||
| 	defaultMapType = reflect.TypeOf(map[interface{}]interface{}{}) | ||||
| 	ifaceType      = defaultMapType.Elem() | ||||
| ) | ||||
|  | ||||
| func newDecoder() *decoder { | ||||
| 	d := &decoder{mapType: defaultMapType} | ||||
| 	d.aliases = make(map[string]bool) | ||||
| 	return d | ||||
| } | ||||
|  | ||||
| func (d *decoder) terror(n *node, tag string, out reflect.Value) { | ||||
| 	if n.tag != "" { | ||||
| 		tag = n.tag | ||||
| 	} | ||||
| 	value := n.value | ||||
| 	if tag != yaml_SEQ_TAG && tag != yaml_MAP_TAG { | ||||
| 		if len(value) > 10 { | ||||
| 			value = " `" + value[:7] + "...`" | ||||
| 		} else { | ||||
| 			value = " `" + value + "`" | ||||
| 		} | ||||
| 	} | ||||
| 	d.terrors = append(d.terrors, fmt.Sprintf("line %d: cannot unmarshal %s%s into %s", n.line+1, shortTag(tag), value, out.Type())) | ||||
| } | ||||
|  | ||||
| func (d *decoder) callUnmarshaler(n *node, u Unmarshaler) (good bool) { | ||||
| 	terrlen := len(d.terrors) | ||||
| 	err := u.UnmarshalYAML(func(v interface{}) (err error) { | ||||
| 		defer handleErr(&err) | ||||
| 		d.unmarshal(n, reflect.ValueOf(v)) | ||||
| 		if len(d.terrors) > terrlen { | ||||
| 			issues := d.terrors[terrlen:] | ||||
| 			d.terrors = d.terrors[:terrlen] | ||||
| 			return &TypeError{issues} | ||||
| 		} | ||||
| 		return nil | ||||
| 	}) | ||||
| 	if e, ok := err.(*TypeError); ok { | ||||
| 		d.terrors = append(d.terrors, e.Errors...) | ||||
| 		return false | ||||
| 	} | ||||
| 	if err != nil { | ||||
| 		fail(err) | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| // d.prepare initializes and dereferences pointers and calls UnmarshalYAML | ||||
| // if a value is found to implement it. | ||||
| // It returns the initialized and dereferenced out value, whether | ||||
| // unmarshalling was already done by UnmarshalYAML, and if so whether | ||||
| // its types unmarshalled appropriately. | ||||
| // | ||||
| // If n holds a null value, prepare returns before doing anything. | ||||
| func (d *decoder) prepare(n *node, out reflect.Value) (newout reflect.Value, unmarshaled, good bool) { | ||||
| 	if n.tag == yaml_NULL_TAG || n.kind == scalarNode && n.tag == "" && (n.value == "null" || n.value == "" && n.implicit) { | ||||
| 		return out, false, false | ||||
| 	} | ||||
| 	again := true | ||||
| 	for again { | ||||
| 		again = false | ||||
| 		if out.Kind() == reflect.Ptr { | ||||
| 			if out.IsNil() { | ||||
| 				out.Set(reflect.New(out.Type().Elem())) | ||||
| 			} | ||||
| 			out = out.Elem() | ||||
| 			again = true | ||||
| 		} | ||||
| 		if out.CanAddr() { | ||||
| 			if u, ok := out.Addr().Interface().(Unmarshaler); ok { | ||||
| 				good = d.callUnmarshaler(n, u) | ||||
| 				return out, true, good | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return out, false, false | ||||
| } | ||||
|  | ||||
| func (d *decoder) unmarshal(n *node, out reflect.Value) (good bool) { | ||||
| 	switch n.kind { | ||||
| 	case documentNode: | ||||
| 		return d.document(n, out) | ||||
| 	case aliasNode: | ||||
| 		return d.alias(n, out) | ||||
| 	} | ||||
| 	out, unmarshaled, good := d.prepare(n, out) | ||||
| 	if unmarshaled { | ||||
| 		return good | ||||
| 	} | ||||
| 	switch n.kind { | ||||
| 	case scalarNode: | ||||
| 		good = d.scalar(n, out) | ||||
| 	case mappingNode: | ||||
| 		good = d.mapping(n, out) | ||||
| 	case sequenceNode: | ||||
| 		good = d.sequence(n, out) | ||||
| 	default: | ||||
| 		panic("internal error: unknown node kind: " + strconv.Itoa(n.kind)) | ||||
| 	} | ||||
| 	return good | ||||
| } | ||||
|  | ||||
| func (d *decoder) document(n *node, out reflect.Value) (good bool) { | ||||
| 	if len(n.children) == 1 { | ||||
| 		d.doc = n | ||||
| 		d.unmarshal(n.children[0], out) | ||||
| 		return true | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func (d *decoder) alias(n *node, out reflect.Value) (good bool) { | ||||
| 	an, ok := d.doc.anchors[n.value] | ||||
| 	if !ok { | ||||
| 		failf("unknown anchor '%s' referenced", n.value) | ||||
| 	} | ||||
| 	if d.aliases[n.value] { | ||||
| 		failf("anchor '%s' value contains itself", n.value) | ||||
| 	} | ||||
| 	d.aliases[n.value] = true | ||||
| 	good = d.unmarshal(an, out) | ||||
| 	delete(d.aliases, n.value) | ||||
| 	return good | ||||
| } | ||||
|  | ||||
| var zeroValue reflect.Value | ||||
|  | ||||
| func resetMap(out reflect.Value) { | ||||
| 	for _, k := range out.MapKeys() { | ||||
| 		out.SetMapIndex(k, zeroValue) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (d *decoder) scalar(n *node, out reflect.Value) (good bool) { | ||||
| 	var tag string | ||||
| 	var resolved interface{} | ||||
| 	if n.tag == "" && !n.implicit { | ||||
| 		tag = yaml_STR_TAG | ||||
| 		resolved = n.value | ||||
| 	} else { | ||||
| 		tag, resolved = resolve(n.tag, n.value) | ||||
| 		if tag == yaml_BINARY_TAG { | ||||
| 			data, err := base64.StdEncoding.DecodeString(resolved.(string)) | ||||
| 			if err != nil { | ||||
| 				failf("!!binary value contains invalid base64 data") | ||||
| 			} | ||||
| 			resolved = string(data) | ||||
| 		} | ||||
| 	} | ||||
| 	if resolved == nil { | ||||
| 		if out.Kind() == reflect.Map && !out.CanAddr() { | ||||
| 			resetMap(out) | ||||
| 		} else { | ||||
| 			out.Set(reflect.Zero(out.Type())) | ||||
| 		} | ||||
| 		return true | ||||
| 	} | ||||
| 	if s, ok := resolved.(string); ok && out.CanAddr() { | ||||
| 		if u, ok := out.Addr().Interface().(encoding.TextUnmarshaler); ok { | ||||
| 			err := u.UnmarshalText([]byte(s)) | ||||
| 			if err != nil { | ||||
| 				fail(err) | ||||
| 			} | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	switch out.Kind() { | ||||
| 	case reflect.String: | ||||
| 		if tag == yaml_BINARY_TAG { | ||||
| 			out.SetString(resolved.(string)) | ||||
| 			good = true | ||||
| 		} else if resolved != nil { | ||||
| 			out.SetString(n.value) | ||||
| 			good = true | ||||
| 		} | ||||
| 	case reflect.Interface: | ||||
| 		if resolved == nil { | ||||
| 			out.Set(reflect.Zero(out.Type())) | ||||
| 		} else { | ||||
| 			out.Set(reflect.ValueOf(resolved)) | ||||
| 		} | ||||
| 		good = true | ||||
| 	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: | ||||
| 		switch resolved := resolved.(type) { | ||||
| 		case int: | ||||
| 			if !out.OverflowInt(int64(resolved)) { | ||||
| 				out.SetInt(int64(resolved)) | ||||
| 				good = true | ||||
| 			} | ||||
| 		case int64: | ||||
| 			if !out.OverflowInt(resolved) { | ||||
| 				out.SetInt(resolved) | ||||
| 				good = true | ||||
| 			} | ||||
| 		case uint64: | ||||
| 			if resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) { | ||||
| 				out.SetInt(int64(resolved)) | ||||
| 				good = true | ||||
| 			} | ||||
| 		case float64: | ||||
| 			if resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) { | ||||
| 				out.SetInt(int64(resolved)) | ||||
| 				good = true | ||||
| 			} | ||||
| 		case string: | ||||
| 			if out.Type() == durationType { | ||||
| 				d, err := time.ParseDuration(resolved) | ||||
| 				if err == nil { | ||||
| 					out.SetInt(int64(d)) | ||||
| 					good = true | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: | ||||
| 		switch resolved := resolved.(type) { | ||||
| 		case int: | ||||
| 			if resolved >= 0 && !out.OverflowUint(uint64(resolved)) { | ||||
| 				out.SetUint(uint64(resolved)) | ||||
| 				good = true | ||||
| 			} | ||||
| 		case int64: | ||||
| 			if resolved >= 0 && !out.OverflowUint(uint64(resolved)) { | ||||
| 				out.SetUint(uint64(resolved)) | ||||
| 				good = true | ||||
| 			} | ||||
| 		case uint64: | ||||
| 			if !out.OverflowUint(uint64(resolved)) { | ||||
| 				out.SetUint(uint64(resolved)) | ||||
| 				good = true | ||||
| 			} | ||||
| 		case float64: | ||||
| 			if resolved <= math.MaxUint64 && !out.OverflowUint(uint64(resolved)) { | ||||
| 				out.SetUint(uint64(resolved)) | ||||
| 				good = true | ||||
| 			} | ||||
| 		} | ||||
| 	case reflect.Bool: | ||||
| 		switch resolved := resolved.(type) { | ||||
| 		case bool: | ||||
| 			out.SetBool(resolved) | ||||
| 			good = true | ||||
| 		} | ||||
| 	case reflect.Float32, reflect.Float64: | ||||
| 		switch resolved := resolved.(type) { | ||||
| 		case int: | ||||
| 			out.SetFloat(float64(resolved)) | ||||
| 			good = true | ||||
| 		case int64: | ||||
| 			out.SetFloat(float64(resolved)) | ||||
| 			good = true | ||||
| 		case uint64: | ||||
| 			out.SetFloat(float64(resolved)) | ||||
| 			good = true | ||||
| 		case float64: | ||||
| 			out.SetFloat(resolved) | ||||
| 			good = true | ||||
| 		} | ||||
| 	case reflect.Ptr: | ||||
| 		if out.Type().Elem() == reflect.TypeOf(resolved) { | ||||
| 			// TODO DOes this make sense? When is out a Ptr except when decoding a nil value? | ||||
| 			elem := reflect.New(out.Type().Elem()) | ||||
| 			elem.Elem().Set(reflect.ValueOf(resolved)) | ||||
| 			out.Set(elem) | ||||
| 			good = true | ||||
| 		} | ||||
| 	} | ||||
| 	if !good { | ||||
| 		d.terror(n, tag, out) | ||||
| 	} | ||||
| 	return good | ||||
| } | ||||
|  | ||||
| func settableValueOf(i interface{}) reflect.Value { | ||||
| 	v := reflect.ValueOf(i) | ||||
| 	sv := reflect.New(v.Type()).Elem() | ||||
| 	sv.Set(v) | ||||
| 	return sv | ||||
| } | ||||
|  | ||||
| func (d *decoder) sequence(n *node, out reflect.Value) (good bool) { | ||||
| 	l := len(n.children) | ||||
|  | ||||
| 	var iface reflect.Value | ||||
| 	switch out.Kind() { | ||||
| 	case reflect.Slice: | ||||
| 		out.Set(reflect.MakeSlice(out.Type(), l, l)) | ||||
| 	case reflect.Interface: | ||||
| 		// No type hints. Will have to use a generic sequence. | ||||
| 		iface = out | ||||
| 		out = settableValueOf(make([]interface{}, l)) | ||||
| 	default: | ||||
| 		d.terror(n, yaml_SEQ_TAG, out) | ||||
| 		return false | ||||
| 	} | ||||
| 	et := out.Type().Elem() | ||||
|  | ||||
| 	j := 0 | ||||
| 	for i := 0; i < l; i++ { | ||||
| 		e := reflect.New(et).Elem() | ||||
| 		if ok := d.unmarshal(n.children[i], e); ok { | ||||
| 			out.Index(j).Set(e) | ||||
| 			j++ | ||||
| 		} | ||||
| 	} | ||||
| 	out.Set(out.Slice(0, j)) | ||||
| 	if iface.IsValid() { | ||||
| 		iface.Set(out) | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| func (d *decoder) mapping(n *node, out reflect.Value) (good bool) { | ||||
| 	switch out.Kind() { | ||||
| 	case reflect.Struct: | ||||
| 		return d.mappingStruct(n, out) | ||||
| 	case reflect.Slice: | ||||
| 		return d.mappingSlice(n, out) | ||||
| 	case reflect.Map: | ||||
| 		// okay | ||||
| 	case reflect.Interface: | ||||
| 		if d.mapType.Kind() == reflect.Map { | ||||
| 			iface := out | ||||
| 			out = reflect.MakeMap(d.mapType) | ||||
| 			iface.Set(out) | ||||
| 		} else { | ||||
| 			slicev := reflect.New(d.mapType).Elem() | ||||
| 			if !d.mappingSlice(n, slicev) { | ||||
| 				return false | ||||
| 			} | ||||
| 			out.Set(slicev) | ||||
| 			return true | ||||
| 		} | ||||
| 	default: | ||||
| 		d.terror(n, yaml_MAP_TAG, out) | ||||
| 		return false | ||||
| 	} | ||||
| 	outt := out.Type() | ||||
| 	kt := outt.Key() | ||||
| 	et := outt.Elem() | ||||
|  | ||||
| 	mapType := d.mapType | ||||
| 	if outt.Key() == ifaceType && outt.Elem() == ifaceType { | ||||
| 		d.mapType = outt | ||||
| 	} | ||||
|  | ||||
| 	if out.IsNil() { | ||||
| 		out.Set(reflect.MakeMap(outt)) | ||||
| 	} | ||||
| 	l := len(n.children) | ||||
| 	for i := 0; i < l; i += 2 { | ||||
| 		if isMerge(n.children[i]) { | ||||
| 			d.merge(n.children[i+1], out) | ||||
| 			continue | ||||
| 		} | ||||
| 		k := reflect.New(kt).Elem() | ||||
| 		if d.unmarshal(n.children[i], k) { | ||||
| 			kkind := k.Kind() | ||||
| 			if kkind == reflect.Interface { | ||||
| 				kkind = k.Elem().Kind() | ||||
| 			} | ||||
| 			if kkind == reflect.Map || kkind == reflect.Slice { | ||||
| 				failf("invalid map key: %#v", k.Interface()) | ||||
| 			} | ||||
| 			e := reflect.New(et).Elem() | ||||
| 			if d.unmarshal(n.children[i+1], e) { | ||||
| 				out.SetMapIndex(k, e) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	d.mapType = mapType | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| func (d *decoder) mappingSlice(n *node, out reflect.Value) (good bool) { | ||||
| 	outt := out.Type() | ||||
| 	if outt.Elem() != mapItemType { | ||||
| 		d.terror(n, yaml_MAP_TAG, out) | ||||
| 		return false | ||||
| 	} | ||||
|  | ||||
| 	mapType := d.mapType | ||||
| 	d.mapType = outt | ||||
|  | ||||
| 	var slice []MapItem | ||||
| 	var l = len(n.children) | ||||
| 	for i := 0; i < l; i += 2 { | ||||
| 		if isMerge(n.children[i]) { | ||||
| 			d.merge(n.children[i+1], out) | ||||
| 			continue | ||||
| 		} | ||||
| 		item := MapItem{} | ||||
| 		k := reflect.ValueOf(&item.Key).Elem() | ||||
| 		if d.unmarshal(n.children[i], k) { | ||||
| 			v := reflect.ValueOf(&item.Value).Elem() | ||||
| 			if d.unmarshal(n.children[i+1], v) { | ||||
| 				slice = append(slice, item) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	out.Set(reflect.ValueOf(slice)) | ||||
| 	d.mapType = mapType | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| func (d *decoder) mappingStruct(n *node, out reflect.Value) (good bool) { | ||||
| 	sinfo, err := getStructInfo(out.Type()) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	name := settableValueOf("") | ||||
| 	l := len(n.children) | ||||
|  | ||||
| 	var inlineMap reflect.Value | ||||
| 	var elemType reflect.Type | ||||
| 	if sinfo.InlineMap != -1 { | ||||
| 		inlineMap = out.Field(sinfo.InlineMap) | ||||
| 		inlineMap.Set(reflect.New(inlineMap.Type()).Elem()) | ||||
| 		elemType = inlineMap.Type().Elem() | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < l; i += 2 { | ||||
| 		ni := n.children[i] | ||||
| 		if isMerge(ni) { | ||||
| 			d.merge(n.children[i+1], out) | ||||
| 			continue | ||||
| 		} | ||||
| 		if !d.unmarshal(ni, name) { | ||||
| 			continue | ||||
| 		} | ||||
| 		if info, ok := sinfo.FieldsMap[name.String()]; ok { | ||||
| 			var field reflect.Value | ||||
| 			if info.Inline == nil { | ||||
| 				field = out.Field(info.Num) | ||||
| 			} else { | ||||
| 				field = out.FieldByIndex(info.Inline) | ||||
| 			} | ||||
| 			d.unmarshal(n.children[i+1], field) | ||||
| 		} else if sinfo.InlineMap != -1 { | ||||
| 			if inlineMap.IsNil() { | ||||
| 				inlineMap.Set(reflect.MakeMap(inlineMap.Type())) | ||||
| 			} | ||||
| 			value := reflect.New(elemType).Elem() | ||||
| 			d.unmarshal(n.children[i+1], value) | ||||
| 			inlineMap.SetMapIndex(name, value) | ||||
| 		} | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| func failWantMap() { | ||||
| 	failf("map merge requires map or sequence of maps as the value") | ||||
| } | ||||
|  | ||||
| func (d *decoder) merge(n *node, out reflect.Value) { | ||||
| 	switch n.kind { | ||||
| 	case mappingNode: | ||||
| 		d.unmarshal(n, out) | ||||
| 	case aliasNode: | ||||
| 		an, ok := d.doc.anchors[n.value] | ||||
| 		if ok && an.kind != mappingNode { | ||||
| 			failWantMap() | ||||
| 		} | ||||
| 		d.unmarshal(n, out) | ||||
| 	case sequenceNode: | ||||
| 		// Step backwards as earlier nodes take precedence. | ||||
| 		for i := len(n.children) - 1; i >= 0; i-- { | ||||
| 			ni := n.children[i] | ||||
| 			if ni.kind == aliasNode { | ||||
| 				an, ok := d.doc.anchors[ni.value] | ||||
| 				if ok && an.kind != mappingNode { | ||||
| 					failWantMap() | ||||
| 				} | ||||
| 			} else if ni.kind != mappingNode { | ||||
| 				failWantMap() | ||||
| 			} | ||||
| 			d.unmarshal(ni, out) | ||||
| 		} | ||||
| 	default: | ||||
| 		failWantMap() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func isMerge(n *node) bool { | ||||
| 	return n.kind == scalarNode && n.value == "<<" && (n.implicit == true || n.tag == yaml_MERGE_TAG) | ||||
| } | ||||
							
								
								
									
										1685
									
								
								vendor/github.com/mattermost/platform/vendor/gopkg.in/yaml.v2/emitterc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1685
									
								
								vendor/github.com/mattermost/platform/vendor/gopkg.in/yaml.v2/emitterc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										306
									
								
								vendor/github.com/mattermost/platform/vendor/gopkg.in/yaml.v2/encode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										306
									
								
								vendor/github.com/mattermost/platform/vendor/gopkg.in/yaml.v2/encode.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,306 @@ | ||||
| package yaml | ||||
|  | ||||
| import ( | ||||
| 	"encoding" | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"regexp" | ||||
| 	"sort" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| type encoder struct { | ||||
| 	emitter yaml_emitter_t | ||||
| 	event   yaml_event_t | ||||
| 	out     []byte | ||||
| 	flow    bool | ||||
| } | ||||
|  | ||||
| func newEncoder() (e *encoder) { | ||||
| 	e = &encoder{} | ||||
| 	e.must(yaml_emitter_initialize(&e.emitter)) | ||||
| 	yaml_emitter_set_output_string(&e.emitter, &e.out) | ||||
| 	yaml_emitter_set_unicode(&e.emitter, true) | ||||
| 	e.must(yaml_stream_start_event_initialize(&e.event, yaml_UTF8_ENCODING)) | ||||
| 	e.emit() | ||||
| 	e.must(yaml_document_start_event_initialize(&e.event, nil, nil, true)) | ||||
| 	e.emit() | ||||
| 	return e | ||||
| } | ||||
|  | ||||
| func (e *encoder) finish() { | ||||
| 	e.must(yaml_document_end_event_initialize(&e.event, true)) | ||||
| 	e.emit() | ||||
| 	e.emitter.open_ended = false | ||||
| 	e.must(yaml_stream_end_event_initialize(&e.event)) | ||||
| 	e.emit() | ||||
| } | ||||
|  | ||||
| func (e *encoder) destroy() { | ||||
| 	yaml_emitter_delete(&e.emitter) | ||||
| } | ||||
|  | ||||
| func (e *encoder) emit() { | ||||
| 	// This will internally delete the e.event value. | ||||
| 	if !yaml_emitter_emit(&e.emitter, &e.event) && e.event.typ != yaml_DOCUMENT_END_EVENT && e.event.typ != yaml_STREAM_END_EVENT { | ||||
| 		e.must(false) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (e *encoder) must(ok bool) { | ||||
| 	if !ok { | ||||
| 		msg := e.emitter.problem | ||||
| 		if msg == "" { | ||||
| 			msg = "unknown problem generating YAML content" | ||||
| 		} | ||||
| 		failf("%s", msg) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (e *encoder) marshal(tag string, in reflect.Value) { | ||||
| 	if !in.IsValid() { | ||||
| 		e.nilv() | ||||
| 		return | ||||
| 	} | ||||
| 	iface := in.Interface() | ||||
| 	if m, ok := iface.(Marshaler); ok { | ||||
| 		v, err := m.MarshalYAML() | ||||
| 		if err != nil { | ||||
| 			fail(err) | ||||
| 		} | ||||
| 		if v == nil { | ||||
| 			e.nilv() | ||||
| 			return | ||||
| 		} | ||||
| 		in = reflect.ValueOf(v) | ||||
| 	} else if m, ok := iface.(encoding.TextMarshaler); ok { | ||||
| 		text, err := m.MarshalText() | ||||
| 		if err != nil { | ||||
| 			fail(err) | ||||
| 		} | ||||
| 		in = reflect.ValueOf(string(text)) | ||||
| 	} | ||||
| 	switch in.Kind() { | ||||
| 	case reflect.Interface: | ||||
| 		if in.IsNil() { | ||||
| 			e.nilv() | ||||
| 		} else { | ||||
| 			e.marshal(tag, in.Elem()) | ||||
| 		} | ||||
| 	case reflect.Map: | ||||
| 		e.mapv(tag, in) | ||||
| 	case reflect.Ptr: | ||||
| 		if in.IsNil() { | ||||
| 			e.nilv() | ||||
| 		} else { | ||||
| 			e.marshal(tag, in.Elem()) | ||||
| 		} | ||||
| 	case reflect.Struct: | ||||
| 		e.structv(tag, in) | ||||
| 	case reflect.Slice: | ||||
| 		if in.Type().Elem() == mapItemType { | ||||
| 			e.itemsv(tag, in) | ||||
| 		} else { | ||||
| 			e.slicev(tag, in) | ||||
| 		} | ||||
| 	case reflect.String: | ||||
| 		e.stringv(tag, in) | ||||
| 	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: | ||||
| 		if in.Type() == durationType { | ||||
| 			e.stringv(tag, reflect.ValueOf(iface.(time.Duration).String())) | ||||
| 		} else { | ||||
| 			e.intv(tag, in) | ||||
| 		} | ||||
| 	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: | ||||
| 		e.uintv(tag, in) | ||||
| 	case reflect.Float32, reflect.Float64: | ||||
| 		e.floatv(tag, in) | ||||
| 	case reflect.Bool: | ||||
| 		e.boolv(tag, in) | ||||
| 	default: | ||||
| 		panic("cannot marshal type: " + in.Type().String()) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (e *encoder) mapv(tag string, in reflect.Value) { | ||||
| 	e.mappingv(tag, func() { | ||||
| 		keys := keyList(in.MapKeys()) | ||||
| 		sort.Sort(keys) | ||||
| 		for _, k := range keys { | ||||
| 			e.marshal("", k) | ||||
| 			e.marshal("", in.MapIndex(k)) | ||||
| 		} | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func (e *encoder) itemsv(tag string, in reflect.Value) { | ||||
| 	e.mappingv(tag, func() { | ||||
| 		slice := in.Convert(reflect.TypeOf([]MapItem{})).Interface().([]MapItem) | ||||
| 		for _, item := range slice { | ||||
| 			e.marshal("", reflect.ValueOf(item.Key)) | ||||
| 			e.marshal("", reflect.ValueOf(item.Value)) | ||||
| 		} | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func (e *encoder) structv(tag string, in reflect.Value) { | ||||
| 	sinfo, err := getStructInfo(in.Type()) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	e.mappingv(tag, func() { | ||||
| 		for _, info := range sinfo.FieldsList { | ||||
| 			var value reflect.Value | ||||
| 			if info.Inline == nil { | ||||
| 				value = in.Field(info.Num) | ||||
| 			} else { | ||||
| 				value = in.FieldByIndex(info.Inline) | ||||
| 			} | ||||
| 			if info.OmitEmpty && isZero(value) { | ||||
| 				continue | ||||
| 			} | ||||
| 			e.marshal("", reflect.ValueOf(info.Key)) | ||||
| 			e.flow = info.Flow | ||||
| 			e.marshal("", value) | ||||
| 		} | ||||
| 		if sinfo.InlineMap >= 0 { | ||||
| 			m := in.Field(sinfo.InlineMap) | ||||
| 			if m.Len() > 0 { | ||||
| 				e.flow = false | ||||
| 				keys := keyList(m.MapKeys()) | ||||
| 				sort.Sort(keys) | ||||
| 				for _, k := range keys { | ||||
| 					if _, found := sinfo.FieldsMap[k.String()]; found { | ||||
| 						panic(fmt.Sprintf("Can't have key %q in inlined map; conflicts with struct field", k.String())) | ||||
| 					} | ||||
| 					e.marshal("", k) | ||||
| 					e.flow = false | ||||
| 					e.marshal("", m.MapIndex(k)) | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func (e *encoder) mappingv(tag string, f func()) { | ||||
| 	implicit := tag == "" | ||||
| 	style := yaml_BLOCK_MAPPING_STYLE | ||||
| 	if e.flow { | ||||
| 		e.flow = false | ||||
| 		style = yaml_FLOW_MAPPING_STYLE | ||||
| 	} | ||||
| 	e.must(yaml_mapping_start_event_initialize(&e.event, nil, []byte(tag), implicit, style)) | ||||
| 	e.emit() | ||||
| 	f() | ||||
| 	e.must(yaml_mapping_end_event_initialize(&e.event)) | ||||
| 	e.emit() | ||||
| } | ||||
|  | ||||
| func (e *encoder) slicev(tag string, in reflect.Value) { | ||||
| 	implicit := tag == "" | ||||
| 	style := yaml_BLOCK_SEQUENCE_STYLE | ||||
| 	if e.flow { | ||||
| 		e.flow = false | ||||
| 		style = yaml_FLOW_SEQUENCE_STYLE | ||||
| 	} | ||||
| 	e.must(yaml_sequence_start_event_initialize(&e.event, nil, []byte(tag), implicit, style)) | ||||
| 	e.emit() | ||||
| 	n := in.Len() | ||||
| 	for i := 0; i < n; i++ { | ||||
| 		e.marshal("", in.Index(i)) | ||||
| 	} | ||||
| 	e.must(yaml_sequence_end_event_initialize(&e.event)) | ||||
| 	e.emit() | ||||
| } | ||||
|  | ||||
| // isBase60 returns whether s is in base 60 notation as defined in YAML 1.1. | ||||
| // | ||||
| // The base 60 float notation in YAML 1.1 is a terrible idea and is unsupported | ||||
| // in YAML 1.2 and by this package, but these should be marshalled quoted for | ||||
| // the time being for compatibility with other parsers. | ||||
| func isBase60Float(s string) (result bool) { | ||||
| 	// Fast path. | ||||
| 	if s == "" { | ||||
| 		return false | ||||
| 	} | ||||
| 	c := s[0] | ||||
| 	if !(c == '+' || c == '-' || c >= '0' && c <= '9') || strings.IndexByte(s, ':') < 0 { | ||||
| 		return false | ||||
| 	} | ||||
| 	// Do the full match. | ||||
| 	return base60float.MatchString(s) | ||||
| } | ||||
|  | ||||
| // From http://yaml.org/type/float.html, except the regular expression there | ||||
| // is bogus. In practice parsers do not enforce the "\.[0-9_]*" suffix. | ||||
| var base60float = regexp.MustCompile(`^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+(?:\.[0-9_]*)?$`) | ||||
|  | ||||
| func (e *encoder) stringv(tag string, in reflect.Value) { | ||||
| 	var style yaml_scalar_style_t | ||||
| 	s := in.String() | ||||
| 	rtag, rs := resolve("", s) | ||||
| 	if rtag == yaml_BINARY_TAG { | ||||
| 		if tag == "" || tag == yaml_STR_TAG { | ||||
| 			tag = rtag | ||||
| 			s = rs.(string) | ||||
| 		} else if tag == yaml_BINARY_TAG { | ||||
| 			failf("explicitly tagged !!binary data must be base64-encoded") | ||||
| 		} else { | ||||
| 			failf("cannot marshal invalid UTF-8 data as %s", shortTag(tag)) | ||||
| 		} | ||||
| 	} | ||||
| 	if tag == "" && (rtag != yaml_STR_TAG || isBase60Float(s)) { | ||||
| 		style = yaml_DOUBLE_QUOTED_SCALAR_STYLE | ||||
| 	} else if strings.Contains(s, "\n") { | ||||
| 		style = yaml_LITERAL_SCALAR_STYLE | ||||
| 	} else { | ||||
| 		style = yaml_PLAIN_SCALAR_STYLE | ||||
| 	} | ||||
| 	e.emitScalar(s, "", tag, style) | ||||
| } | ||||
|  | ||||
| func (e *encoder) boolv(tag string, in reflect.Value) { | ||||
| 	var s string | ||||
| 	if in.Bool() { | ||||
| 		s = "true" | ||||
| 	} else { | ||||
| 		s = "false" | ||||
| 	} | ||||
| 	e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) | ||||
| } | ||||
|  | ||||
| func (e *encoder) intv(tag string, in reflect.Value) { | ||||
| 	s := strconv.FormatInt(in.Int(), 10) | ||||
| 	e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) | ||||
| } | ||||
|  | ||||
| func (e *encoder) uintv(tag string, in reflect.Value) { | ||||
| 	s := strconv.FormatUint(in.Uint(), 10) | ||||
| 	e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) | ||||
| } | ||||
|  | ||||
| func (e *encoder) floatv(tag string, in reflect.Value) { | ||||
| 	// FIXME: Handle 64 bits here. | ||||
| 	s := strconv.FormatFloat(float64(in.Float()), 'g', -1, 32) | ||||
| 	switch s { | ||||
| 	case "+Inf": | ||||
| 		s = ".inf" | ||||
| 	case "-Inf": | ||||
| 		s = "-.inf" | ||||
| 	case "NaN": | ||||
| 		s = ".nan" | ||||
| 	} | ||||
| 	e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) | ||||
| } | ||||
|  | ||||
| func (e *encoder) nilv() { | ||||
| 	e.emitScalar("null", "", "", yaml_PLAIN_SCALAR_STYLE) | ||||
| } | ||||
|  | ||||
| func (e *encoder) emitScalar(value, anchor, tag string, style yaml_scalar_style_t) { | ||||
| 	implicit := tag == "" | ||||
| 	e.must(yaml_scalar_event_initialize(&e.event, []byte(anchor), []byte(tag), []byte(value), implicit, implicit, style)) | ||||
| 	e.emit() | ||||
| } | ||||
							
								
								
									
										1096
									
								
								vendor/github.com/mattermost/platform/vendor/gopkg.in/yaml.v2/parserc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1096
									
								
								vendor/github.com/mattermost/platform/vendor/gopkg.in/yaml.v2/parserc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										394
									
								
								vendor/github.com/mattermost/platform/vendor/gopkg.in/yaml.v2/readerc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										394
									
								
								vendor/github.com/mattermost/platform/vendor/gopkg.in/yaml.v2/readerc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,394 @@ | ||||
| package yaml | ||||
|  | ||||
| import ( | ||||
| 	"io" | ||||
| ) | ||||
|  | ||||
| // Set the reader error and return 0. | ||||
| func yaml_parser_set_reader_error(parser *yaml_parser_t, problem string, offset int, value int) bool { | ||||
| 	parser.error = yaml_READER_ERROR | ||||
| 	parser.problem = problem | ||||
| 	parser.problem_offset = offset | ||||
| 	parser.problem_value = value | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| // Byte order marks. | ||||
| const ( | ||||
| 	bom_UTF8    = "\xef\xbb\xbf" | ||||
| 	bom_UTF16LE = "\xff\xfe" | ||||
| 	bom_UTF16BE = "\xfe\xff" | ||||
| ) | ||||
|  | ||||
| // Determine the input stream encoding by checking the BOM symbol. If no BOM is | ||||
| // found, the UTF-8 encoding is assumed. Return 1 on success, 0 on failure. | ||||
| func yaml_parser_determine_encoding(parser *yaml_parser_t) bool { | ||||
| 	// Ensure that we had enough bytes in the raw buffer. | ||||
| 	for !parser.eof && len(parser.raw_buffer)-parser.raw_buffer_pos < 3 { | ||||
| 		if !yaml_parser_update_raw_buffer(parser) { | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Determine the encoding. | ||||
| 	buf := parser.raw_buffer | ||||
| 	pos := parser.raw_buffer_pos | ||||
| 	avail := len(buf) - pos | ||||
| 	if avail >= 2 && buf[pos] == bom_UTF16LE[0] && buf[pos+1] == bom_UTF16LE[1] { | ||||
| 		parser.encoding = yaml_UTF16LE_ENCODING | ||||
| 		parser.raw_buffer_pos += 2 | ||||
| 		parser.offset += 2 | ||||
| 	} else if avail >= 2 && buf[pos] == bom_UTF16BE[0] && buf[pos+1] == bom_UTF16BE[1] { | ||||
| 		parser.encoding = yaml_UTF16BE_ENCODING | ||||
| 		parser.raw_buffer_pos += 2 | ||||
| 		parser.offset += 2 | ||||
| 	} else if avail >= 3 && buf[pos] == bom_UTF8[0] && buf[pos+1] == bom_UTF8[1] && buf[pos+2] == bom_UTF8[2] { | ||||
| 		parser.encoding = yaml_UTF8_ENCODING | ||||
| 		parser.raw_buffer_pos += 3 | ||||
| 		parser.offset += 3 | ||||
| 	} else { | ||||
| 		parser.encoding = yaml_UTF8_ENCODING | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| // Update the raw buffer. | ||||
| func yaml_parser_update_raw_buffer(parser *yaml_parser_t) bool { | ||||
| 	size_read := 0 | ||||
|  | ||||
| 	// Return if the raw buffer is full. | ||||
| 	if parser.raw_buffer_pos == 0 && len(parser.raw_buffer) == cap(parser.raw_buffer) { | ||||
| 		return true | ||||
| 	} | ||||
|  | ||||
| 	// Return on EOF. | ||||
| 	if parser.eof { | ||||
| 		return true | ||||
| 	} | ||||
|  | ||||
| 	// Move the remaining bytes in the raw buffer to the beginning. | ||||
| 	if parser.raw_buffer_pos > 0 && parser.raw_buffer_pos < len(parser.raw_buffer) { | ||||
| 		copy(parser.raw_buffer, parser.raw_buffer[parser.raw_buffer_pos:]) | ||||
| 	} | ||||
| 	parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)-parser.raw_buffer_pos] | ||||
| 	parser.raw_buffer_pos = 0 | ||||
|  | ||||
| 	// Call the read handler to fill the buffer. | ||||
| 	size_read, err := parser.read_handler(parser, parser.raw_buffer[len(parser.raw_buffer):cap(parser.raw_buffer)]) | ||||
| 	parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)+size_read] | ||||
| 	if err == io.EOF { | ||||
| 		parser.eof = true | ||||
| 	} else if err != nil { | ||||
| 		return yaml_parser_set_reader_error(parser, "input error: "+err.Error(), parser.offset, -1) | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| // Ensure that the buffer contains at least `length` characters. | ||||
| // Return true on success, false on failure. | ||||
| // | ||||
| // The length is supposed to be significantly less that the buffer size. | ||||
| func yaml_parser_update_buffer(parser *yaml_parser_t, length int) bool { | ||||
| 	if parser.read_handler == nil { | ||||
| 		panic("read handler must be set") | ||||
| 	} | ||||
|  | ||||
| 	// If the EOF flag is set and the raw buffer is empty, do nothing. | ||||
| 	if parser.eof && parser.raw_buffer_pos == len(parser.raw_buffer) { | ||||
| 		return true | ||||
| 	} | ||||
|  | ||||
| 	// Return if the buffer contains enough characters. | ||||
| 	if parser.unread >= length { | ||||
| 		return true | ||||
| 	} | ||||
|  | ||||
| 	// Determine the input encoding if it is not known yet. | ||||
| 	if parser.encoding == yaml_ANY_ENCODING { | ||||
| 		if !yaml_parser_determine_encoding(parser) { | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Move the unread characters to the beginning of the buffer. | ||||
| 	buffer_len := len(parser.buffer) | ||||
| 	if parser.buffer_pos > 0 && parser.buffer_pos < buffer_len { | ||||
| 		copy(parser.buffer, parser.buffer[parser.buffer_pos:]) | ||||
| 		buffer_len -= parser.buffer_pos | ||||
| 		parser.buffer_pos = 0 | ||||
| 	} else if parser.buffer_pos == buffer_len { | ||||
| 		buffer_len = 0 | ||||
| 		parser.buffer_pos = 0 | ||||
| 	} | ||||
|  | ||||
| 	// Open the whole buffer for writing, and cut it before returning. | ||||
| 	parser.buffer = parser.buffer[:cap(parser.buffer)] | ||||
|  | ||||
| 	// Fill the buffer until it has enough characters. | ||||
| 	first := true | ||||
| 	for parser.unread < length { | ||||
|  | ||||
| 		// Fill the raw buffer if necessary. | ||||
| 		if !first || parser.raw_buffer_pos == len(parser.raw_buffer) { | ||||
| 			if !yaml_parser_update_raw_buffer(parser) { | ||||
| 				parser.buffer = parser.buffer[:buffer_len] | ||||
| 				return false | ||||
| 			} | ||||
| 		} | ||||
| 		first = false | ||||
|  | ||||
| 		// Decode the raw buffer. | ||||
| 	inner: | ||||
| 		for parser.raw_buffer_pos != len(parser.raw_buffer) { | ||||
| 			var value rune | ||||
| 			var width int | ||||
|  | ||||
| 			raw_unread := len(parser.raw_buffer) - parser.raw_buffer_pos | ||||
|  | ||||
| 			// Decode the next character. | ||||
| 			switch parser.encoding { | ||||
| 			case yaml_UTF8_ENCODING: | ||||
| 				// Decode a UTF-8 character.  Check RFC 3629 | ||||
| 				// (http://www.ietf.org/rfc/rfc3629.txt) for more details. | ||||
| 				// | ||||
| 				// The following table (taken from the RFC) is used for | ||||
| 				// decoding. | ||||
| 				// | ||||
| 				//    Char. number range |        UTF-8 octet sequence | ||||
| 				//      (hexadecimal)    |              (binary) | ||||
| 				//   --------------------+------------------------------------ | ||||
| 				//   0000 0000-0000 007F | 0xxxxxxx | ||||
| 				//   0000 0080-0000 07FF | 110xxxxx 10xxxxxx | ||||
| 				//   0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx | ||||
| 				//   0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | ||||
| 				// | ||||
| 				// Additionally, the characters in the range 0xD800-0xDFFF | ||||
| 				// are prohibited as they are reserved for use with UTF-16 | ||||
| 				// surrogate pairs. | ||||
|  | ||||
| 				// Determine the length of the UTF-8 sequence. | ||||
| 				octet := parser.raw_buffer[parser.raw_buffer_pos] | ||||
| 				switch { | ||||
| 				case octet&0x80 == 0x00: | ||||
| 					width = 1 | ||||
| 				case octet&0xE0 == 0xC0: | ||||
| 					width = 2 | ||||
| 				case octet&0xF0 == 0xE0: | ||||
| 					width = 3 | ||||
| 				case octet&0xF8 == 0xF0: | ||||
| 					width = 4 | ||||
| 				default: | ||||
| 					// The leading octet is invalid. | ||||
| 					return yaml_parser_set_reader_error(parser, | ||||
| 						"invalid leading UTF-8 octet", | ||||
| 						parser.offset, int(octet)) | ||||
| 				} | ||||
|  | ||||
| 				// Check if the raw buffer contains an incomplete character. | ||||
| 				if width > raw_unread { | ||||
| 					if parser.eof { | ||||
| 						return yaml_parser_set_reader_error(parser, | ||||
| 							"incomplete UTF-8 octet sequence", | ||||
| 							parser.offset, -1) | ||||
| 					} | ||||
| 					break inner | ||||
| 				} | ||||
|  | ||||
| 				// Decode the leading octet. | ||||
| 				switch { | ||||
| 				case octet&0x80 == 0x00: | ||||
| 					value = rune(octet & 0x7F) | ||||
| 				case octet&0xE0 == 0xC0: | ||||
| 					value = rune(octet & 0x1F) | ||||
| 				case octet&0xF0 == 0xE0: | ||||
| 					value = rune(octet & 0x0F) | ||||
| 				case octet&0xF8 == 0xF0: | ||||
| 					value = rune(octet & 0x07) | ||||
| 				default: | ||||
| 					value = 0 | ||||
| 				} | ||||
|  | ||||
| 				// Check and decode the trailing octets. | ||||
| 				for k := 1; k < width; k++ { | ||||
| 					octet = parser.raw_buffer[parser.raw_buffer_pos+k] | ||||
|  | ||||
| 					// Check if the octet is valid. | ||||
| 					if (octet & 0xC0) != 0x80 { | ||||
| 						return yaml_parser_set_reader_error(parser, | ||||
| 							"invalid trailing UTF-8 octet", | ||||
| 							parser.offset+k, int(octet)) | ||||
| 					} | ||||
|  | ||||
| 					// Decode the octet. | ||||
| 					value = (value << 6) + rune(octet&0x3F) | ||||
| 				} | ||||
|  | ||||
| 				// Check the length of the sequence against the value. | ||||
| 				switch { | ||||
| 				case width == 1: | ||||
| 				case width == 2 && value >= 0x80: | ||||
| 				case width == 3 && value >= 0x800: | ||||
| 				case width == 4 && value >= 0x10000: | ||||
| 				default: | ||||
| 					return yaml_parser_set_reader_error(parser, | ||||
| 						"invalid length of a UTF-8 sequence", | ||||
| 						parser.offset, -1) | ||||
| 				} | ||||
|  | ||||
| 				// Check the range of the value. | ||||
| 				if value >= 0xD800 && value <= 0xDFFF || value > 0x10FFFF { | ||||
| 					return yaml_parser_set_reader_error(parser, | ||||
| 						"invalid Unicode character", | ||||
| 						parser.offset, int(value)) | ||||
| 				} | ||||
|  | ||||
| 			case yaml_UTF16LE_ENCODING, yaml_UTF16BE_ENCODING: | ||||
| 				var low, high int | ||||
| 				if parser.encoding == yaml_UTF16LE_ENCODING { | ||||
| 					low, high = 0, 1 | ||||
| 				} else { | ||||
| 					low, high = 1, 0 | ||||
| 				} | ||||
|  | ||||
| 				// The UTF-16 encoding is not as simple as one might | ||||
| 				// naively think.  Check RFC 2781 | ||||
| 				// (http://www.ietf.org/rfc/rfc2781.txt). | ||||
| 				// | ||||
| 				// Normally, two subsequent bytes describe a Unicode | ||||
| 				// character.  However a special technique (called a | ||||
| 				// surrogate pair) is used for specifying character | ||||
| 				// values larger than 0xFFFF. | ||||
| 				// | ||||
| 				// A surrogate pair consists of two pseudo-characters: | ||||
| 				//      high surrogate area (0xD800-0xDBFF) | ||||
| 				//      low surrogate area (0xDC00-0xDFFF) | ||||
| 				// | ||||
| 				// The following formulas are used for decoding | ||||
| 				// and encoding characters using surrogate pairs: | ||||
| 				// | ||||
| 				//  U  = U' + 0x10000   (0x01 00 00 <= U <= 0x10 FF FF) | ||||
| 				//  U' = yyyyyyyyyyxxxxxxxxxx   (0 <= U' <= 0x0F FF FF) | ||||
| 				//  W1 = 110110yyyyyyyyyy | ||||
| 				//  W2 = 110111xxxxxxxxxx | ||||
| 				// | ||||
| 				// where U is the character value, W1 is the high surrogate | ||||
| 				// area, W2 is the low surrogate area. | ||||
|  | ||||
| 				// Check for incomplete UTF-16 character. | ||||
| 				if raw_unread < 2 { | ||||
| 					if parser.eof { | ||||
| 						return yaml_parser_set_reader_error(parser, | ||||
| 							"incomplete UTF-16 character", | ||||
| 							parser.offset, -1) | ||||
| 					} | ||||
| 					break inner | ||||
| 				} | ||||
|  | ||||
| 				// Get the character. | ||||
| 				value = rune(parser.raw_buffer[parser.raw_buffer_pos+low]) + | ||||
| 					(rune(parser.raw_buffer[parser.raw_buffer_pos+high]) << 8) | ||||
|  | ||||
| 				// Check for unexpected low surrogate area. | ||||
| 				if value&0xFC00 == 0xDC00 { | ||||
| 					return yaml_parser_set_reader_error(parser, | ||||
| 						"unexpected low surrogate area", | ||||
| 						parser.offset, int(value)) | ||||
| 				} | ||||
|  | ||||
| 				// Check for a high surrogate area. | ||||
| 				if value&0xFC00 == 0xD800 { | ||||
| 					width = 4 | ||||
|  | ||||
| 					// Check for incomplete surrogate pair. | ||||
| 					if raw_unread < 4 { | ||||
| 						if parser.eof { | ||||
| 							return yaml_parser_set_reader_error(parser, | ||||
| 								"incomplete UTF-16 surrogate pair", | ||||
| 								parser.offset, -1) | ||||
| 						} | ||||
| 						break inner | ||||
| 					} | ||||
|  | ||||
| 					// Get the next character. | ||||
| 					value2 := rune(parser.raw_buffer[parser.raw_buffer_pos+low+2]) + | ||||
| 						(rune(parser.raw_buffer[parser.raw_buffer_pos+high+2]) << 8) | ||||
|  | ||||
| 					// Check for a low surrogate area. | ||||
| 					if value2&0xFC00 != 0xDC00 { | ||||
| 						return yaml_parser_set_reader_error(parser, | ||||
| 							"expected low surrogate area", | ||||
| 							parser.offset+2, int(value2)) | ||||
| 					} | ||||
|  | ||||
| 					// Generate the value of the surrogate pair. | ||||
| 					value = 0x10000 + ((value & 0x3FF) << 10) + (value2 & 0x3FF) | ||||
| 				} else { | ||||
| 					width = 2 | ||||
| 				} | ||||
|  | ||||
| 			default: | ||||
| 				panic("impossible") | ||||
| 			} | ||||
|  | ||||
| 			// Check if the character is in the allowed range: | ||||
| 			//      #x9 | #xA | #xD | [#x20-#x7E]               (8 bit) | ||||
| 			//      | #x85 | [#xA0-#xD7FF] | [#xE000-#xFFFD]    (16 bit) | ||||
| 			//      | [#x10000-#x10FFFF]                        (32 bit) | ||||
| 			switch { | ||||
| 			case value == 0x09: | ||||
| 			case value == 0x0A: | ||||
| 			case value == 0x0D: | ||||
| 			case value >= 0x20 && value <= 0x7E: | ||||
| 			case value == 0x85: | ||||
| 			case value >= 0xA0 && value <= 0xD7FF: | ||||
| 			case value >= 0xE000 && value <= 0xFFFD: | ||||
| 			case value >= 0x10000 && value <= 0x10FFFF: | ||||
| 			default: | ||||
| 				return yaml_parser_set_reader_error(parser, | ||||
| 					"control characters are not allowed", | ||||
| 					parser.offset, int(value)) | ||||
| 			} | ||||
|  | ||||
| 			// Move the raw pointers. | ||||
| 			parser.raw_buffer_pos += width | ||||
| 			parser.offset += width | ||||
|  | ||||
| 			// Finally put the character into the buffer. | ||||
| 			if value <= 0x7F { | ||||
| 				// 0000 0000-0000 007F . 0xxxxxxx | ||||
| 				parser.buffer[buffer_len+0] = byte(value) | ||||
| 				buffer_len += 1 | ||||
| 			} else if value <= 0x7FF { | ||||
| 				// 0000 0080-0000 07FF . 110xxxxx 10xxxxxx | ||||
| 				parser.buffer[buffer_len+0] = byte(0xC0 + (value >> 6)) | ||||
| 				parser.buffer[buffer_len+1] = byte(0x80 + (value & 0x3F)) | ||||
| 				buffer_len += 2 | ||||
| 			} else if value <= 0xFFFF { | ||||
| 				// 0000 0800-0000 FFFF . 1110xxxx 10xxxxxx 10xxxxxx | ||||
| 				parser.buffer[buffer_len+0] = byte(0xE0 + (value >> 12)) | ||||
| 				parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 6) & 0x3F)) | ||||
| 				parser.buffer[buffer_len+2] = byte(0x80 + (value & 0x3F)) | ||||
| 				buffer_len += 3 | ||||
| 			} else { | ||||
| 				// 0001 0000-0010 FFFF . 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | ||||
| 				parser.buffer[buffer_len+0] = byte(0xF0 + (value >> 18)) | ||||
| 				parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 12) & 0x3F)) | ||||
| 				parser.buffer[buffer_len+2] = byte(0x80 + ((value >> 6) & 0x3F)) | ||||
| 				parser.buffer[buffer_len+3] = byte(0x80 + (value & 0x3F)) | ||||
| 				buffer_len += 4 | ||||
| 			} | ||||
|  | ||||
| 			parser.unread++ | ||||
| 		} | ||||
|  | ||||
| 		// On EOF, put NUL into the buffer and return. | ||||
| 		if parser.eof { | ||||
| 			parser.buffer[buffer_len] = 0 | ||||
| 			buffer_len++ | ||||
| 			parser.unread++ | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 	parser.buffer = parser.buffer[:buffer_len] | ||||
| 	return true | ||||
| } | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user
	 Wim
					Wim