kopia lustrzana https://github.com/reiver/greatape
feat(components): ✨ implement webfinger infrastructure
rodzic
c7539e75e3
commit
0139a38dbe
|
@ -13,6 +13,7 @@ func (factory *httpHandlerFactory) Handlers() []IHttpHandler {
|
|||
GetProfileByUserHandler(), // │ G . /api/v1/profile
|
||||
UpdateProfileByUserHandler(), // │ P . /api/v1/profile
|
||||
LogoutHandler(), // │ P . /api/v1/logout
|
||||
WebfingerHandler(), // │ G . /.well-known/webfinger
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
package handlers
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
. "github.com/xeronith/diamante/contracts/network/http"
|
||||
pipeline "github.com/xeronith/diamante/network/http"
|
||||
. "rail.town/infrastructure/components/api/protobuf"
|
||||
. "rail.town/infrastructure/components/contracts"
|
||||
)
|
||||
|
||||
type webfingerHandler struct {
|
||||
}
|
||||
|
||||
func WebfingerHandler() IHttpHandler {
|
||||
return &webfingerHandler{}
|
||||
}
|
||||
|
||||
func (handler *webfingerHandler) Method() string {
|
||||
return http.MethodGet
|
||||
}
|
||||
|
||||
func (handler *webfingerHandler) Path() string {
|
||||
return "/.well-known/webfinger"
|
||||
}
|
||||
|
||||
func (handler *webfingerHandler) HandlerFunc() HttpHandlerFunc {
|
||||
return func(x IServerDispatcher) error {
|
||||
request := &WebfingerRequest{}
|
||||
result := &WebfingerResult{}
|
||||
|
||||
onRequestUnmarshalled := func(request *WebfingerRequest) {
|
||||
request.Resource = x.Query("resource")
|
||||
}
|
||||
|
||||
return pipeline.Handle(x,
|
||||
"webfinger",
|
||||
WEBFINGER_REQUEST,
|
||||
WEBFINGER_RESULT,
|
||||
request, result,
|
||||
onRequestUnmarshalled,
|
||||
false,
|
||||
)
|
||||
}
|
||||
}
|
|
@ -14,6 +14,7 @@ func (factory *operationFactory) Operations() []IOperation {
|
|||
GetProfileByUserOperation(),
|
||||
UpdateProfileByUserOperation(),
|
||||
LogoutOperation(),
|
||||
WebfingerOperation(),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
package operations
|
||||
|
||||
import (
|
||||
. "github.com/xeronith/diamante/contracts/operation"
|
||||
. "github.com/xeronith/diamante/contracts/service"
|
||||
. "github.com/xeronith/diamante/contracts/system"
|
||||
. "github.com/xeronith/diamante/operation"
|
||||
. "rail.town/infrastructure/components/api/protobuf"
|
||||
. "rail.town/infrastructure/components/api/services"
|
||||
. "rail.town/infrastructure/components/contracts"
|
||||
)
|
||||
|
||||
type webfingerOperation struct {
|
||||
Operation
|
||||
|
||||
run func(IContext, *WebfingerRequest) (*WebfingerResult, error)
|
||||
}
|
||||
|
||||
func WebfingerOperation() IOperation {
|
||||
return &webfingerOperation{
|
||||
run: WebfingerService,
|
||||
}
|
||||
}
|
||||
|
||||
func (operation *webfingerOperation) Id() (ID, ID) {
|
||||
return WEBFINGER_REQUEST, WEBFINGER_RESULT
|
||||
}
|
||||
|
||||
func (operation *webfingerOperation) InputContainer() Pointer {
|
||||
return new(WebfingerRequest)
|
||||
}
|
||||
|
||||
func (operation *webfingerOperation) OutputContainer() Pointer {
|
||||
return new(WebfingerResult)
|
||||
}
|
||||
|
||||
func (operation *webfingerOperation) Execute(context IContext, payload Pointer) (Pointer, error) {
|
||||
return operation.run(context, payload.(*WebfingerRequest))
|
||||
}
|
||||
|
||||
/*
|
||||
func (operation *webfingerOperation) ExecutionTimeLimits() (Duration, Duration, Duration) {
|
||||
var (
|
||||
TIME_LIMIT_WARNING Duration = 20_000_000
|
||||
TIME_LIMIT_ALERT Duration = 35_000_000
|
||||
TIME_LIMIT_CRITICAL Duration = 50_000_000
|
||||
)
|
||||
|
||||
return TIME_LIMIT_WARNING, TIME_LIMIT_ALERT, TIME_LIMIT_CRITICAL
|
||||
}
|
||||
*/
|
|
@ -912,6 +912,118 @@ func (*LogoutResult) Descriptor() ([]byte, []int) {
|
|||
return file_spis_proto_rawDescGZIP(), []int{15}
|
||||
}
|
||||
|
||||
// API: Webfinger
|
||||
// -----------------------------------------------------------
|
||||
type WebfingerRequest struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Resource string `protobuf:"bytes,1,opt,name=resource,proto3" json:"resource,omitempty"`
|
||||
}
|
||||
|
||||
func (x *WebfingerRequest) Reset() {
|
||||
*x = WebfingerRequest{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_spis_proto_msgTypes[16]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *WebfingerRequest) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*WebfingerRequest) ProtoMessage() {}
|
||||
|
||||
func (x *WebfingerRequest) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_spis_proto_msgTypes[16]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use WebfingerRequest.ProtoReflect.Descriptor instead.
|
||||
func (*WebfingerRequest) Descriptor() ([]byte, []int) {
|
||||
return file_spis_proto_rawDescGZIP(), []int{16}
|
||||
}
|
||||
|
||||
func (x *WebfingerRequest) GetResource() string {
|
||||
if x != nil {
|
||||
return x.Resource
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type WebfingerResult struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Aliases []string `protobuf:"bytes,1,rep,name=aliases,proto3" json:"aliases,omitempty"`
|
||||
Links []*ActivityPubLink `protobuf:"bytes,2,rep,name=links,proto3" json:"links,omitempty"`
|
||||
Subject string `protobuf:"bytes,3,opt,name=subject,proto3" json:"subject,omitempty"`
|
||||
}
|
||||
|
||||
func (x *WebfingerResult) Reset() {
|
||||
*x = WebfingerResult{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_spis_proto_msgTypes[17]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *WebfingerResult) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*WebfingerResult) ProtoMessage() {}
|
||||
|
||||
func (x *WebfingerResult) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_spis_proto_msgTypes[17]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use WebfingerResult.ProtoReflect.Descriptor instead.
|
||||
func (*WebfingerResult) Descriptor() ([]byte, []int) {
|
||||
return file_spis_proto_rawDescGZIP(), []int{17}
|
||||
}
|
||||
|
||||
func (x *WebfingerResult) GetAliases() []string {
|
||||
if x != nil {
|
||||
return x.Aliases
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *WebfingerResult) GetLinks() []*ActivityPubLink {
|
||||
if x != nil {
|
||||
return x.Links
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *WebfingerResult) GetSubject() string {
|
||||
if x != nil {
|
||||
return x.Subject
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
var File_spis_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_spis_proto_rawDesc = []byte{
|
||||
|
@ -990,8 +1102,18 @@ var file_spis_proto_rawDesc = []byte{
|
|||
0x69, 0x74, 0x68, 0x75, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x69, 0x74,
|
||||
0x68, 0x75, 0x62, 0x22, 0x0f, 0x0a, 0x0d, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71,
|
||||
0x75, 0x65, 0x73, 0x74, 0x22, 0x0e, 0x0a, 0x0c, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x52, 0x65,
|
||||
0x73, 0x75, 0x6c, 0x74, 0x42, 0x04, 0x5a, 0x02, 0x2e, 0x2f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
|
||||
0x6f, 0x33,
|
||||
0x73, 0x75, 0x6c, 0x74, 0x22, 0x2e, 0x0a, 0x10, 0x57, 0x65, 0x62, 0x66, 0x69, 0x6e, 0x67, 0x65,
|
||||
0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f,
|
||||
0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f,
|
||||
0x75, 0x72, 0x63, 0x65, 0x22, 0x76, 0x0a, 0x0f, 0x57, 0x65, 0x62, 0x66, 0x69, 0x6e, 0x67, 0x65,
|
||||
0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73,
|
||||
0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65,
|
||||
0x73, 0x12, 0x2f, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
|
||||
0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x63, 0x74, 0x69,
|
||||
0x76, 0x69, 0x74, 0x79, 0x50, 0x75, 0x62, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x05, 0x6c, 0x69, 0x6e,
|
||||
0x6b, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20,
|
||||
0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x42, 0x04, 0x5a, 0x02,
|
||||
0x2e, 0x2f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
|
@ -1006,7 +1128,7 @@ func file_spis_proto_rawDescGZIP() []byte {
|
|||
return file_spis_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_spis_proto_msgTypes = make([]protoimpl.MessageInfo, 16)
|
||||
var file_spis_proto_msgTypes = make([]protoimpl.MessageInfo, 18)
|
||||
var file_spis_proto_goTypes = []interface{}{
|
||||
(*SystemCallRequest)(nil), // 0: protobuf.SystemCallRequest
|
||||
(*SystemCallResult)(nil), // 1: protobuf.SystemCallResult
|
||||
|
@ -1024,16 +1146,20 @@ var file_spis_proto_goTypes = []interface{}{
|
|||
(*UpdateProfileByUserResult)(nil), // 13: protobuf.UpdateProfileByUserResult
|
||||
(*LogoutRequest)(nil), // 14: protobuf.LogoutRequest
|
||||
(*LogoutResult)(nil), // 15: protobuf.LogoutResult
|
||||
(*Document)(nil), // 16: protobuf.Document
|
||||
(*WebfingerRequest)(nil), // 16: protobuf.WebfingerRequest
|
||||
(*WebfingerResult)(nil), // 17: protobuf.WebfingerResult
|
||||
(*Document)(nil), // 18: protobuf.Document
|
||||
(*ActivityPubLink)(nil), // 19: protobuf.ActivityPubLink
|
||||
}
|
||||
var file_spis_proto_depIdxs = []int32{
|
||||
16, // 0: protobuf.EchoRequest.document:type_name -> protobuf.Document
|
||||
16, // 1: protobuf.EchoResult.document:type_name -> protobuf.Document
|
||||
2, // [2:2] is the sub-list for method output_type
|
||||
2, // [2:2] is the sub-list for method input_type
|
||||
2, // [2:2] is the sub-list for extension type_name
|
||||
2, // [2:2] is the sub-list for extension extendee
|
||||
0, // [0:2] is the sub-list for field type_name
|
||||
18, // 0: protobuf.EchoRequest.document:type_name -> protobuf.Document
|
||||
18, // 1: protobuf.EchoResult.document:type_name -> protobuf.Document
|
||||
19, // 2: protobuf.WebfingerResult.links:type_name -> protobuf.ActivityPubLink
|
||||
3, // [3:3] is the sub-list for method output_type
|
||||
3, // [3:3] is the sub-list for method input_type
|
||||
3, // [3:3] is the sub-list for extension type_name
|
||||
3, // [3:3] is the sub-list for extension extendee
|
||||
0, // [0:3] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_spis_proto_init() }
|
||||
|
@ -1235,6 +1361,30 @@ func file_spis_proto_init() {
|
|||
return nil
|
||||
}
|
||||
}
|
||||
file_spis_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*WebfingerRequest); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_spis_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*WebfingerResult); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
type x struct{}
|
||||
out := protoimpl.TypeBuilder{
|
||||
|
@ -1242,7 +1392,7 @@ func file_spis_proto_init() {
|
|||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_spis_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 16,
|
||||
NumMessages: 18,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
|
|
|
@ -102,4 +102,16 @@ message LogoutRequest {
|
|||
message LogoutResult {
|
||||
}
|
||||
|
||||
// API: Webfinger
|
||||
//-----------------------------------------------------------
|
||||
message WebfingerRequest {
|
||||
string resource = 0x00000001;
|
||||
}
|
||||
|
||||
message WebfingerResult {
|
||||
repeated string aliases = 0x00000001;
|
||||
repeated ActivityPubLink links = 0x00000002;
|
||||
string subject = 0x00000003;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
package services
|
||||
|
||||
import (
|
||||
. "github.com/xeronith/diamante/contracts/service"
|
||||
. "rail.town/infrastructure/components/api/protobuf"
|
||||
. "rail.town/infrastructure/components/contracts"
|
||||
"rail.town/infrastructure/components/core"
|
||||
)
|
||||
|
||||
// noinspection GoUnusedParameter
|
||||
func WebfingerService(context IContext, input *WebfingerRequest) (result *WebfingerResult, err error) {
|
||||
conductor := core.Conductor
|
||||
_ = WEBFINGER_REQUEST
|
||||
|
||||
conductor.LogRemoteCall(context, INITIALIZE, "webfinger", input, result, err)
|
||||
defer func() { conductor.LogRemoteCall(context, FINALIZE, "webfinger", input, result, err) }()
|
||||
|
||||
_result, _err := conductor.Webfinger(input.Resource, context.Identity())
|
||||
if _err != nil {
|
||||
err = _err
|
||||
return nil, err
|
||||
}
|
||||
|
||||
_ = _result
|
||||
|
||||
outputLinks := make([]*ActivityPubLink, 0)
|
||||
for _, link := range _result.Links() {
|
||||
if link == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
outputLinks = append(outputLinks, &ActivityPubLink{
|
||||
Href: link.Href(),
|
||||
Rel: link.Rel(),
|
||||
Type: link.Type(),
|
||||
Template: link.Template(),
|
||||
})
|
||||
}
|
||||
|
||||
result = context.ResultContainer().(*WebfingerResult)
|
||||
result.Aliases = _result.Aliases()
|
||||
result.Links = outputLinks
|
||||
result.Subject = _result.Subject()
|
||||
return result, nil
|
||||
}
|
|
@ -55,6 +55,7 @@ const (
|
|||
ERROR_MESSAGE_INVALID_EMAIL_FOR_VERIFY = "ERROR_MESSAGE_INVALID_EMAIL_FOR_VERIFY"
|
||||
ERROR_MESSAGE_INVALID_EMAIL_FOR_LOGIN = "ERROR_MESSAGE_INVALID_EMAIL_FOR_LOGIN"
|
||||
ERROR_MESSAGE_INVALID_PASSWORD_FOR_LOGIN = "ERROR_MESSAGE_INVALID_PASSWORD_FOR_LOGIN"
|
||||
ERROR_MESSAGE_INVALID_RESOURCE_FOR_WEBFINGER = "ERROR_MESSAGE_INVALID_RESOURCE_FOR_WEBFINGER"
|
||||
// CUSTOM_ERRORS
|
||||
ERROR_MESSAGE_DATA_INTEGRITY_VIOLATION = "ERROR_MESSAGE_DATA_INTEGRITY_VIOLATION"
|
||||
ERROR_MESSAGE_INVALID_STATE = "ERROR_MESSAGE_INVALID_STATE"
|
||||
|
@ -119,6 +120,7 @@ var (
|
|||
ERROR_INVALID_EMAIL_FOR_VERIFY = errors.New(ERROR_MESSAGE_INVALID_EMAIL_FOR_VERIFY)
|
||||
ERROR_INVALID_EMAIL_FOR_LOGIN = errors.New(ERROR_MESSAGE_INVALID_EMAIL_FOR_LOGIN)
|
||||
ERROR_INVALID_PASSWORD_FOR_LOGIN = errors.New(ERROR_MESSAGE_INVALID_PASSWORD_FOR_LOGIN)
|
||||
ERROR_INVALID_RESOURCE_FOR_WEBFINGER = errors.New(ERROR_MESSAGE_INVALID_RESOURCE_FOR_WEBFINGER)
|
||||
// CUSTOM_ERRORS
|
||||
ERROR_DATA_INTEGRITY_VIOLATION = errors.New(ERROR_MESSAGE_DATA_INTEGRITY_VIOLATION)
|
||||
ERROR_INVALID_STATE = errors.New(ERROR_MESSAGE_INVALID_STATE)
|
||||
|
|
|
@ -52,6 +52,7 @@ var Errors = Resource{
|
|||
ERROR_MESSAGE_INVALID_EMAIL_FOR_VERIFY: "invalid_email",
|
||||
ERROR_MESSAGE_INVALID_EMAIL_FOR_LOGIN: "invalid_email",
|
||||
ERROR_MESSAGE_INVALID_PASSWORD_FOR_LOGIN: "invalid_password",
|
||||
ERROR_MESSAGE_INVALID_RESOURCE_FOR_WEBFINGER: "invalid_resource",
|
||||
// CUSTOM_ERRORS
|
||||
ERROR_MESSAGE_DATA_INTEGRITY_VIOLATION: "data_integrity_violation",
|
||||
ERROR_MESSAGE_INVALID_STATE: "invalid_state",
|
||||
|
|
|
@ -14,4 +14,5 @@ type IApi interface {
|
|||
GetProfileByUser(*GetProfileByUserRequest) (*GetProfileByUserResult, error)
|
||||
UpdateProfileByUser(*UpdateProfileByUserRequest) (*UpdateProfileByUserResult, error)
|
||||
Logout(*LogoutRequest) (*LogoutResult, error)
|
||||
Webfinger(*WebfingerRequest) (*WebfingerResult, error)
|
||||
}
|
||||
|
|
|
@ -35,6 +35,10 @@ const (
|
|||
//LogoutOperation
|
||||
LOGOUT_REQUEST = 0x447AFA34
|
||||
LOGOUT_RESULT = 0x9412D17F
|
||||
|
||||
//WebfingerOperation
|
||||
WEBFINGER_REQUEST = 0x01FD357C
|
||||
WEBFINGER_RESULT = 0xCC81EC52
|
||||
)
|
||||
|
||||
var OPCODES = Opcodes{
|
||||
|
@ -53,4 +57,6 @@ var OPCODES = Opcodes{
|
|||
0x678A8BAF: "UpdateProfileByUser",
|
||||
0x447AFA34: "LOGOUT",
|
||||
0x9412D17F: "Logout",
|
||||
0x01FD357C: "WEBFINGER",
|
||||
0xCC81EC52: "Webfinger",
|
||||
}
|
||||
|
|
|
@ -61,6 +61,7 @@ type (
|
|||
GetProfileByUser(editor Identity) (IGetProfileByUserResult, error)
|
||||
UpdateProfileByUser(displayName string, avatar string, banner string, summary string, github string, editor Identity) (IUpdateProfileByUserResult, error)
|
||||
Logout(editor Identity) (ILogoutResult, error)
|
||||
Webfinger(resource string, editor Identity) (IWebfingerResult, error)
|
||||
}
|
||||
|
||||
IEchoResult interface {
|
||||
|
@ -100,4 +101,10 @@ type (
|
|||
|
||||
ILogoutResult interface {
|
||||
}
|
||||
|
||||
IWebfingerResult interface {
|
||||
Aliases() []string
|
||||
Links() []IActivityPubLink
|
||||
Subject() string
|
||||
}
|
||||
)
|
||||
|
|
|
@ -264,6 +264,7 @@ type (
|
|||
GetProfileByUser(editor Identity) (IGetProfileByUserResult, error)
|
||||
UpdateProfileByUser(displayName string, avatar string, banner string, summary string, github string, editor Identity) (IUpdateProfileByUserResult, error)
|
||||
Logout(editor Identity) (ILogoutResult, error)
|
||||
Webfinger(resource string, editor Identity) (IWebfingerResult, error)
|
||||
|
||||
NewDocument(id int64, content string) (IDocument, error)
|
||||
NewSystemSchedule(id int64, enabled bool, config string) (ISystemSchedule, error)
|
||||
|
@ -289,6 +290,7 @@ type (
|
|||
NewGetProfileByUserResult(username string, displayName string, avatar string, banner string, summary string, github string, ignored interface{}) IGetProfileByUserResult
|
||||
NewUpdateProfileByUserResult(displayName string, avatar string, banner string, summary string, github string, ignored interface{}) IUpdateProfileByUserResult
|
||||
NewLogoutResult(ignored interface{}) ILogoutResult
|
||||
NewWebfingerResult(aliases []string, links []IActivityPubLink, subject string, ignored interface{}) IWebfingerResult
|
||||
}
|
||||
|
||||
ISystemComponent interface {
|
||||
|
|
|
@ -1038,6 +1038,7 @@ type IDispatcher interface {
|
|||
GetProfileByUser() (IGetProfileByUserResult, error)
|
||||
UpdateProfileByUser(displayName string, avatar string, banner string, summary string, github string) (IUpdateProfileByUserResult, error)
|
||||
Logout() (ILogoutResult, error)
|
||||
Webfinger(resource string) (IWebfingerResult, error)
|
||||
|
||||
// NewDocument creates a new 'Document' instance using the provided property values.
|
||||
NewDocument(id int64, content string) (IDocument, error)
|
||||
|
@ -1121,6 +1122,8 @@ type IDispatcher interface {
|
|||
NewUpdateProfileByUserResult(displayName string, avatar string, banner string, summary string, github string) IUpdateProfileByUserResult
|
||||
// NewLogoutResult creates a new result container for 'Logout' system action.
|
||||
NewLogoutResult() ILogoutResult
|
||||
// NewWebfingerResult creates a new result container for 'Webfinger' system action.
|
||||
NewWebfingerResult(aliases []string, links []IActivityPubLink, subject string) IWebfingerResult
|
||||
// Assert asserts the provided condition and panics if the assertion is not valid.
|
||||
Assert(condition bool) IAssertionResult
|
||||
// AssertNoError panics if the provided error is not nil.
|
||||
|
|
|
@ -85,6 +85,16 @@ func (api *api) Logout(request *LogoutRequest) (*LogoutResult, error) {
|
|||
}
|
||||
}
|
||||
|
||||
func (api *api) Webfinger(request *WebfingerRequest) (*WebfingerResult, error) {
|
||||
result, err := api.call(WEBFINGER_REQUEST, request)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result.(*WebfingerResult), nil
|
||||
}
|
||||
}
|
||||
|
||||
func init() {
|
||||
API_RESULT[SYSTEM_CALL_RESULT] = SystemCallResult{}
|
||||
API_RESULT[ECHO_RESULT] = EchoResult{}
|
||||
|
@ -94,4 +104,5 @@ func init() {
|
|||
API_RESULT[GET_PROFILE_BY_USER_RESULT] = GetProfileByUserResult{}
|
||||
API_RESULT[UPDATE_PROFILE_BY_USER_RESULT] = UpdateProfileByUserResult{}
|
||||
API_RESULT[LOGOUT_RESULT] = LogoutResult{}
|
||||
API_RESULT[WEBFINGER_RESULT] = WebfingerResult{}
|
||||
}
|
||||
|
|
|
@ -1123,6 +1123,10 @@ func (conductor *conductor) Logout(editor Identity) (ILogoutResult, error) {
|
|||
return conductor.spiManager.Logout(editor)
|
||||
}
|
||||
|
||||
func (conductor *conductor) Webfinger(resource string, editor Identity) (IWebfingerResult, error) {
|
||||
return conductor.spiManager.Webfinger(resource, editor)
|
||||
}
|
||||
|
||||
func (conductor *conductor) NewDocument(id int64, content string) (IDocument, error) {
|
||||
return NewDocument(id, content)
|
||||
}
|
||||
|
@ -1219,6 +1223,10 @@ func (conductor *conductor) NewLogoutResult(_ interface{}) ILogoutResult {
|
|||
return NewLogoutResult(nil)
|
||||
}
|
||||
|
||||
func (conductor *conductor) NewWebfingerResult(aliases []string, links []IActivityPubLink, subject string, _ interface{}) IWebfingerResult {
|
||||
return NewWebfingerResult(aliases, links, subject, nil)
|
||||
}
|
||||
|
||||
func (conductor *conductor) LogRemoteCall(context IContext, eventType uint32, source string, input, result interface{}, err error) {
|
||||
errorMessage := ""
|
||||
if err != nil {
|
||||
|
|
|
@ -262,3 +262,7 @@ func (dispatcher *dispatcher) UpdateProfileByUser(displayName string, avatar str
|
|||
func (dispatcher *dispatcher) Logout() (ILogoutResult, error) {
|
||||
return dispatcher.conductor.SpiManager().Logout(dispatcher.identity)
|
||||
}
|
||||
|
||||
func (dispatcher *dispatcher) Webfinger(resource string) (IWebfingerResult, error) {
|
||||
return dispatcher.conductor.SpiManager().Webfinger(resource, dispatcher.identity)
|
||||
}
|
||||
|
|
|
@ -531,3 +531,56 @@ func (manager *spiManager) Logout(editor Identity) (result ILogoutResult, err er
|
|||
return result, nil
|
||||
}
|
||||
}
|
||||
|
||||
//region IWebfingerResult Implementation
|
||||
|
||||
type webfingerResult struct {
|
||||
aliases []string
|
||||
links []IActivityPubLink
|
||||
subject string
|
||||
}
|
||||
|
||||
func NewWebfingerResult(aliases []string, links []IActivityPubLink, subject string, _ interface{}) IWebfingerResult {
|
||||
return &webfingerResult{
|
||||
aliases: aliases,
|
||||
links: links,
|
||||
subject: subject,
|
||||
}
|
||||
}
|
||||
|
||||
func (result webfingerResult) Aliases() []string {
|
||||
return result.aliases
|
||||
}
|
||||
|
||||
func (result webfingerResult) Links() []IActivityPubLink {
|
||||
return result.links
|
||||
}
|
||||
|
||||
func (result webfingerResult) Subject() string {
|
||||
return result.subject
|
||||
}
|
||||
|
||||
//endregion
|
||||
|
||||
func (manager *spiManager) Webfinger(resource string, editor Identity) (result IWebfingerResult, err error) {
|
||||
if match, err := manager.Match(WEBFINGER, resource); err != nil {
|
||||
return nil, err
|
||||
} else if !match {
|
||||
return nil, ERROR_INVALID_RESOURCE_FOR_WEBFINGER
|
||||
}
|
||||
|
||||
defer func() {
|
||||
if reason := recover(); reason != nil {
|
||||
err = manager.Error(reason)
|
||||
}
|
||||
}()
|
||||
|
||||
editor.Lock(WEBFINGER_REQUEST)
|
||||
defer editor.Unlock(WEBFINGER_REQUEST)
|
||||
|
||||
if result, err = commands.Webfinger(NewDispatcher(Conductor, editor), resource); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
return result, nil
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,4 +32,8 @@ func (dispatcher *dispatcher) NewLogoutResult() ILogoutResult {
|
|||
return NewLogoutResult(nil)
|
||||
}
|
||||
|
||||
func (dispatcher *dispatcher) NewWebfingerResult(aliases []string, links []IActivityPubLink, subject string) IWebfingerResult {
|
||||
return NewWebfingerResult(aliases, links, subject, nil)
|
||||
}
|
||||
|
||||
//endregion
|
||||
|
|
|
@ -6,7 +6,7 @@ require (
|
|||
github.com/google/uuid v1.3.0
|
||||
github.com/robfig/cron v1.2.0
|
||||
github.com/sendgrid/sendgrid-go v3.12.0+incompatible
|
||||
github.com/xeronith/diamante v1.5.2
|
||||
github.com/xeronith/diamante v1.5.3
|
||||
google.golang.org/protobuf v1.28.1
|
||||
)
|
||||
|
||||
|
|
|
@ -68,8 +68,8 @@ github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQ
|
|||
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
|
||||
github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8=
|
||||
github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
|
||||
github.com/xeronith/diamante v1.5.2 h1:Q665puGNc62RpxyhyoLcC/hS/KjgddkkO3upDmVlsig=
|
||||
github.com/xeronith/diamante v1.5.2/go.mod h1:AcsIxTtJIYfIp/Sk6kMOp0qfPGNhDDPWksvYzpbZtG0=
|
||||
github.com/xeronith/diamante v1.5.3 h1:6vGyUP6p8HVE4spd9roEvtFUG83GxJXax63OfWF8vbQ=
|
||||
github.com/xeronith/diamante v1.5.3/go.mod h1:AcsIxTtJIYfIp/Sk6kMOp0qfPGNhDDPWksvYzpbZtG0=
|
||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
|
|
Ładowanie…
Reference in New Issue