Browse Source

support tor everywhere

this changes all api calls to respect the flags for tor and tor-port

- config now has TorPort method to return flag value if set, or default
- api now only has newClient, this creates a tor client when flag is
present. does not need to be exported anymore
- no methods take a tor argument as no longer needed
- all commands now share the same behaviour logging tor messages
- api.torClient was removed as not used anywhere
- all calls to api.newClient now check for and return the error
- api.HandlePost was removed as redundant of api.DoPost
pull/41/head
Rob Loranger 4 years ago
parent
commit
27e615035e
No known key found for this signature in database GPG Key ID: D6F1633A4F0903B8
6 changed files with 94 additions and 104 deletions
  1. +36
    -48
      api/api.go
  2. +1
    -15
      api/posts.go
  3. +2
    -2
      api/sync.go
  4. +0
    -18
      api/tor.go
  5. +47
    -21
      commands/commands.go
  6. +8
    -0
      config/options.go

+ 36
- 48
api/api.go View File

@@ -13,26 +13,10 @@ import (
cli "gopkg.in/urfave/cli.v1"
)

func client(userAgent string, tor bool) *writeas.Client {
var client *writeas.Client
if tor {
client = writeas.NewTorClient(TorPort)
} else {
if config.IsDev() {
client = writeas.NewDevClient()
} else {
client = writeas.NewClient()
}
}
client.UserAgent = userAgent

return client
}

func NewClient(c *cli.Context, authRequired bool) (*writeas.Client, error) {
func newClient(c *cli.Context, authRequired bool) (*writeas.Client, error) {
var client *writeas.Client
if config.IsTor(c) {
client = writeas.NewTorClient(TorPort)
client = writeas.NewTorClient(config.TorPort(c))
} else {
if config.IsDev() {
client = writeas.NewDevClient()
@@ -54,8 +38,11 @@ func NewClient(c *cli.Context, authRequired bool) (*writeas.Client, error) {

// DoFetch retrieves the Write.as post with the given friendlyID,
// optionally via the Tor hidden service.
func DoFetch(friendlyID, ua string, tor bool) error {
cl := client(ua, tor)
func DoFetch(c *cli.Context, friendlyID string) error {
cl, err := newClient(c, false)
if err != nil {
return err
}

p, err := cl.GetPost(friendlyID)
if err != nil {
@@ -72,9 +59,9 @@ func DoFetch(friendlyID, ua string, tor bool) error {
// DoFetchPosts retrieves all remote posts for the
// authenticated user
func DoFetchPosts(c *cli.Context) ([]writeas.Post, error) {
cl, err := NewClient(c, true)
cl, err := newClient(c, true)
if err != nil {
return nil, err
return nil, fmt.Errorf("Unable to create client: %v", err)
}

posts, err := cl.GetUserPosts()
@@ -87,8 +74,11 @@ func DoFetchPosts(c *cli.Context) ([]writeas.Post, error) {

// DoPost creates a Write.as post, returning an error if it was
// unsuccessful.
func DoPost(c *cli.Context, post []byte, font string, encrypt, tor, code bool) (*writeas.Post, error) {
cl, _ := NewClient(c, false)
func DoPost(c *cli.Context, post []byte, font string, encrypt, code bool) (*writeas.Post, error) {
cl, err := newClient(c, false)
if err != nil {
return nil, fmt.Errorf("Unable to create client: %v", err)
}

pp := &writeas.PostParams{
Font: config.GetFont(code, font),
@@ -107,7 +97,7 @@ func DoPost(c *cli.Context, post []byte, font string, encrypt, tor, code bool) (
if p.Collection != nil {
url = p.Collection.URL + p.Slug
} else {
if tor {
if config.IsTor(c) {
url = config.TorBaseURL
} else if config.IsDev() {
url = config.DevBaseURL
@@ -143,10 +133,10 @@ func DoPost(c *cli.Context, post []byte, font string, encrypt, tor, code bool) (
// DoFetchCollections retrieves a list of the currently logged in users
// collections.
func DoFetchCollections(c *cli.Context) ([]RemoteColl, error) {
cl, err := NewClient(c, true)
cl, err := newClient(c, true)
if err != nil {
if config.Debug() {
log.ErrorlnQuit("could not create new client: %v", err)
log.ErrorlnQuit("could not create client: %v", err)
}
return nil, fmt.Errorf("Couldn't create new client")
}
@@ -156,7 +146,7 @@ func DoFetchCollections(c *cli.Context) ([]RemoteColl, error) {
if config.Debug() {
log.ErrorlnQuit("failed fetching user collections: %v", err)
}
return nil, fmt.Errorf("Couldn't get user collections")
return nil, fmt.Errorf("Couldn't get user blogs")
}

out := make([]RemoteColl, len(*colls))
@@ -174,8 +164,11 @@ func DoFetchCollections(c *cli.Context) ([]RemoteColl, error) {
}

// DoUpdate updates the given post on Write.as.
func DoUpdate(c *cli.Context, post []byte, friendlyID, token, font string, tor, code bool) error {
cl, _ := NewClient(c, false)
func DoUpdate(c *cli.Context, post []byte, friendlyID, token, font string, code bool) error {
cl, err := newClient(c, false)
if err != nil {
return fmt.Errorf("Unable to create client: %v", err)
}

params := writeas.PostParams{}
params.Title, params.Content = posts.ExtractTitle(string(post))
@@ -186,27 +179,24 @@ func DoUpdate(c *cli.Context, post []byte, friendlyID, token, font string, tor,
params.Font = config.GetFont(code, font)
}

_, err := cl.UpdatePost(friendlyID, token, &params)
_, err = cl.UpdatePost(friendlyID, token, &params)
if err != nil {
if config.Debug() {
log.ErrorlnQuit("Problem updating: %v", err)
}
return fmt.Errorf("Post doesn't exist, or bad edit token given.")
}

if tor {
log.Info(c, "Post updated via hidden service.")
} else {
log.Info(c, "Post updated.")
}
return nil
}

// DoDelete deletes the given post on Write.as, and removes any local references
func DoDelete(c *cli.Context, friendlyID, token string, tor bool) error {
cl, _ := NewClient(c, false)
func DoDelete(c *cli.Context, friendlyID, token string) error {
cl, err := newClient(c, false)
if err != nil {
return fmt.Errorf("Unable to create client: %v", err)
}

err := cl.DeletePost(friendlyID, token)
err = cl.DeletePost(friendlyID, token)
if err != nil {
if config.Debug() {
log.ErrorlnQuit("Problem deleting: %v", err)
@@ -214,18 +204,16 @@ func DoDelete(c *cli.Context, friendlyID, token string, tor bool) error {
return fmt.Errorf("Post doesn't exist, or bad edit token given.")
}

if tor {
log.Info(c, "Post deleted from hidden service.")
} else {
log.Info(c, "Post deleted.")
}
RemovePost(c.App.ExtraInfo()["configDir"], friendlyID)

return nil
}

func DoLogIn(c *cli.Context, username, password string) error {
cl := client(config.UserAgent(c), config.IsTor(c))
cl, err := newClient(c, false)
if err != nil {
return fmt.Errorf("Unable to create client: %v", err)
}

u, err := cl.LogIn(username, password)
if err != nil {
@@ -244,9 +232,9 @@ func DoLogIn(c *cli.Context, username, password string) error {
}

func DoLogOut(c *cli.Context) error {
cl, err := NewClient(c, true)
cl, err := newClient(c, true)
if err != nil {
return err
return fmt.Errorf("Unable to create client: %v", err)
}

err = cl.LogOut()


+ 1
- 15
api/posts.go View File

@@ -60,7 +60,7 @@ func AddPost(c *cli.Context, id, token string) error {
// ClaimPost adds a local post to the authenticated user's account and deletes
// the local reference
func ClaimPosts(c *cli.Context, localPosts *[]Post) (*[]writeas.ClaimPostResult, error) {
cl, err := NewClient(c, true)
cl, err := newClient(c, true)
if err != nil {
return nil, err
}
@@ -260,20 +260,6 @@ func WritePost(postsDir string, p *writeas.Post) error {
return ioutil.WriteFile(filepath.Join(postsDir, collDir, postFilename), []byte(txtFile), 0644)
}

func HandlePost(fullPost []byte, c *cli.Context) (*writeas.Post, error) {
tor := config.IsTor(c)
if c.Int("tor-port") != 0 {
TorPort = c.Int("tor-port")
}
if tor {
log.Info(c, "Posting to hidden service...")
} else {
log.Info(c, "Posting...")
}

return DoPost(c, fullPost, c.String("font"), false, tor, c.Bool("code"))
}

func ReadStdIn() []byte {
numBytes, numChunks := int64(0), int64(0)
r := bufio.NewReader(os.Stdin)


+ 2
- 2
api/sync.go View File

@@ -28,12 +28,12 @@ func CmdPull(c *cli.Context) error {
syncSetUp(c.App.ExtraInfo()["configDir"], cfg)
}

// Fetch posts
cl, err := NewClient(c, true)
cl, err := newClient(c, true)
if err != nil {
return err
}

// Fetch posts
posts, err := cl.GetUserPosts()
if err != nil {
return err


+ 0
- 18
api/tor.go View File

@@ -1,18 +0,0 @@
package api

import (
"fmt"
"net/http"

"code.as/core/socks"
)

var (
TorPort = 9150
)

func torClient() *http.Client {
dialSocksProxy := socks.DialSocksProxy(socks.SOCKS5, fmt.Sprintf("127.0.0.1:%d", TorPort))
transport := &http.Transport{Dial: dialSocksProxy}
return &http.Client{Transport: transport}
}

+ 47
- 21
commands/commands.go View File

@@ -14,7 +14,13 @@ import (
)

func CmdPost(c *cli.Context) error {
_, err := api.HandlePost(api.ReadStdIn(), c)
_, err := api.DoPost(c, api.ReadStdIn(), c.String("font"), false, c.Bool("code"))
if config.IsTor(c) {
log.Info(c, "Posted to hidden service...")
} else {
log.Info(c, "Posted...")
}

return err
}

@@ -35,7 +41,13 @@ func CmdNew(c *cli.Context) error {
log.InfolnQuit("Empty post. Bye!")
}

_, err := api.HandlePost(*p, c)
if config.IsTor(c) {
log.Info(c, "Posting to hidden service...")
} else {
log.Info(c, "Posting...")
}

_, err := api.DoPost(c, *p, c.String("font"), false, c.Bool("code"))
if err != nil {
log.Errorln("Error posting: %s\n%s", err, config.MessageRetryCompose(fname))
return cli.NewExitError("", 1)
@@ -58,7 +70,13 @@ func CmdPublish(c *cli.Context) error {
if err != nil {
return err
}
_, err = api.HandlePost(content, c)

if config.IsTor(c) {
log.Info(c, "Publishing to hidden service...")
} else {
log.Info(c, "Publishing...")
}
_, err = api.DoPost(c, content, c.String("font"), false, c.Bool("code"))

// TODO: write local file if directory is set
return err
@@ -81,17 +99,13 @@ func CmdDelete(c *cli.Context) error {
}
}

tor := config.IsTor(c)
if c.Int("tor-port") != 0 {
api.TorPort = c.Int("tor-port")
}
if tor {
if config.IsTor(c) {
log.Info(c, "Deleting via hidden service...")
} else {
log.Info(c, "Deleting...")
}

err := api.DoDelete(c, friendlyID, token, tor)
err := api.DoDelete(c, friendlyID, token)
if err != nil {
return cli.NewExitError(fmt.Sprintf("Couldn't delete remote copy: %v", err), 1)
}
@@ -120,17 +134,13 @@ func CmdUpdate(c *cli.Context) error {
// Read post body
fullPost := api.ReadStdIn()

tor := config.IsTor(c)
if c.Int("tor-port") != 0 {
api.TorPort = c.Int("tor-port")
}
if tor {
if config.IsTor(c) {
log.Info(c, "Updating via hidden service...")
} else {
log.Info(c, "Updating...")
}

return api.DoUpdate(c, fullPost, friendlyID, token, c.String("font"), tor, c.Bool("code"))
return api.DoUpdate(c, fullPost, friendlyID, token, c.String("font"), c.Bool("code"))
}

func CmdGet(c *cli.Context) error {
@@ -139,17 +149,13 @@ func CmdGet(c *cli.Context) error {
return cli.NewExitError("usage: writeas get <postId>", 1)
}

tor := config.IsTor(c)
if c.Int("tor-port") != 0 {
api.TorPort = c.Int("tor-port")
}
if tor {
if config.IsTor(c) {
log.Info(c, "Getting via hidden service...")
} else {
log.Info(c, "Getting...")
}

return api.DoFetch(friendlyID, config.UserAgent(c), tor)
return api.DoFetch(c, friendlyID)
}

func CmdAdd(c *cli.Context) error {
@@ -223,6 +229,11 @@ func CmdCollections(c *cli.Context) error {
if u == nil {
return cli.NewExitError("You must be authenticated to view collections.\nLog in first with: writeas auth <username>", 1)
}
if config.IsTor(c) {
log.Info(c, "Getting blogs via hidden service...")
} else {
log.Info(c, "Getting blogs...")
}
colls, err := api.DoFetchCollections(c)
if err != nil {
return cli.NewExitError(fmt.Sprintf("Couldn't get collections for user %s: %v", u.User.Username, err), 1)
@@ -260,6 +271,10 @@ func CmdClaim(c *cli.Context) error {
}

log.Info(c, "Claiming %d post(s) for %s...", len(*localPosts), u.User.Username)
if config.IsTor(c) {
log.Info(c, "...via hidden service...")
}

results, err := api.ClaimPosts(c, localPosts)
if err != nil {
return cli.NewExitError(fmt.Sprintf("Failed to claim posts: %v", err), 1)
@@ -313,6 +328,12 @@ func CmdAuth(c *cli.Context) error {
if len(pass) == 0 {
return cli.NewExitError("Please enter your password.", 1)
}

if config.IsTor(c) {
log.Info(c, "Logging in to hidden service...")
} else {
log.Info(c, "Logging in...")
}
err = api.DoLogIn(c, username, string(pass))
if err != nil {
return cli.NewExitError(fmt.Sprintf("error logging in: %v", err), 1)
@@ -322,5 +343,10 @@ func CmdAuth(c *cli.Context) error {
}

func CmdLogOut(c *cli.Context) error {
if config.IsTor(c) {
log.Info(c, "Logging out of hidden service...")
} else {
log.Info(c, "Logging out...")
}
return api.DoLogOut(c)
}

+ 8
- 0
config/options.go View File

@@ -15,6 +15,7 @@ const (
WriteasBaseURL = "https://write.as"
DevBaseURL = "https://development.write.as"
TorBaseURL = "http://writeas7pm7rcdqg.onion"
torPort = 9150
)

func UserAgent(c *cli.Context) string {
@@ -29,6 +30,13 @@ func IsTor(c *cli.Context) bool {
return c.Bool("tor") || c.Bool("t")
}

func TorPort(c *cli.Context) int {
if c.IsSet("tor-port") && c.Int("tor-port") != 0 {
return c.Int("tor-port")
}
return torPort
}

func Language(c *cli.Context, auto bool) string {
if l := c.String("lang"); l != "" {
return l


Loading…
Cancel
Save