OSDN Git Service

Merge branch 'branch_0.12.0' into branch_0.13.0
[modchxj/mod_chxj.git] / src / chxj_jreserved_tag.c
1 /*
2  * Copyright (C) 2005-2009 Atsushi Konno All rights reserved.
3  * Copyright (C) 2005 QSDN,Inc. All rights reserved.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 #include "mod_chxj.h"
18 #include "chxj_jreserved_tag.h"
19 #include "chxj_url_encode.h"
20
21 typedef struct r_table {
22   char lower;
23   char upper;
24   char *name;
25 } r_table_t;
26
27 static r_table_t reserved_start_with_table[] = {
28   {
29     .lower = 'j',
30     .upper = 'J',
31     .name  = "jsky",
32   },
33 };
34
35
36 #define RESERVED_NELT            (16)
37 #define RESERVED_NELT_START_WITH (1)
38
39 static r_table_t reserved_table[] = {
40   {
41     .lower = 'p',
42     .upper = 'P',
43     .name = "pid",
44   },
45   {
46     .lower = 's',
47     .upper = 'S',
48     .name = "sid",
49   },
50   { 
51     .lower = 'u',
52     .upper = 'U',
53     .name  = "uid",
54   },
55   {
56     .lower = 'l',
57     .upper = 'L',
58     .name  = "lid",
59   },
60   {
61     .lower = 'g',
62     .upper = 'G',
63     .name  = "gid",
64   },
65   {
66     .lower = 'r',
67     .upper = 'R',
68     .name  = "rpid",
69   },
70   {
71     .lower = 'r',
72     .upper = 'R',
73     .name  = "rsid",
74   },
75   {
76     .lower = 'n',
77     .upper = 'N',
78     .name  = "nl",
79   },
80   {
81     .lower = 'c',
82     .upper = 'C',
83     .name  = "cl",
84   },
85   {
86     .lower = 'o',
87     .upper = 'O',
88     .name  = "ol",
89   },
90   {
91     .lower = 'p',
92     .upper = 'P',
93     .name  = "pl",
94   },
95   {
96     .lower = 'p',
97     .upper = 'P',
98     .name  = "prc",
99   },
100   {
101     .lower = 'c',
102     .upper = 'C',
103     .name  = "cnt",
104   },
105   {
106     .lower = 'r',
107     .upper = 'R',
108     .name  = "reg",
109   },
110   {
111     .lower = 'v',
112     .upper = 'V',
113     .name  = "vsekey",
114   },
115   {
116     .lower = 'v',
117     .upper = 'V',
118     .name  = "vsernk",
119   },
120 };
121
122
123 char *
124 chxj_jreserved_to_safe_tag(request_rec *r, const char *src, chxjconvrule_entry *entryp)
125 {
126   int ii;
127   if (entryp->action & CONVRULE_JRCONV_OFF_BIT) {
128     return (char *)src;
129   }
130   for (ii=0;ii<RESERVED_NELT;ii++) {
131     if (STRCASEEQ(reserved_table[ii].lower,
132                   reserved_table[ii].upper,
133                   reserved_table[ii].name, 
134                   src)) {
135       return apr_psprintf(r->pool, "%s%s", CHXJ_SOFTBANK_RESERVED_TAG_PREFIX, reserved_table[ii].name);
136     }
137   }
138   for (ii=0; ii<RESERVED_NELT_START_WITH; ii++) {
139     if (strncasecmp(reserved_start_with_table[ii].name, src, sizeof(reserved_start_with_table[ii].name)) == 0) {
140       return apr_psprintf(r->pool, "%s%s", CHXJ_SOFTBANK_RESERVED_TAG_PREFIX, src);
141     }
142   }
143   return (char *)src;
144 }
145
146
147 char *
148 chxj_safe_to_jreserved_tag(request_rec *r, const char *src)
149 {
150   if (strncasecmp(CHXJ_SOFTBANK_RESERVED_TAG_PREFIX, src, sizeof(CHXJ_SOFTBANK_RESERVED_TAG_PREFIX)-1) == 0) {
151     return apr_pstrdup(r->pool, &src[sizeof(CHXJ_SOFTBANK_RESERVED_TAG_PREFIX)-1]);
152   }
153   return (char *)src;
154 }
155
156 char *
157 chxj_jreserved_tag_to_safe_for_query_string(request_rec *r, const char *query_string, chxjconvrule_entry  *entryp, int xmlflag)
158 {
159   apr_pool_t *pool;
160   apr_pool_create(&pool, r->pool);
161   char *s = apr_pstrdup(pool, query_string);
162   char *fname;
163
164   if (entryp->action & CONVRULE_JRCONV_OFF_BIT) {
165     return s;
166   }
167   if (!s) return apr_pstrdup(pool, "");
168   char *result = s;
169   s = strchr(s, '?');
170   if (!s) return result;
171   *s = 0;
172   s++;
173   fname = apr_pstrdup(pool, result);
174   result = NULL;
175
176   char *pstat;
177   char *pstat2;
178   for (;;) {
179     char *pair = NULL;
180     if (xmlflag) {
181       pair = apr_strtok(s, "&amp;", &pstat);
182     }
183     else {
184       pair = apr_strtok(s, "&", &pstat);
185     }
186     if (! pair) break;
187     s = NULL;
188     char *key = apr_strtok(pair, "=",  &pstat2);
189     char *val = "";
190     if (key) {
191       val = apr_strtok(NULL, "=", &pstat2);
192       if (!val) val = "";
193     }
194     char *tmp = NULL;
195     if (strcasecmp(key, "guid") == 0) {
196       tmp = apr_psprintf(pool, "%s=%s", key, val);
197     }
198     else {
199       tmp = apr_psprintf(pool, "%s=%s", chxj_jreserved_to_safe_tag(r, key, entryp), chxj_url_decode(pool, val));
200       if (result) {
201         if (xmlflag) {
202           result = apr_pstrcat(pool, result, "&amp;" ,tmp, NULL);
203         }
204         else {
205           result = apr_pstrcat(pool, result, "&" ,tmp, NULL);
206         }
207       }
208       else {
209         result = tmp;
210       }
211     }
212   }
213   return apr_pstrcat(pool, fname, "?" , result, NULL);
214 }