Ejemplo n.º 1
0
/* leaves properties change dialog after changing file attributes */
static void
cmd_return(key_info_t key_info, keys_info_t *keys_info)
{
	if(changed)
	{
		set_attrs(view, attrs, origin_attrs);
		leave_attr_mode();
	}
}
Ejemplo n.º 2
0
/* leaves properties change dialog after changing file attributes */
static void
cmd_ctrl_m(key_info_t key_info, keys_info_t *keys_info)
{
	char path[PATH_MAX];

	if(!changed)
		return;

	snprintf(path, sizeof(path), "%s/%s", view->curr_dir,
			view->dir_entry[view->list_pos].name);

	set_attrs(view, attrs, origin_attrs);

	leave_attr_mode();
}
Ejemplo n.º 3
0
bool session::del(const char* name)
{
	// 直接操作后端 cache 服务器,删除属性字段

	if (get_attrs(attrs_) == false)
		return true;

	std::map<string, session_string>::iterator it = attrs_.find(name);
	if (it == attrs_.end())
		return false;

	// 先删除并释放对应的对象
	attrs_.erase(it);

	// 如果 sid 中已经没有了数据,则应该将 sid 对象从 memcached 中删除
	if (attrs_.empty())
	{
		// 调用虚函数,删除该 sid 对应的缓存内容
		if (remove() == false)
		{
			logger_error("del sid(%s) error", sid_.c_str());
			return false;
		}
		return true;
	}

	// 重新添加剩余的数据

	if (set_attrs(attrs_) == false)
	{
		logger_error("set cache error, sid(%s)", sid_.c_str());
		attrs_clear(attrs_);  // 清除属性集合数据

		return false;
	}
	attrs_clear(attrs_);  // 清除属性集合数据

	return true;
}
Ejemplo n.º 4
0
bool session::set(const char* name, const void* value, size_t len)
{
	// 直接操作后端 cache 服务器,设置(添加/修改) 属性字段

	// 调用纯虚接口,获得原来的 sid 数据
	if (get_attrs(attrs_) == false)
	{
		session_string ss(len);
		ss.copy(value, len);
		ss.todo_ = TODO_SET;
		attrs_cache_.insert(std::make_pair(string(name), ss));
	}
	// 如果存在对应 sid 的数据,则将新数据添加在原来数据中
	else
	{
		if (!sid_saved_)
			sid_saved_ = true;

		// 如果该属性已存在,则需要先释放原来的属性值后再添加新值
		session_string ss(len);
		ss.copy(value, len);
		ss.todo_ = TODO_SET;
		attrs_cache_.insert(std::make_pair(string(name), ss));
	}

	// 调用纯虚接口,向 memcached 或类似缓存中添加数据
	if (set_attrs(attrs_) == false)
	{
		logger_error("set cache error, sid(%s)", sid_.c_str());
		attrs_clear(attrs_);  // 清除属性集合数据

		return false;
	}
	attrs_clear(attrs_);  // 清除属性集合数据

	if (!sid_saved_)
		sid_saved_ = true;
	return true;
}
Ejemplo n.º 5
0
bool session::flush()
{
	if (!dirty_)
		return true;
	dirty_ = false;

	// 调用纯虚接口,获得原来的 sid 数据
	if (get_attrs(attrs_) == true)
	{
		if (!sid_saved_)
			sid_saved_ = true;
	}

	std::map<string, session_string>::iterator it_cache =
		attrs_cache_.begin();
	for (; it_cache != attrs_cache_.end(); ++it_cache)
	{
		// 如果该属性已存在,则需要先释放原来的属性值后再添加新值

		std::map<string, session_string>::iterator it_attr =
			attrs_.find(it_cache->first);
		if (it_attr == attrs_.end())
		{
			if (it_cache->second.todo_ == TODO_SET)
				attrs_.insert(std::make_pair(it_cache->first,
					it_cache->second));
		}
		else if (it_cache->second.todo_ == TODO_SET)
		{
			// 设置新的数据
			attrs_.insert(std::make_pair(it_cache->first,
				it_cache->second));
		}
		else if (it_cache->second.todo_ == TODO_DEL)
		{
			attrs_.erase(it_attr);
		}
		else
		{
			logger_warn("unknown todo(%d)",
				(int) it_cache->second.todo_);
		}
	}

	// 清除缓存的数据:因为内部的数据已经被添加至 attrs_ 中,
	// 所以只需要将 attrs_cache_ 空间清除即可
	attrs_cache_.clear();

	// 调用纯虚接口,向 memcached 或类似缓存中添加数据
	if (set_attrs(attrs_) == false)
	{
		logger_error("set cache error, sid(%s)", sid_.c_str());
		attrs_clear(attrs_);  // 清除属性集合数据

		return false;
	}

	attrs_clear(attrs_);  // 清除属性集合数据

	if (!sid_saved_)
		sid_saved_ = true;
	return true;
}
Ejemplo n.º 6
0
Archivo: chacl.cpp Proyecto: acml/cvsnt
static void set_acl(CXmlNodePtr base)
{
	CXmlNodePtr acl, acl_to_set = NULL;
	acl = fileattr_find(base,"acl");

	while(acl)
	{
		const char *user = fileattr_getvalue(acl,"@user");
		const char *branch = fileattr_getvalue(acl,"@branch");
		const char *merge = fileattr_getvalue(acl,"@merge");
		if(((!user && !parms.user) || (user && parms.user && !usercmp(user,parms.user))) &&
		   ((!branch && !parms.branch) || (branch && parms.branch && !strcmp(branch,parms.branch))) &&
		   ((!merge && !parms.merge) || (merge && parms.merge && !strcmp(merge,parms.merge))))
		{
			acl_to_set = acl;
			break;
		}
		acl = fileattr_next(acl);
	}
	if(acl_to_set)
		fileattr_batch_delete(acl_to_set);
		
	if(!parms.del)
	{
		char *parm = xstrdup(parms.access);
		char *acc = parm?strtok(parm,","):NULL;

		base->NewNode("acl");
		fileattr_modified();
		if(parms.user)
			base->NewAttribute("user",parms.user);
		if(parms.branch)
			base->NewAttribute("branch",parms.branch);
		if(parms.merge)
			base->NewAttribute("merge",parms.merge);
		if(parms.priority && atoi(parms.priority))
			base->NewAttribute("priority",parms.priority);
		if(parms.message)
			base->NewNode("message",parms.message,false);
		base->NewNode("modified_by",getcaller(),false);
		base->NewNode("modified_date",current_date,false);
		while(acc)
		{
			int deny=0;
			if(!strncmp(acc,"no",2) && strcmp(acc,"none"))
			{
				deny=1;
				acc+=2;
			}
			if(!strcmp(acc,"all"))
				set_attrs(base,"all",deny,parms.noinherit);
			else if(!strcmp(acc,"none"))
				set_attrs(base,"all",!deny,parms.noinherit);
			else if(!strcmp(acc,"read"))
				set_attrs(base,"read",deny,parms.noinherit);
			else if(!strcmp(acc,"write"))
				set_attrs(base,"write",deny,parms.noinherit);
			else if(!strcmp(acc,"create"))
				set_attrs(base,"create",deny,parms.noinherit);
			else if(!strcmp(acc,"tag"))
				set_attrs(base,"tag",deny,parms.noinherit);
			else if(!strcmp(acc,"control"))
				set_attrs(base,"control",deny,parms.noinherit);
			else
				error(1,0,"Invalid access control attribute '%s'",acc);
			acc = strtok(NULL,",");
		}
		base->GetParent();
		fileattr_prune(base);
		xfree(parm);
	}
	else
	{
		if(acl_to_set)
			fileattr_prune(acl_to_set);
	}
}