cc50e0dfe9
The service-side version negotiation had a buffer overread that would cause remotely triggerable panic. Refactor that code to resolve that issue, follow the spec more exactly, and avoid reading more data from the socket than is used for version negotiation, in case clients write optimistically. |
||
---|---|---|
auth | ||
chat | ||
contact | ||
control | ||
examples/echobot | ||
utils | ||
.gitignore | ||
.travis.yml | ||
CONTRIBUTING.md | ||
LICENSE | ||
Makefile | ||
README.md | ||
authhandler.go | ||
authhandler_test.go | ||
logo.png | ||
messagebuilder.go | ||
messagebuilder_test.go | ||
openconnection.go | ||
openconnection_test.go | ||
private_key | ||
ricochet.go | ||
ricochetservice.go | ||
standardricochetservice.go | ||
standardricochetservice_bad_usage_error_test.go | ||
standardricochetservice_test.go | ||
standardricochetservice_unauth_test.go | ||
standardricochetservice_unknown_contact_test.go |
README.md
GoRicochet
GoRicochet is an experimental implementation of the Ricochet Protocol in Go.
Features
- A simple API that you can use to build Automated Ricochet Applications
- A suite of regression tests that test protocol compliance.
Building an Automated Ricochet Application
Below is a simple echo bot, which responds to any chat message. You can also find this code under examples/echobot
package main
import (
"github.com/s-rah/go-ricochet"
"log"
)
type EchoBotService struct {
goricochet.StandardRicochetService
}
// Always Accept Contact Requests
func (ts *EchoBotService) IsKnownContact(hostname string) bool {
return true
}
func (ts *EchoBotService) OnContactRequest(oc *goricochet.OpenConnection, channelID int32, nick string, message string) {
ts.StandardRicochetService.OnContactRequest(oc, channelID, nick, message)
oc.AckContactRequestOnResponse(channelID, "Accepted")
oc.CloseChannel(channelID)
}
func (ebs *EchoBotService) OnChatMessage(oc *goricochet.OpenConnection, channelID int32, messageId int32, message string) {
log.Printf("Received Message from %s: %s", oc.OtherHostname, message)
oc.AckChatMessage(channelID, messageId)
if oc.GetChannelType(6) == "none" {
oc.OpenChatChannel(6)
}
oc.SendMessage(6, message)
}
func main() {
ricochetService := new(EchoBotService)
ricochetService.Init("./private_key")
ricochetService.Listen(ricochetService, 12345)
}
Each automated ricochet service can extend of the StandardRicochetService
. From there
certain functions can be extended to fully build out a complete application.
Currently GoRicochet does not establish a hidden service, so to make this service available to the world you will have to set up a hidden service
Security and Usage Note
This project is experimental and has not been independently reviewed. If you are looking for a quick and easy way to use ricochet please check out Ricochet Protocol.