func()

in lib/dam/token_flow.go [609:692]


func (s *Service) fetchResourceTokens(r *http.Request) (_ *pb.ResourceResults, ferr error) {
	tx, err := s.store.Tx(false)
	if err != nil {
		return nil, status.Errorf(codes.Unavailable, "%v", err)
	}
	defer func() {
		err := tx.Finish()
		if ferr == nil {
			ferr = err
		}
	}()

	a, err := auth.FromContext(r.Context())
	if err != nil {
		return nil, err
	}

	cart := ""
	if s.useHydra {
		cart, err = s.extractCartFromAccessToken(a.ID)
		if err != nil {
			return nil, err
		}
	} else {
		return nil, status.Errorf(codes.Unimplemented, "Unimplemented oidc provider")
	}

	state, id, err := s.resourceTokenState(cart, tx)
	if err != nil {
		return nil, status.Errorf(codes.InvalidArgument, "%v", err)
	}
	if len(state.Resources) == 0 {
		return nil, status.Errorf(codes.InvalidArgument, "empty resource list")
	}
	cfg, err := s.loadConfig(tx, state.Resources[0].Realm)
	if err != nil {
		return nil, status.Errorf(codes.InvalidArgument, "%v", err)
	}

	ctx := r.Context()
	keyFile := false
	out := &pb.ResourceResults{
		Resources:    make(map[string]*pb.ResourceResults_ResourceDescriptor),
		Access:       make(map[string]*pb.ResourceResults_ResourceAccess),
		EpochSeconds: uint32(time.Now().Unix()),
	}
	for i, r := range state.Resources {
		res, ok := cfg.Resources[r.Resource]
		if !ok {
			return nil, status.Errorf(codes.NotFound, "resource not found: %q", r.Resource)
		}

		view, ok := res.Views[r.View]
		if !ok {
			return nil, status.Errorf(codes.NotFound, "view %q not found for resource %q", r.View, r.Resource)
		}

		result, st, err := s.generateResourceToken(ctx, state.ClientId, r.Resource, r.View, r.Role, r.Interface, time.Duration(state.Ttl), keyFile, id, cfg, res, view)
		if err != nil {
			return nil, status.Errorf(httputils.RPCCode(st), "%v", err)
		}
		access := strconv.Itoa(i)

		interMap := map[string]*pb.ResourceResults_InterfaceEntry{}
		for k, v := range makeViewInterfaces(view, res, cfg, s.adapters) {
			entry := &pb.ResourceResults_InterfaceEntry{}
			interMap[k] = entry
			for _, uri := range v.Uri {
				entry.Items = append(entry.Items, &pb.ResourceResults_ResourceInterface{Uri: uri, Labels: v.Labels})
			}
		}

		out.Resources[r.Url] = &pb.ResourceResults_ResourceDescriptor{
			Interfaces:  interMap,
			Permissions: makeRoleCategories(view, r.Role, cfg),
			Access:      access,
		}
		out.Access[access] = &pb.ResourceResults_ResourceAccess{
			Credentials: result.Credentials,
			Labels:      result.Labels,
		}
	}
	return out, nil
}