как сделать поиск записи SPF и проверить golang? - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть требование выполнить поиск домена spf и вернуть PASS / FAIL. В случае сбоя мне нужно вернуть запись SPF для дальнейшей диагностики.

Кажется, на github имеется множество golang модулей для Проверка SPF, но все они, кажется, не поддерживаются. Также, какой «официальный» поддерживаемый модуль использует

, это мой код, пожалуйста, прокомментируйте

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "net"
    "os"

    "github.com/mileusna/spf"
)

func main() {
    domain := os.Args[1]
    log.SetOutput(ioutil.Discard)   // If I dont do this there are a lot of debug logs 
    ip := net.ParseIP("1.2.3.4")
    r := spf.CheckHost(ip, domain, "", "")
    fmt.Printf("Domain = %s\nSPF=%s", domain, r.String())   // I need to return the value , 
                                                           // How do I get the spf record 

}

Если я загружаю модуль github и внести изменения в источник, это хорошая идея ??

1 Ответ

0 голосов
/ 10 апреля 2020

Я подумал пару минут, чтобы ответить на этот вопрос. Причина этого в том, что вы, очевидно, ожидаете, что мы прочитаем код этих модулей для вас и придумаем решение. Что, честно говоря, является чем-то вроде того, что у вас есть «требования», связанные с бизнесом.

Однако другие могут извлечь из этого уроки, и вам придется приложить достаточно усилий, чтобы достаточно надежный код (IPv6, кто-нибудь?).

По сути, у вас есть два вопроса: «Как получить запись SPF для домена и вернуть ее, когда она есть?» и «Как правильно обрабатывать отправку кода на github (или на хостах с кодом git в целом)?»

Как получить запись SPF для домена, если она есть?

В конце концов, SPF - это соглашение, использующее существующие технологии. Запись SPF - это не что иное, как специально отформатированная запись ресурса TXT в домене.

Следовательно, вам не нужен пакет, чтобы определить, есть ли у домена запись SPF:

package main

import (
    "flag"
    "log"
    "net"
    "os"
    "regexp"
)

var domain string

var spfPattern *regexp.Regexp
var verbose bool

func init() {

    // some flags to make the problem more usable.
    flag.StringVar(&domain, "domain", "", "the domain to check for SPF records")
    flag.BoolVar(&verbose, "verbose", false, "print moar!")

    // Obviously, this is a very, very simple pattern.
    // It lacks any true validation whether the TXT record
    // is in fact a valid SPF. Expanding the regex should
    // not be too hard and I leave it up to you.
    spfPattern = regexp.MustCompile(`\s*v=spf1.*`)
}

func main() {
    flag.Parse()

    // Lookup ALL resource records rs of type TXT for domain.
    rs, err := net.LookupTXT(domain)

    // If there was an error accessing the TXT records...
    if err != nil {
        // ...we inform the user and...
        log.Printf("accessing TXT records for %s", err)
        // ...inform the caller that something went wrong.
        os.Exit(1)
    }

    // Now we have all TXT records for the domain we iterate through them...
    for _, rr := range rs {
        // ... and if one of them matches the pattern of an SPF record...
        if spfPattern.MatchString(rr) {

            // ...we inform the user if the user requested it...
            if verbose {
                log.Printf("%s has a valid SPFv1 record: %s", domain, rr)
            }
            // ...or simply inform the caller, as per the UNIX convention
            // "No news is good news!"
            os.Exit(0)
        }
    }
    // We have iterated through all TXT records and did not find matching
    // the pattern of an SPF record, so we need to inform both the user...
    log.Println("No valid SPF record found.")

    // ...and the caller.
    os.Exit(2)
}

Как правильно обрабатывать вклады в код

Если вы видите код, который, по вашему мнению, нуждается в расширениях, или вы нашли ошибку и хотите ее исправить, первое, что вам нужно сделать, - это форкнуть оригинальный репозиторий. - по сути, вы делаете его копию с преимуществом сохранения истории коммитов.

Далее вы клонируете свой форк и выполняете работу, которую хотите сделать на этой вилке. Вы должны использовать одну или несколько ветвей для ваших изменений. Каждый коммит должен быть как можно более атомным c. В идеале библиотека компилируется, и тесты выполняются до и после любого коммита.

Когда вы закончите и думаете, что ваш код готов к выпуску, вы создаете запрос на извлечение . В основном запрос на извлечение говорит: «Эй, владелец исходного репозитория, я внес некоторые изменения и улучшил код, вы можете рассмотреть возможность объединения моих изменений в исходный код!»

Многие проекты в настоящее время используют модель ветвления, называемую «gitflow» , и я сильно предлагает вам запомнить ее, пока вы не сможете петь ее в обратном направлении даже при сильно высоком уровне BA C.

git flow

...