func (donut API) mergeMultipart(parts *CompleteMultipartUpload, uploadID string, fullObjectWriter *io.PipeWriter) { for _, part := range parts.Part { recvMD5 := part.ETag object, ok := donut.multiPartObjects[uploadID].Get(part.PartNumber) if ok == false { fullObjectWriter.CloseWithError(probe.WrapError(probe.NewError(InvalidPart{}))) return } calcMD5Bytes := md5.Sum(object) // complete multi part request header md5sum per part is hex encoded recvMD5Bytes, err := hex.DecodeString(strings.Trim(recvMD5, "\"")) if err != nil { fullObjectWriter.CloseWithError(probe.WrapError(probe.NewError(InvalidDigest{Md5: recvMD5}))) return } if !bytes.Equal(recvMD5Bytes, calcMD5Bytes[:]) { fullObjectWriter.CloseWithError(probe.WrapError(probe.NewError(BadDigest{}))) return } if _, err := io.Copy(fullObjectWriter, bytes.NewReader(object)); err != nil { fullObjectWriter.CloseWithError(probe.WrapError(probe.NewError(err))) return } object = nil } fullObjectWriter.Close() return }
func (s *controllerRPCService) GetServerDiskStats(r *http.Request, args *ControllerArgs, res *DiskStatsRep) error { err := proxyRequest("Server.DiskStats", args.Host, args.SSL, res) if err != nil { return probe.WrapError(err) } return nil }
func (s *controllerRPCService) GetServerVersion(r *http.Request, args *ControllerArgs, res *VersionRep) error { err := proxyRequest("Server.Version", args.Host, args.SSL, res) if err != nil { return probe.WrapError(err) } return nil }
// RebalaceStats returns dummy rebalance stats func (s *controllerRPCService) RebalanceStats(r *http.Request, args *ControllerArgs, reply *RebalanceStatsRep) error { err := proxyRequest("XL.RebalanceStats", args.Host, args.SSL, reply) if err != nil { return probe.WrapError(err) } return nil }
func (s *MySuite) TestWrappedError(c *C) { _, e := os.Stat("this-file-cannot-exit") es := probe.NewError(e) // *probe.Error e = probe.WrapError(es) // *probe.WrappedError _, ok := probe.UnwrapError(e) c.Assert(ok, Equals, true) }
// GetObjectURL - generates url for download access. func (web *WebAPI) GetObjectURL(r *http.Request, args *GetObjectURLArgs, reply *string) error { if !isAuthenticated(r) { return errUnAuthorizedRequest } // See if object exists. _, e := web.Client.StatObject(args.BucketName, args.ObjectName) if e != nil { return e } targetHost, err := getTargetHost(web.apiAddress, args.TargetHost) if err != nil { return probe.WrapError(err) } client, e := minio.NewV4(targetHost, web.accessKeyID, web.secretAccessKey, web.inSecure) if e != nil { return e } reqParams := make(url.Values) // Set content disposition for browser to download the file. reqParams.Set("response-content-disposition", fmt.Sprintf(`attachment; filename="%s"`, filepath.Base(args.ObjectName))) signedURLStr, e := client.PresignedGetObject(args.BucketName, args.ObjectName, time.Duration(60*60)*time.Second, reqParams) if e != nil { return e } *reply = signedURLStr return nil }
func (s *controllerRPCService) AddServer(r *http.Request, args *ControllerArgs, res *ServerRep) error { err := proxyRequest("Server.Add", args.Host, args.SSL, res) if err != nil { return probe.WrapError(err) } s.serverList = append(s.serverList, *res) return nil }
// Reset auth keys, generates new set of auth keys func (s *controllerRPCService) ResetAuth(r *http.Request, args *AuthArgs, reply *AuthRep) error { if strings.TrimSpace(args.User) == "" { return errors.New("Invalid argument") } if err := resetAuth(args, reply); err != nil { return probe.WrapError(err) } return nil }
// RefreshToken - refresh token handler. func (web *WebAPI) RefreshToken(r *http.Request, args *LoginArgs, reply *AuthToken) error { if isAuthenticated(r) { jwt := InitJWT() token, err := jwt.GenerateToken(args.Username) if err != nil { return probe.WrapError(err.Trace()) } reply.Token = token return nil } return errUnAuthorizedRequest }
// Login - user login handler. func (web *WebAPI) Login(r *http.Request, args *LoginArgs, reply *AuthToken) error { jwt := InitJWT() if jwt.Authenticate(args.Username, args.Password) { token, err := jwt.GenerateToken(args.Username) if err != nil { return probe.WrapError(err.Trace()) } reply.Token = token return nil } return errUnAuthorizedRequest }
func (s *serverRPCService) SysInfo(r *http.Request, arg *ServerArg, rep *SysInfoRep) error { rep.SysARCH = runtime.GOARCH rep.SysOS = runtime.GOOS rep.SysCPUS = runtime.NumCPU() rep.Routines = runtime.NumGoroutine() rep.GOVersion = runtime.Version() var err error rep.Hostname, err = os.Hostname() if err != nil { return probe.WrapError(probe.NewError(err)) } return nil }
// GetObjectURL - generates url for download access. func (web *WebAPI) GetObjectURL(r *http.Request, args *GetObjectURLArgs, reply *string) error { if !isAuthenticated(r) { return errUnAuthorizedRequest } targetHost, err := getTargetHost(web.apiAddress, args.TargetHost) if err != nil { return probe.WrapError(err) } client, e := minio.NewV4(targetHost, web.accessKeyID, web.secretAccessKey, web.inSecure) if e != nil { return e } signedURLStr, e := client.PresignedGetObject(args.BucketName, args.ObjectName, time.Duration(60*60)*time.Second) if e != nil { return e } *reply = signedURLStr return nil }
// readObjectData - func (b bucket) readObjectData(objectName string, writer *io.PipeWriter, objMetadata ObjectMetadata) { readers, err := b.getObjectReaders(objectName, "data") if err != nil { writer.CloseWithError(probe.WrapError(err)) return } for _, reader := range readers { defer reader.Close() } var expected512Sum, expectedMd5sum []byte { var err error expectedMd5sum, err = hex.DecodeString(objMetadata.MD5Sum) if err != nil { writer.CloseWithError(probe.WrapError(probe.NewError(err))) return } expected512Sum, err = hex.DecodeString(objMetadata.SHA512Sum) if err != nil { writer.CloseWithError(probe.WrapError(probe.NewError(err))) return } } hasher := md5.New() sum512hasher := sha256.New() mwriter := io.MultiWriter(writer, hasher, sum512hasher) switch len(readers) > 1 { case true: encoder, err := newEncoder(objMetadata.DataDisks, objMetadata.ParityDisks) if err != nil { writer.CloseWithError(probe.WrapError(err)) return } totalLeft := objMetadata.Size for i := 0; i < objMetadata.ChunkCount; i++ { decodedData, err := b.decodeEncodedData(totalLeft, int64(objMetadata.BlockSize), readers, encoder, writer) if err != nil { writer.CloseWithError(probe.WrapError(err)) return } if _, err := io.Copy(mwriter, bytes.NewReader(decodedData)); err != nil { writer.CloseWithError(probe.WrapError(probe.NewError(err))) return } totalLeft = totalLeft - int64(objMetadata.BlockSize) } case false: _, err := io.Copy(writer, readers[0]) if err != nil { writer.CloseWithError(probe.WrapError(probe.NewError(err))) return } } // check if decodedData md5sum matches if !bytes.Equal(expectedMd5sum, hasher.Sum(nil)) { writer.CloseWithError(probe.WrapError(probe.NewError(ChecksumMismatch{}))) return } if !bytes.Equal(expected512Sum, sum512hasher.Sum(nil)) { writer.CloseWithError(probe.WrapError(probe.NewError(ChecksumMismatch{}))) return } writer.Close() return }