Skip to content

Commit

Permalink
2019年 05月 14日 星期二 13:31:58 CST
Browse files Browse the repository at this point in the history
  • Loading branch information
rocket049 committed May 14, 2019
1 parent fa4b1fd commit bf76617
Show file tree
Hide file tree
Showing 6 changed files with 201 additions and 38 deletions.
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
secret-diary
/deploy

moc*
rcc*
/testdata
17 changes: 17 additions & 0 deletions aes.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,23 @@ func getRealKeyString(pwd string) (string, error) {
return fmt.Sprintf("%x", buf.Bytes()), nil
}

func newRealKeyString(rkey []byte, pwd string) (string, error) {
p1 := getSha4(pwd)
aesBlock, err := aes.NewCipher(p1)
if err != nil {
return "", err
}
iv := make([]byte, aes.BlockSize)
io.ReadFull(rand.Reader, iv)

aesEncoder := cipher.NewCTR(aesBlock, iv)
var res = make([]byte, 32)
aesEncoder.XORKeyStream(res, rkey)
buf := bytes.NewBuffer(iv)
buf.Write(res)
return fmt.Sprintf("%x", buf.Bytes()), nil
}

func decodeRealKey(key, data, iv []byte) ([]byte, error) {
aesBlock, err := aes.NewCipher(key)
if err != nil {
Expand Down
13 changes: 13 additions & 0 deletions bridge.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package main

import (
"github.com/therecipe/qt/core"
)

type QmlBridge struct {
core.QObject

_ func(id, day, title, mtime string, r, c int) `signal:"addDiary"`
_ func(r, c int) `signal:"setMonthFlag"`
_ func(ym string) `signal:"addYearMonth"`
}
44 changes: 37 additions & 7 deletions db.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,17 @@ func createUserDb(name string, pwd string) error {
userDb := path.Join(dataDir, "diary.db")
if _, err := os.Stat(userDb); err == nil {
//exists
return nil
return errors.New("Already exists.")
}
db, err := sql.Open("sqlite3", userDb)
if err != nil {
return err
}
defer db.Close()
sqls := []string{"create table user (id INTEGER UNIQUE,cdata text,sha40 TEXT not null,realkey text not null,mtime text);",
"create table diaries (id integer,cdate text,title text,filename text,mtime text);",
"create index idx1 on diaries(cdate);",
"create index idx2 on diaries(title);"}
sqls := []string{"create table user (id integer unique,cdata text,sha40 TEXT not null,realkey text not null,mtime text);",
"create table diaries (id integer unique,cdate text,title text,filename text,mtime text);"}
//"create index idx1 on diaries(cdate);",
//"create index idx2 on diaries(title);"}
for i := 0; i < len(sqls); i++ {
_, err = db.Exec(sqls[i])
if err != nil {
Expand Down Expand Up @@ -99,6 +99,36 @@ func (s *myDb) GetRealKey(pwd string) ([]byte, error) {
return decodeRealKey(ukey, data, iv)
}

func (s *myDb) UpdateRealKeyAndSha40(pwdOld, pwdNew string) error {
sha40 := getSha40String(pwdOld)
row := s.db.QueryRow("select realkey from user where sha40=?;", sha40)
var realKey string
err := row.Scan(&realKey)
if err != nil {
return err
}
key, err := hex.DecodeString(realKey)
if err != nil {
return err
}
if len(key) != 32+aes.BlockSize {
return errors.New("Data invalid.")
}
iv := key[:aes.BlockSize]
data := key[32:]
ukey := getSha4(pwdOld)
rkey, err := decodeRealKey(ukey, data, iv)
if err != nil {
return err
}
rkeyStr, err := newRealKeyString(rkey, pwdNew)
if err != nil {
return err
}
_, err = s.db.Exec("update user set realkey=?,sha40=? where id=1;", rkeyStr, getSha40String(pwdNew))
return err
}

func (s *myDb) AddDiary(id int, cdate, title, filename string) error {
_, err := s.db.Exec("insert into diaries(id,cdate,title,filename,mtime) values(?,?,?,?,?);",
id, cdate, title, filename, time.Now().Format("2006-01-02 15:04:05"))
Expand Down Expand Up @@ -144,7 +174,7 @@ func (s *myDb) NextId() int {
}

func (s *myDb) GetYearMonths() ([]string, error) {
rows, err := s.db.Query("select distinct substr(cdate,0,8) from diaries;")
rows, err := s.db.Query("select distinct substr(cdate,0,8) from diaries order by substr(cdate,0,8) desc;")
if err != nil {
return nil, err
}
Expand All @@ -166,7 +196,7 @@ type diaryItem struct {
}

func (s *myDb) GetListFromYearMonth(ym string) ([]diaryItem, error) {
rows, err := s.db.Query("select id,substr(cdate,9,11),title,mtime from diaries where substr(cdate,0,8)=?;", ym)
rows, err := s.db.Query("select id,substr(cdate,9,11),title,mtime from diaries where substr(cdate,0,8)=? order by substr(cdate,9,11) desc;", ym)
if err != nil {
return nil, err
}
Expand Down
59 changes: 59 additions & 0 deletions db_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package main

import (
"fmt"
"os"
"path"
"testing"
"time"
)

func TestAddDiary(t *testing.T) {
home, _ := os.UserHomeDir()
path1 := path.Join(home, ".sdiary", "test", "diary.db")
os.Remove(path1)
err := createUserDb("test", "1234")
if err != nil {
t.Fatal(err)
}
db, err := getMyDb("test")
if err != nil {
t.Fatal(err)
}
defer db.Close()
tt, err := time.Parse("20060102", "19790101")
if err != nil {
t.Fatal(err)
}
stop := time.Now().Unix()
id := db.NextId()
for tt.Unix() < stop {

cdate := tt.Format("2006-01-02")
title := fmt.Sprintf("diary %d", id)
filename := fmt.Sprintf("%d.dat", id)
db.AddDiary(id, cdate, title, filename)
tt = tt.Add(time.Hour * 24)
id++
}
}

func TestUpdatePwd(t *testing.T) {
home, _ := os.UserHomeDir()
path1 := path.Join(home, ".sdiary", "test2", "diary.db")
os.Remove(path1)
err := createUserDb("test2", "1234")
if err != nil {
t.Fatal(err)
}
db, err := getMyDb("test2")
if err != nil {
t.Fatal(err)
}
defer db.Close()
db.UpdateRealKeyAndSha40("1234", "12345")
_, err = db.GetRealKey("12345")
if err != nil {
t.Fatal(err)
}
}
102 changes: 72 additions & 30 deletions gui.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ type myWindow struct {
user string
key []byte
db *myDb
bridge *QmlBridge
}

func (s *myWindow) getNewId() (res int) {
Expand Down Expand Up @@ -143,7 +144,7 @@ func (s *myWindow) Create(app *widgets.QApplication) {
}

func (s *myWindow) saveCurDiary() {
if !curDiary.Modified {
if !curDiary.Modified || s.editor.Document().IsModified() == false {
s.setStatusBar(T("No Diary Saved"))
return
}
Expand Down Expand Up @@ -193,7 +194,9 @@ func (s *myWindow) addDiary(yearMonth, day, title string) {
diary.SetEditable(false)
diary.SetAccessibleText("")

month.AppendRow2(diary)
//month.AppendRow2(diary)
month.InsertRow2(0, diary)
s.tree.SetCurrentIndex(diary.Index())

curDiary.Item = diary
curDiary.Day = day
Expand All @@ -207,41 +210,62 @@ func (s *myWindow) addDiary(yearMonth, day, title string) {
}

func (s *myWindow) addYearMonthsFromDb() {
yms, err := s.db.GetYearMonths()
if err != nil {
return
}
for i := 0; i < len(yms); i++ {
s.addYearMonth(yms[i])
}
s.setStatusBar(T("Loading Diary List..."))

topidx := core.NewQModelIndex()
pidx := s.model.Parent(topidx)
for r := 0; r < s.model.RowCount(pidx); r++ {
c := 0
s.bridge = NewQmlBridge(s.window)
var wg sync.WaitGroup
s.bridge.ConnectAddYearMonth(func(ym string) {
s.addYearMonth(ym)
wg.Done()
})
s.bridge.ConnectAddDiary(func(id, day, title, mtime string, r, c int) {
item := s.model.Item(r, c)
diary := gui.NewQStandardItem2(fmt.Sprintf("%s-%s", day, title))
diary.SetEditable(false)
diary.SetAccessibleText(id)
diary.SetAccessibleDescription("0")
diary.SetToolTip(T("Last Modified:") + mtime)

items, err := s.db.GetListFromYearMonth(item.Text())
item.AppendRow2(diary)
})
s.bridge.ConnectSetMonthFlag(func(r, c int) {
item := s.model.TakeItem(r, c)
item.SetAccessibleText("1")
item.SetAccessibleDescription("1")
s.model.SetItem(r, c, item)
if r < 2 {
s.tree.Expand(item.Index())
}
})
go func() {
yms, err := s.db.GetYearMonths()
if err != nil {
log.Println(err)
return
}
for i := 0; i < len(items); i++ {
diary := gui.NewQStandardItem2(fmt.Sprintf("%s-%s", items[i].Day, items[i].Title))
diary.SetEditable(false)
diary.SetAccessibleText(strconv.Itoa(items[i].Id))
diary.SetAccessibleDescription("0")
diary.SetToolTip(T("Last Modified:") + items[i].MTime)

item.AppendRow2(diary)
for i := 0; i < len(yms); i++ {
wg.Add(1)
s.bridge.AddYearMonth(yms[i])
}
wg.Wait()
topidx := core.NewQModelIndex()
pidx := s.model.Parent(topidx)
for r := 0; r < s.model.RowCount(pidx); r++ {
c := 0
item := s.model.Item(r, c)
items, err := s.db.GetListFromYearMonth(item.Text())
if err != nil {
log.Println(err)
return
}
for i := 0; i < len(items); i++ {
s.bridge.AddDiary(strconv.Itoa(items[i].Id), items[i].Day, items[i].Title, items[i].MTime, r, c)
}

item = s.model.TakeItem(r, c)
item.SetAccessibleText("1")
item.SetAccessibleDescription("1")
s.model.SetItem(r, c, item)
s.bridge.SetMonthFlag(r, c)

}
}()

}
return
}

Expand Down Expand Up @@ -280,6 +304,14 @@ func (s *myWindow) setTreeFuncs() {
txt, err := decodeFromFile(filename, s.key)
if err != nil {
log.Println(err)
if curDiary.Item != nil {
s.saveCurDiary()
}
curDiary.Item = diary
curDiary.Modified = false
curDiary.YearMonth = item.Text()
vs := strings.SplitN(diary.Text(), "-", 2)
curDiary.Day = vs[0]
} else {
if curDiary.Item != nil {
s.saveCurDiary()
Expand All @@ -289,7 +321,9 @@ func (s *myWindow) setTreeFuncs() {
curDiary.YearMonth = item.Text()
vs := strings.SplitN(diary.Text(), "-", 2)
curDiary.Day = vs[0]
s.editor.SetHtml(txt)
//s.editor.SetHtml(txt)
s.editor.Document().SetHtml(txt)
s.editor.Document().SetModified(false)
}
}

Expand Down Expand Up @@ -358,6 +392,7 @@ func (s *myWindow) login() {

pwdInput := widgets.NewQLineEdit(dlg)
pwdInput.SetEchoMode(widgets.QLineEdit__Password)
pwdInput.SetPlaceholderText(T("Length Must >= 4"))
grid.AddWidget(pwdInput, 1, 1, 0)

btb := widgets.NewQGridLayout(nil)
Expand All @@ -379,6 +414,9 @@ func (s *myWindow) login() {

okBtn.ConnectClicked(func(b bool) {
var err error
if len(pwdInput.Text()) < 3 || len(nameInput.Text()) < 1 {
return
}
s.db, err = getMyDb(nameInput.Text())
if err != nil {
panic(err)
Expand All @@ -388,12 +426,15 @@ func (s *myWindow) login() {
panic(err)
}

s.window.SetWindowTitle(nameInput.Text())
dlg.Hide()

})

regBtn.ConnectClicked(func(b bool) {

if len(pwdInput.Text()) < 3 || len(nameInput.Text()) < 1 {
return
}
err := createUserDb(nameInput.Text(), pwdInput.Text())
if err != nil {
panic(err)
Expand All @@ -407,6 +448,7 @@ func (s *myWindow) login() {
panic(err)
}

s.window.SetWindowTitle(nameInput.Text())
dlg.Hide()

})
Expand Down

0 comments on commit bf76617

Please sign in to comment.