From 44b7a4844f1cb05eceedab9108451fd1bf9a74f2 Mon Sep 17 00:00:00 2001
From: Kevin Lyda <kevin@ie.suberic.net>
Date: Wed, 1 Aug 2018 12:48:47 +0100
Subject: [PATCH] Base64 encode the token.

---
 cmd/cashier/main.go | 13 ++++++++-----
 server/web.go       | 21 ++++++++-------------
 2 files changed, 16 insertions(+), 18 deletions(-)

diff --git a/cmd/cashier/main.go b/cmd/cashier/main.go
index acbaed7f..c62a6169 100644
--- a/cmd/cashier/main.go
+++ b/cmd/cashier/main.go
@@ -3,13 +3,13 @@ package main
 import (
 	"bufio"
 	"bytes"
+	"encoding/base64"
 	"fmt"
 	"log"
 	"net"
 	"os"
 	"os/user"
 	"path"
-	"strings"
 	"time"
 
 	"github.com/nsheridan/cashier/client"
@@ -53,11 +53,14 @@ func main() {
 	fmt.Print("Enter token: ")
 	scanner := bufio.NewScanner(os.Stdin)
 	var buffer bytes.Buffer
-	for scanner.Scan(); strings.HasSuffix(scanner.Text(), "+++"); scanner.Scan() {
-		buffer.WriteString(scanner.Text()[:len(scanner.Text())-4])
+	for scanner.Scan(); scanner.Text() == ".\n"; scanner.Scan() {
+		buffer.WriteString(scanner.Text())
 	}
-	buffer.WriteString(scanner.Text())
-	token := buffer.String()
+	tokenBytes, err := base64.StdEncoding.DecodeString(buffer.String())
+	if err != nil {
+		log.Fatalln(err)
+	}
+	token := string(tokenBytes)
 
 	var message string
 	fmt.Print("Enter message: ")
diff --git a/server/web.go b/server/web.go
index a67d5f3e..09f7246c 100644
--- a/server/web.go
+++ b/server/web.go
@@ -3,6 +3,7 @@ package server
 import (
 	"bytes"
 	"crypto/rand"
+	"encoding/base64"
 	"encoding/hex"
 	"encoding/json"
 	"fmt"
@@ -182,13 +183,10 @@ func callbackHandler(a *appContext, w http.ResponseWriter, r *http.Request) (int
 	return http.StatusFound, nil
 }
 
-func chunkString(s string, chunkSize int) string {
-	if len(s) <= chunkSize {
-		return s
-	}
-
+func encodeString(s string) string {
 	var buffer bytes.Buffer
-	runes := []rune(s)
+	chunkSize := 70
+	runes := []rune(base64.StdEncoding.EncodeToString([]byte(s)))
 
 	for i := 0; i < len(runes); i += chunkSize {
 		end := i + chunkSize
@@ -196,13 +194,10 @@ func chunkString(s string, chunkSize int) string {
 			end = len(runes)
 		}
 		buffer.WriteString(string(runes[i:end]))
-		buffer.WriteString("+++\n")
-	}
-	chunks := buffer.String()
-	if len(chunks) > 0 {
-		chunks = chunks[:len(chunks)-4]
+		buffer.WriteString("\n")
 	}
-	return chunks
+	buffer.WriteString(".\n")
+	return buffer.String()
 }
 
 // rootHandler starts the auth process. If the client is authenticated it renders the token to the user.
@@ -214,7 +209,7 @@ func rootHandler(a *appContext, w http.ResponseWriter, r *http.Request) (int, er
 	page := struct {
 		Token string
 	}{tok.AccessToken}
-	page.Token = chunkString(page.Token, 250)
+	page.Token = encodeString(page.Token)
 
 	tmpl := template.Must(template.New("token.html").Parse(templates.Token))
 	tmpl.Execute(w, page)
-- 
GitLab