Esempio n. 1
0
func main() {
	auth := auth.NewAuth(nil)
	for key, value := range auth.Services {
		fmt.Println("Service: " + key + "=" + value)
	}
	for key, value := range auth.Settings {
		fmt.Println("Setting: " + key + "=" + value)
	}
	client := auth.NewClient()
	fmt.Println("Calling testauth.")
	r, err := client.Get(auth.Services["testauth"])
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("Testauth done.")
	fmt.Println(r.StatusCode)
	fmt.Println("Calling logout.")
	r, err = client.Get(auth.Services["logout"])
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("Logout done.")
	fmt.Println(r.StatusCode)
}
func credsInit() *CredsManager {
	cm := &CredsManager{}
	cm.userCreds = make(map[string]*pacificaauth.Auth)
	cm.outage = make(map[string]*time.Time)
	web.ServMux.HandleFunc("/passcreds/", func(w http.ResponseWriter, req *http.Request) { passcredsHandle(cm, w, req) })
	web.ServMux.HandleFunc("/status/xml/", func(w http.ResponseWriter, req *http.Request) { statusXmlHandle(cm, w, req) })
	os.MkdirAll(filepath.Join(common.BaseDir, "auth", "creds"), 0700)
	err := os.RemoveAll(filepath.Join(common.BaseDir, "auth", "tmpcreds"))
	if err != nil {
		log.Printf("Failed to clean out the tmpcreds directory. %v\n", err)
		os.Exit(-1)
	}
	os.MkdirAll(filepath.Join(common.BaseDir, "auth", "tmpcreds"), 0700)
	if common.System && platform.PlatformGet() == platform.Windows {
		err = common.Cacls(filepath.Join(common.BaseDir, "auth", "creds"), "/p", "NT AUTHORITY\\SYSTEM:f", "BUILTIN\\Administrators:F")
		if err != nil {
			log.Printf("Failed to run cacls %v\n", err)
			os.Exit(-1)
		}
		err = common.Cacls(filepath.Join(common.BaseDir, "auth", "tmpcreds"), "/p", "NT AUTHORITY\\SYSTEM:f", "BUILTIN\\Administrators:F")
		if err != nil {
			log.Printf("Failed to run cacls %v\n", err)
			os.Exit(-1)
		}
	}
	creds, err := filepath.Glob(filepath.Join(common.BaseDir, "auth", "creds", "*"))
	if err == nil {
		for _, credfile := range creds {
			user := common.FsDecodeUser(credfile)
			if user != "" {
				file, err := os.Open(credfile)
				if err == nil {
					auth := pacificaauth.NewAuth(file)
					if auth != nil {
						log.Printf("Found cred file. %v %v\n", credfile, user)
						cm.userCreds[user] = auth
					}
				}
			}
		}
	}
	return cm
}
func passcredsHandle(cm *CredsManager, w http.ResponseWriter, req *http.Request) {
	if web.AuthCheck(w, req) {
		if req.Method != "PUT" {
			w.WriteHeader(http.StatusMethodNotAllowed)
		} else {
			file, err := ioutil.TempFile(filepath.Join(common.BaseDir, "auth", "tmpcreds"), "creds")
			if err != nil {
				//FIXME what to return here?
				w.WriteHeader(http.StatusBadRequest)
				return
			}
			var buffer [BUFFSIZE]byte
			total := 0
			for {
				num, err := req.Body.Read(buffer[:])
				if (err != nil && err != io.EOF) || num < 0 {
					w.WriteHeader(http.StatusBadRequest)
					log.Printf("Failed to read during pass creds. %v %v", file.Name(), err)
					file.Close()
					os.Remove(file.Name())

					return
				}
				if num == 0 {
					break
				}
				total += num
				if total > MAXCRED {
					w.WriteHeader(http.StatusBadRequest)
					log.Printf("Cred call too big.")
					file.Close()
					os.Remove(file.Name())
					return
				}
				_, err = file.Write(buffer[0:num])
				if err != nil {
					//FIXME what to return here?
					w.WriteHeader(http.StatusBadRequest)
					log.Printf("Failed to write to temp cred file. %v\n", err)
					file.Close()
					os.Remove(file.Name())
					return
				}
			}
			_, err = file.Seek(0, 0)
			if err != nil {
				//FIXME what to return here?
				w.WriteHeader(http.StatusBadRequest)
				os.Remove(file.Name())
				return
			}
			auth := pacificaauth.NewAuth(file)
			file.Close()
			log.Println("testauth:", auth.Services["testauth"])
			client := auth.NewClient()
			r, err := client.Get(auth.Services["testauth"])
			if err != nil {
				log.Println(err)
				os.Remove(file.Name())
				return
			}
			log.Println(r.StatusCode)
			user := web.AuthUser(req)
			upath := filepath.Join(common.BaseDir, "auth", "creds", common.FsEncodeUser(user))
			if platform.PlatformGet() == platform.Windows {
				err = os.Remove(upath)
			}
			err = os.Rename(file.Name(), upath)
			if err != nil {
				log.Println(err)
				os.Remove(file.Name())
				return
			}
			if cm.userCreds[user] != nil {
				oldclient := cm.userCreds[user].NewClient()
				r, err = oldclient.Get(auth.Services["logout"])
				if err != nil {
					log.Println(err)
				} else {
					log.Printf("Logged out %v: %v\n", user, r.StatusCode)
				}
			}
			cm.userCreds[user] = auth
			cm.outage[user] = nil
		}
	}
}