#include #include #include #include namespace konforka { /* * XXX: this code is borrowed from sitecing as is, although it should be optimized. */ string normalize_path(const string& p,int o) { const char *s = p.c_str(); if( s[0]=='.' && s[1]=='/' ) s += 2; // skip leading './' if(o&strip_leading_slash) for(;(*s)=='/';s++); string rv; string::size_type notslash = 0; for(;*s;s++) { if(s[0]=='/') { if(s[1]=='/') continue; // skip duplicate slash if(s[1]=='.' && s[2]=='/') { // '/./' sequence encountered s += 2; continue; } } if( (o&restrict_dotdot) && ( ( rv.empty() && s[0]=='.' && s[1]=='.' && s[2]=='/' ) // '^../' || ( s[0]=='/' && s[1]=='.' && s[2]=='.' && (s[3]=='/' || s[3]==0) ) // '/../' or '/..$' ) ) throw restricted_sequence_error(CODEPOINT,"restricted updir (..) sequence encountered"); rv += *s; if( (*s) !='/' ) notslash = rv.length(); } if(!(o&strip_trailing_slash)) notslash++; if(notslash