This repository has been archived by the owner on Feb 2, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
/
dispatch_post.go
120 lines (112 loc) · 3.65 KB
/
dispatch_post.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package jobs
//
// GangGo Application Server
// Copyright (C) 2017 Lukas Matt <lukas@zauberstuhl.de>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
import (
"crypto/rsa"
"github.com/revel/revel"
"git.feneas.org/ganggo/ganggo/app/models"
"git.feneas.org/ganggo/federation"
fhelpers "git.feneas.org/ganggo/federation/helpers"
run "github.com/revel/modules/jobs/app/jobs"
)
func (dispatcher *Dispatcher) StatusMessage(post models.Post) {
persons, err := dispatcher.findRecipients(&post, &dispatcher.User)
if err != nil {
revel.AppLog.Error("Dispatcher StatusMessage", err.Error(), err)
return
}
priv, err := fhelpers.ParseRSAPrivateKey(
[]byte(dispatcher.User.SerializedPrivateKey))
if err != nil {
revel.AppLog.Error("Dispatcher StatusMessage", err.Error(), err)
return
}
recipients := []string{}
for _, person := range persons {
recipients = append(recipients, person.Author)
}
for _, person := range persons {
var pub *rsa.PublicKey = nil
endpoint := person.Inbox
if !post.Public {
pub, err = fhelpers.ParseRSAPublicKey(
[]byte(person.SerializedPublicKey))
if err != nil {
revel.AppLog.Error("Dispatcher StatusMessage", err.Error(), err)
continue
}
} else if person.Pod.Inbox != "" {
// pod inbox if available
endpoint = person.Pod.Inbox
}
var entity federation.MessageBase
if dispatcher.Retract {
msg, err := federation.NewMessageRetract(person.Pod.Protocol)
if err != nil {
revel.AppLog.Error("Dispatcher StatusMessage", err.Error(), err)
return
}
msg.SetAuthor(post.Person.Author)
msg.SetParentType(federation.StatusMessage)
msg.SetParentGuid(post.Guid)
entity = msg
} else if post.Type == models.StatusMessage {
msg, err := federation.NewMessagePost(person.Pod.Protocol)
if err != nil {
revel.AppLog.Error("Dispatcher StatusMessage", err.Error(), err)
continue
}
msg.SetAuthor(post.Person.Author)
if !post.Public {
msg.SetRecipients(recipients)
}
msg.SetText(post.Text)
msg.SetGuid(post.Guid)
msg.SetPublic(post.Public)
msg.SetCreatedAt(post.CreatedAt)
entity = msg
} else if post.Type == models.Reshare {
var parent models.Person
err = parent.FindByID(post.RootPersonID)
if err != nil {
revel.AppLog.Error("Dispatcher Reshare", err.Error(), err)
continue
}
msg, err := federation.NewMessageReshare(person.Pod.Protocol)
if err != nil {
revel.AppLog.Error("Dispatcher StatusMessage", err.Error(), err)
continue
}
msg.SetAuthor(post.Person.Author)
msg.SetGuid(post.Guid)
msg.SetParentAuthor(parent.Author)
msg.SetParent(*post.RootGuid)
msg.SetCreatedAt(post.CreatedAt)
entity = msg
} else {
panic("Something went wrong!")
}
// send and retry if it fails the first time
run.Now(RetryOnFail{
Pod: &person.Pod,
Send: func() error {
return entity.Send(endpoint, priv, pub)
},
})
}
}