Archived
1
0

set in-reply-to and fetch missing cites

This commit is contained in:
Jeff Becker 2017-09-23 09:28:25 -04:00
parent b75d669f4e
commit e224ee7aab
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05
5 changed files with 65 additions and 15 deletions

View File

@ -114,7 +114,7 @@ type NNTPDaemon struct {
// channel for broadcasting a message to all feeds given their newsgroup, message_id // channel for broadcasting a message to all feeds given their newsgroup, message_id
send_all_feeds chan ArticleEntry send_all_feeds chan ArticleEntry
// channel for broadcasting an ARTICLE command to all feeds in reader mode // channel for broadcasting an ARTICLE command to all feeds in reader mode
ask_for_article chan ArticleEntry ask_for_article chan string
// operation of daemon done after sending bool down this channel // operation of daemon done after sending bool down this channel
done chan bool done chan bool
@ -123,7 +123,7 @@ type NNTPDaemon struct {
send_articles_mtx sync.RWMutex send_articles_mtx sync.RWMutex
send_articles []ArticleEntry send_articles []ArticleEntry
ask_articles_mtx sync.RWMutex ask_articles_mtx sync.RWMutex
ask_articles []ArticleEntry ask_articles []string
pump_ticker *time.Ticker pump_ticker *time.Ticker
expiration_ticker *time.Ticker expiration_ticker *time.Ticker
@ -535,7 +535,7 @@ func (self *NNTPDaemon) Run() {
self.get_feeds = make(chan chan []*feedStatus) self.get_feeds = make(chan chan []*feedStatus)
self.get_feed = make(chan *feedStatusQuery) self.get_feed = make(chan *feedStatusQuery)
self.modify_feed_policy = make(chan *modifyFeedPolicyEvent) self.modify_feed_policy = make(chan *modifyFeedPolicyEvent)
self.ask_for_article = make(chan ArticleEntry) self.ask_for_article = make(chan string)
self.pump_ticker = time.NewTicker(time.Millisecond * 100) self.pump_ticker = time.NewTicker(time.Millisecond * 100)
if self.conf.daemon["archive"] == "1" { if self.conf.daemon["archive"] == "1" {
@ -823,10 +823,10 @@ func (self *NNTPDaemon) pump_article_requests() {
} }
articles = nil articles = nil
self.ask_articles_mtx.Lock() self.ask_articles_mtx.Lock()
articles = append(articles, self.ask_articles...) msgids := self.ask_articles
self.ask_articles = nil self.ask_articles = nil
self.ask_articles_mtx.Unlock() self.ask_articles_mtx.Unlock()
for _, entry := range articles { for _, entry := range msgids {
self.ask_for_article <- entry self.ask_for_article <- entry
} }
articles = nil articles = nil
@ -898,15 +898,13 @@ func (self *NNTPDaemon) poll(worker int) {
for _, f := range feeds { for _, f := range feeds {
var send []*nntpConnection var send []*nntpConnection
for _, feed := range f.Conns { for _, feed := range f.Conns {
if feed.policy.AllowsNewsgroup(nntp.Newsgroup()) { if strings.HasSuffix(feed.name, "-reader") {
if strings.HasSuffix(feed.name, "-reader") { send = append(send, feed)
send = append(send, feed)
}
} }
} }
minconn := lowestBacklogConnection(send) minconn := lowestBacklogConnection(send)
if minconn != nil { if minconn != nil {
minconn.askForArticle(nntp.MessageID()) go minconn.askForArticle(nntp)
} }
} }
} }
@ -928,9 +926,9 @@ func lowestBacklogConnection(conns []*nntpConnection) (minconn *nntpConnection)
return return
} }
func (self *NNTPDaemon) askForArticle(e ArticleEntry) { func (self *NNTPDaemon) askForArticle(msgid string) {
self.ask_articles_mtx.Lock() self.ask_articles_mtx.Lock()
self.ask_articles = append(self.ask_articles, e) self.ask_articles = append(self.ask_articles, msgid)
self.ask_articles_mtx.Unlock() self.ask_articles_mtx.Unlock()
} }

View File

@ -330,6 +330,9 @@ type Database interface {
// get newsgroup list with watermarks // get newsgroup list with watermarks
GetNewsgroupList() (NewsgroupList, error) GetNewsgroupList() (NewsgroupList, error)
// find cites in text
FindCitesInText(msg string) ([]string, error)
} }
func NewDatabase(db_type, schema, host, port, user, password string) Database { func NewDatabase(db_type, schema, host, port, user, password string) Database {

View File

@ -865,6 +865,17 @@ func (self *httpFrontend) handle_postRequest(pr *postRequest, b bannedFunc, e er
// set message // set message
nntp.message = nntpSanitize(pr.Message) nntp.message = nntpSanitize(pr.Message)
cites, err := self.daemon.database.FindCitesInText(nntp.message)
if err != nil {
e(err)
return
}
if len(cites) > 0 {
nntp.headers.Set("In-Reply-To", strings.Join(cites, " "))
}
// set date // set date
nntp.headers.Set("Date", timeNowStr()) nntp.headers.Set("Date", timeNowStr())
// append path from frontend // append path from frontend

View File

@ -560,6 +560,17 @@ func (self *nntpConnection) storeMessage(daemon *NNTPDaemon, hdr textproto.MIMEH
_, err = io.Copy(Discard, body) _, err = io.Copy(Discard, body)
return return
} }
// ask for replies
replyTos := strings.Split(hdr.Get("In-Reply-To"), " ")
for _, reply := range replyTos {
if ValidMessageID(reply) {
if !daemon.store.HasArticle(reply) {
go daemon.askForArticle(reply)
}
}
}
path := hdr.Get("Path") path := hdr.Get("Path")
hdr.Set("Path", daemon.instance_name+"!"+path) hdr.Set("Path", daemon.instance_name+"!"+path)
// now store attachments and article // now store attachments and article
@ -741,7 +752,7 @@ func (self *nntpConnection) handleLine(daemon *NNTPDaemon, code int, line string
newsgroup := hdr.Get("Newsgroups") newsgroup := hdr.Get("Newsgroups")
if reference != "" && ValidMessageID(reference) && !daemon.store.HasArticle(reference) && !daemon.database.IsExpired(reference) { if reference != "" && ValidMessageID(reference) && !daemon.store.HasArticle(reference) && !daemon.database.IsExpired(reference) {
log.Println(self.name, "got reply to", reference, "but we don't have it") log.Println(self.name, "got reply to", reference, "but we don't have it")
go daemon.askForArticle(ArticleEntry{reference, newsgroup}) go daemon.askForArticle(reference)
} }
// store message // store message
r := &io.LimitedReader{ r := &io.LimitedReader{
@ -832,7 +843,7 @@ func (self *nntpConnection) handleLine(daemon *NNTPDaemon, code int, line string
newsgroup := hdr.Get("Newsgroups") newsgroup := hdr.Get("Newsgroups")
if reference != "" && ValidMessageID(reference) && !daemon.store.HasArticle(reference) && !daemon.database.IsExpired(reference) { if reference != "" && ValidMessageID(reference) && !daemon.store.HasArticle(reference) && !daemon.database.IsExpired(reference) {
log.Println(self.name, "got reply to", reference, "but we don't have it") log.Println(self.name, "got reply to", reference, "but we don't have it")
go daemon.askForArticle(ArticleEntry{reference, newsgroup}) go daemon.askForArticle(reference)
} }
body := &io.LimitedReader{ body := &io.LimitedReader{
R: r, R: r,
@ -1179,7 +1190,7 @@ func (self *nntpConnection) handleLine(daemon *NNTPDaemon, code int, line string
if reference != "" && ValidMessageID(reference) { if reference != "" && ValidMessageID(reference) {
if !daemon.store.HasArticle(reference) && !daemon.database.IsExpired(reference) { if !daemon.store.HasArticle(reference) && !daemon.database.IsExpired(reference) {
log.Println(self.name, "got reply to", reference, "but we don't have it") log.Println(self.name, "got reply to", reference, "but we don't have it")
go daemon.askForArticle(ArticleEntry{reference, newsgroup}) go daemon.askForArticle(reference)
} else { } else {
h := daemon.store.GetMIMEHeader(reference) h := daemon.store.GetMIMEHeader(reference)
if strings.Trim(h.Get("References"), " ") == "" { if strings.Trim(h.Get("References"), " ") == "" {

View File

@ -1917,3 +1917,30 @@ func (self *PostgresDatabase) GetNewsgroupList() (list NewsgroupList, err error)
} }
return return
} }
func (self *PostgresDatabase) FindCitesInText(text string) (msgids []string, err error) {
hashes := findBacklinks(text)
if len(hashes) > 0 {
q := "SELECT message_id FROM ArticlePosts WHERE message_id_hash IN ( "
var params []string
var qparams []interface{}
for idx := range hashes {
params = append(params, fmt.Sprintf("$%d", idx+1))
qparams = append(qparams, hashes[idx])
}
q += strings.Join(params, ", ")
q += " )"
var rows *sql.Rows
rows, err = self.conn.Query(q, qparams...)
if err == sql.ErrNoRows {
err = nil
} else if err == nil {
for rows.Next() {
var msgid string
rows.Scan(&msgid)
msgids = append(msgids, msgid)
}
}
}
return
}