diff options
Diffstat (limited to 'OutboxPost.go')
-rw-r--r-- | OutboxPost.go | 648 |
1 files changed, 0 insertions, 648 deletions
diff --git a/OutboxPost.go b/OutboxPost.go deleted file mode 100644 index c9ceb12..0000000 --- a/OutboxPost.go +++ /dev/null @@ -1,648 +0,0 @@ -package main - -import "fmt" -import "net/http" -import "database/sql" -import _ "github.com/lib/pq" -import "encoding/json" -import "reflect" -import "io/ioutil" -import "os" -import "regexp" -import "strings" - -func ParseOutboxRequest(w http.ResponseWriter, r *http.Request, db *sql.DB) { - - var activity Activity - - actor := GetActorFromPath(db, r.URL.Path, "/") - contentType := GetContentType(r.Header.Get("content-type")) - - defer r.Body.Close() - if contentType == "multipart/form-data" || contentType == "application/x-www-form-urlencoded" { - r.ParseMultipartForm(5 << 20) - if(BoardHasAuthType(db, actor.Name, "captcha") && CheckCaptcha(db, r.FormValue("captcha"))) { - f, header, _ := r.FormFile("file") - if(header != nil) { - if(header.Size > (7 << 20)){ - w.WriteHeader(http.StatusRequestEntityTooLarge) - w.Write([]byte("7MB max file size")) - return - } - - contentType, _ := GetFileContentType(f) - - if(!SupportedMIMEType(contentType)) { - w.WriteHeader(http.StatusNotAcceptable) - w.Write([]byte("file type not supported")) - return - } - } - - var nObj = CreateObject("Note") - nObj = ObjectFromForm(r, db, nObj) - - var act Actor - nObj.Actor = &act - nObj.Actor.Id = Domain + "/" + actor.Name - - nObj = WriteObjectToDB(db, nObj) - activity := CreateActivity("Create", nObj) - activity = AddFollowersToActivity(db, activity) - MakeActivityRequest(db, activity) - - var id string - op := len(nObj.InReplyTo) - 1 - if op >= 0 { - if nObj.InReplyTo[op].Id == "" { - id = nObj.Id - } else { - id = nObj.InReplyTo[0].Id + "|" + nObj.Id - } - } - - w.WriteHeader(http.StatusOK) - w.Write([]byte(id)) - return - } - - w.WriteHeader(http.StatusForbidden) - w.Write([]byte("captcha could not auth")) - } else { - activity = GetActivityFromJson(r, db) - - if IsActivityLocal(db, activity) { - switch activity.Type { - case "Create": - w.WriteHeader(http.StatusBadRequest) - w.Write([]byte("")) - break - case "Follow": - - var validActor bool - var validLocalActor bool - - header := r.Header.Get("Authorization") - - auth := strings.Split(header, " ") - - if len(auth) < 2 { - w.WriteHeader(http.StatusBadRequest) - w.Write([]byte("")) - return - } - - _, validActor = IsValidActor(activity.Object.Actor.Id) - validLocalActor = (activity.Actor.Id == actor.Id) - - var verify Verify - verify.Identifier = "admin" - verify.Board = activity.Actor.Id - - verify = GetVerificationCode(db, verify) - - code := verify.Code - code = CreateTripCode(code) - code = CreateTripCode(code) - - if code != auth[1] { - verify.Identifier = "admin" - verify.Board = Domain - - verify = GetVerificationCode(db, verify) - code = verify.Code - code = CreateTripCode(code) - code = CreateTripCode(code) - } - - var rActivity Activity - if validActor && validLocalActor && code == auth[1] || verify.Board == Domain { - rActivity = AcceptFollow(activity) - SetActorFollowingDB(db, rActivity) - MakeActivityRequest(db, activity) - } - - break - case "Delete": - fmt.Println("This is a delete") - w.WriteHeader(http.StatusBadRequest) - w.Write([]byte("could not process activity")) - break - case "Note": - w.WriteHeader(http.StatusBadRequest) - w.Write([]byte("could not process activity")) - break - - case "New": - - header := r.Header.Get("Authorization") - - auth := strings.Split(header, " ") - - if len(auth) < 2 { - w.WriteHeader(http.StatusBadRequest) - w.Write([]byte("")) - return - } - - var verify Verify - verify.Identifier = "admin" - verify.Board = Domain - - verify = GetVerificationCode(db, verify) - - code := verify.Code - code = CreateTripCode(code) - code = CreateTripCode(code) - - if code != auth[1] { - w.WriteHeader(http.StatusBadRequest) - w.Write([]byte("")) - return - } - - name := activity.Object.Actor.Name - prefname := activity.Object.Actor.PreferredUsername - summary := activity.Object.Actor.Summary - restricted := activity.Object.Actor.Restricted - - actor := CreateNewBoardDB(db, *CreateNewActor(name, prefname, summary, authReq, restricted)) - - if actor.Id != "" { - j, _ := json.Marshal(&actor) - w.Write([]byte(j)) - return - } - - w.WriteHeader(http.StatusBadRequest) - w.Write([]byte("")) - break - default: - w.WriteHeader(http.StatusBadRequest) - w.Write([]byte("could not process activity")) - } - } else { - fmt.Println("is NOT activity") - w.WriteHeader(http.StatusBadRequest) - w.Write([]byte("could not process activity")) - } - } -} - -func ObjectFromJson(r *http.Request, obj ObjectBase) ObjectBase { - body, _ := ioutil.ReadAll(r.Body) - - var respActivity ActivityRaw - - err := json.Unmarshal(body, &respActivity) - - CheckError(err, "error with object from json") - - if HasContextFromJson(respActivity.AtContextRaw.Context) { - var jObj ObjectBase - jObj = GetObjectFromJson(respActivity.ObjectRaw) - jObj.To = GetToFromJson(respActivity.ToRaw) - jObj.Cc = GetToFromJson(respActivity.CcRaw) - } - - return obj -} - -func GetObjectFromJson(obj []byte) ObjectBase { - var generic interface{} - - err := json.Unmarshal(obj, &generic) - - CheckError(err, "error with getting obj from json") - - t := reflect.TypeOf(generic) - - var nObj ObjectBase - if t != nil { - switch t.String() { - case "[]interface {}": - var lObj ObjectBase - var arrContext ObjectArray - err = json.Unmarshal(obj, &arrContext.Object) - CheckError(err, "error with []interface{} oject from json") - if len(arrContext.Object) > 0 { - lObj = arrContext.Object[0] - } - nObj = lObj - break - - case "map[string]interface {}": - var arrContext Object - err = json.Unmarshal(obj, &arrContext.Object) - CheckError(err, "error with object from json") - nObj = *arrContext.Object - break - - case "string": - var lObj ObjectBase - var arrContext ObjectString - err = json.Unmarshal(obj, &arrContext.Object) - CheckError(err, "error with string object from json") - lObj.Id = arrContext.Object - nObj = lObj - break - } - } - - return nObj -} - -func GetActorFromJson(actor []byte) Actor{ - var generic interface{} - var nActor Actor - err := json.Unmarshal(actor, &generic) - - if err != nil { - return nActor - } - - t := reflect.TypeOf(generic) - if t != nil { - switch t.String() { - case "map[string]interface {}": - err = json.Unmarshal(actor, &nActor) - CheckError(err, "error with To []interface{}") - - case "string": - var str string - err = json.Unmarshal(actor, &str) - CheckError(err, "error with To string") - nActor.Id = str - } - - return nActor - } - - return nActor -} - -func GetToFromJson(to []byte) []string { - var generic interface{} - - err := json.Unmarshal(to, &generic) - - if err != nil { - return nil - } - - t := reflect.TypeOf(generic) - - if t != nil { - var nStr []string - switch t.String() { - case "[]interface {}": - err = json.Unmarshal(to, &nStr) - CheckError(err, "error with To []interface{}") - return nStr - - case "string": - var str string - err = json.Unmarshal(to, &str) - CheckError(err, "error with To string") - nStr = append(nStr, str) - return nStr - } - } - - return nil -} - -func HasContextFromJson(context []byte) bool { - var generic interface{} - - err := json.Unmarshal(context, &generic) - - CheckError(err, "error with getting context") - - t := reflect.TypeOf(generic) - - hasContext := false - - switch t.String() { - case "[]interface {}": - var arrContext AtContextArray - err = json.Unmarshal(context, &arrContext.Context) - CheckError(err, "error with []interface{}") - if len(arrContext.Context) > 0 { - if arrContext.Context[0] == "https://www.w3.org/ns/activitystreams" { - hasContext = true - } - } - case "string": - var arrContext AtContextString - err = json.Unmarshal(context, &arrContext.Context) - CheckError(err, "error with string") - if arrContext.Context == "https://www.w3.org/ns/activitystreams" { - hasContext = true - } - } - - return hasContext -} - -func ObjectFromForm(r *http.Request, db *sql.DB, obj ObjectBase) ObjectBase { - - file, header, _ := r.FormFile("file") - - if file != nil { - defer file.Close() - - var tempFile = new(os.File) - obj.Attachment, tempFile = CreateAttachmentObject(file, header) - - defer tempFile.Close(); - - fileBytes, _ := ioutil.ReadAll(file) - - tempFile.Write(fileBytes) - - obj.Preview = CreatePreviewObject(obj.Attachment[0]) - } - - obj.AttributedTo = EscapeString(r.FormValue("name")) - obj.TripCode = EscapeString(r.FormValue("tripcode")) - obj.Name = EscapeString(r.FormValue("subject")) - obj.Content = EscapeString(r.FormValue("comment")) - - obj = ParseOptions(r, obj) - - var originalPost ObjectBase - originalPost.Id = EscapeString(r.FormValue("inReplyTo")) - - obj.InReplyTo = append(obj.InReplyTo, originalPost) - - var activity Activity - - if !IsInStringArray(activity.To, originalPost.Id) { - activity.To = append(activity.To, originalPost.Id) - } - - if originalPost.Id != "" { - if !IsActivityLocal(db, activity) { - id := GetActorFromID(originalPost.Id).Id - actor := GetActor(id) - if !IsInStringArray(obj.To, actor.Id) { - obj.To = append(obj.To, actor.Id) - } - } - } - - replyingTo := ParseCommentForReplies(r.FormValue("comment")) - - for _, e := range replyingTo { - - has := false - - for _, f := range obj.InReplyTo { - if e.Id == f.Id { - has = true - break - } - } - - if !has { - obj.InReplyTo = append(obj.InReplyTo, e) - - var activity Activity - - activity.To = append(activity.To, e.Id) - - if !IsActivityLocal(db, activity) { - id := GetActorFromID(e.Id).Id - actor := GetActor(id) - if !IsInStringArray(obj.To, actor.Id) { - obj.To = append(obj.To, actor.Id) - } - } - } - } - - return obj -} - -func ParseOptions(r *http.Request, obj ObjectBase) ObjectBase { - options := EscapeString(r.FormValue("options")) - if options != "" { - option := strings.Split(options, ";") - email := regexp.MustCompile(".+@.+\\..+") - wallet := regexp.MustCompile("wallet:.+") - delete := regexp.MustCompile("delete:.+") - for _, e := range option { - if e == "noko" { - obj.Option = append(obj.Option, "noko") - } else if e == "sage" { - obj.Option = append(obj.Option, "sage") - } else if e == "nokosage" { - obj.Option = append(obj.Option, "nokosage") - } else if email.MatchString(e) { - obj.Option = append(obj.Option, "email:" + e) - } else if wallet.MatchString(e) { - obj.Option = append(obj.Option, "wallet") - var wallet CryptoCur - value := strings.Split(e, ":") - wallet.Type = value[0] - wallet.Address = value[1] - obj.Wallet = append(obj.Wallet, wallet) - } else if delete.MatchString(e) { - obj.Option = append(obj.Option, e) - } - } - } - - return obj -} - -func GetActivityFromJson(r *http.Request, db *sql.DB) Activity { - body, _ := ioutil.ReadAll(r.Body) - - var respActivity ActivityRaw - - var nActivity Activity - - var nType string - - err := json.Unmarshal(body, &respActivity) - - CheckError(err, "error with activity from json") - - if HasContextFromJson(respActivity.AtContextRaw.Context) { - var jObj ObjectBase - - if respActivity.Type == "Note" { - jObj = GetObjectFromJson(body) - nType = "Create" - } else { - jObj = GetObjectFromJson(respActivity.ObjectRaw) - nType = respActivity.Type - } - - actor := GetActorFromJson(respActivity.ActorRaw) - to := GetToFromJson(respActivity.ToRaw) - cc := GetToFromJson(respActivity.CcRaw) - - nActivity.AtContext.Context = "https://www.w3.org/ns/activitystreams" - nActivity.Type = nType - nActivity.Actor = &actor - nActivity.Published = respActivity.Published - nActivity.Auth = respActivity.Auth - - if len(to) > 0 { - nActivity.To = to - } - - if len(cc) > 0 { - nActivity.Cc = cc - } - - nActivity.Name = respActivity.Name - nActivity.Object = &jObj - } - - return nActivity -} - -func CheckCaptcha(db *sql.DB, captcha string) bool { - parts := strings.Split(captcha, ":") - - if strings.Trim(parts[0], " ") == "" || strings.Trim(parts[1], " ") == ""{ - return false - } - - path := "public/" + parts[0] + ".png" - code := GetCaptchaCodeDB(db, path) - - if code != "" { - DeleteCaptchaCodeDB(db, path) - CreateNewCaptcha(db) - } - - if (code == strings.ToUpper(parts[1])) { - return true - } - - return false -} - -func ParseInboxRequest(w http.ResponseWriter, r *http.Request, db *sql.DB) { - activity := GetActivityFromJson(r, db) - - header := r.Header.Get("Authorization") - auth := strings.Split(header, " ") - - - if len(auth) < 2 { - response := RejectActivity(activity) - MakeActivityRequest(db, response) - return - } - - if !RemoteActorHasAuth(activity.Actor.Id, auth[1]) { - if !RemoteActorHasAuth(Domain, auth[1]) { - response := RejectActivity(activity) - MakeActivityRequest(db, response) - return - } - } - - switch(activity.Type) { - case "Create": - for _, e := range activity.To { - if IsActorLocal(db, e) { - if !IsActorLocal(db, activity.Actor.Id) { - WriteObjectToCache(db, *activity.Object) - } - } - } - break - - case "Delete": - for _, e := range activity.To { - actor := GetActorFromDB(db, e) - if actor.Id != "" { - if activity.Object.Replies != nil { - for _, k := range activity.Object.Replies.OrderedItems { - TombstoneObjectFromCache(db, k.Id) - DeleteObject(db, k.Id) - } - } - TombstoneObjectFromCache(db, activity.Object.Id) - break - } - } - break - - - case "Follow": - for _, e := range activity.To { - if GetActorFromDB(db, e).Id != "" { - response := AcceptFollow(activity) - response = SetActorFollowerDB(db, response) - MakeActivityRequest(db, response) - } else { - fmt.Println("follow request for rejected") - response := RejectActivity(activity) - MakeActivityRequest(db, response) - return - } - } - break - - case "Reject": - if activity.Object.Object.Type == "Follow" { - fmt.Println("follow rejected") - SetActorFollowingDB(db, activity) - } - break - } - -} - -func MakeActivityFollowingReq(w http.ResponseWriter, r *http.Request, activity Activity) bool { - actor := GetActor(activity.Object.Id) - - resp, err := http.NewRequest("POST", actor.Inbox, nil) - - CheckError(err, "Cannot make new get request to actor inbox for following req") - - defer resp.Body.Close() - - body, _ := ioutil.ReadAll(resp.Body) - - var respActivity Activity - - err = json.Unmarshal(body, &respActivity) - - if respActivity.Type == "Accept" { - return true - } - - return false -} - -func RemoteActorHasAuth(actor string, code string) bool { - - if actor == "" || code == "" { - return false - } - - req, err := http.NewRequest("GET", actor + "/verification&code=" + code, nil) - - CheckError(err, "could not make remote actor auth req") - - resp, err := http.DefaultClient.Do(req) - - CheckError(err, "could not make remote actor auth resp") - - defer resp.Body.Close() - - if resp.StatusCode == 200 { - return true - } - - return false -} |