~ubuntu-branches/debian/sid/subversion/sid

« back to all changes in this revision

Viewing changes to subversion/bindings/javahl/native/org_apache_subversion_javahl_util_SubstLib.cpp

  • Committer: Package Import Robot
  • Author(s): James McCoy
  • Date: 2015-08-07 21:32:47 UTC
  • mfrom: (0.2.15) (4.1.7 experimental)
  • Revision ID: package-import@ubuntu.com-20150807213247-ozyewtmgsr6tkewl
Tags: 1.9.0-1
* Upload to unstable
* New upstream release.
  + Security fixes
    - CVE-2015-3184: Mixed anonymous/authenticated path-based authz with
      httpd 2.4
    - CVE-2015-3187: svn_repos_trace_node_locations() reveals paths hidden
      by authz
* Add >= 2.7 requirement for python-all-dev Build-Depends, needed to run
  tests.
* Remove Build-Conflicts against ruby-test-unit.  (Closes: #791844)
* Remove patches/apache_module_dependency in favor of expressing the
  dependencies in authz_svn.load/dav_svn.load.
* Build-Depend on apache2-dev (>= 2.4.16) to ensure ap_some_authn_required()
  is available when building mod_authz_svn and Depend on apache2-bin (>=
  2.4.16) for runtime support.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/**
 
2
 * @copyright
 
3
 * ====================================================================
 
4
 *    Licensed to the Apache Software Foundation (ASF) under one
 
5
 *    or more contributor license agreements.  See the NOTICE file
 
6
 *    distributed with this work for additional information
 
7
 *    regarding copyright ownership.  The ASF licenses this file
 
8
 *    to you under the Apache License, Version 2.0 (the
 
9
 *    "License"); you may not use this file except in compliance
 
10
 *    with the License.  You may obtain a copy of the License at
 
11
 *
 
12
 *      http://www.apache.org/licenses/LICENSE-2.0
 
13
 *
 
14
 *    Unless required by applicable law or agreed to in writing,
 
15
 *    software distributed under the License is distributed on an
 
16
 *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 
17
 *    KIND, either express or implied.  See the License for the
 
18
 *    specific language governing permissions and limitations
 
19
 *    under the License.
 
20
 * ====================================================================
 
21
 * @endcopyright
 
22
 *
 
23
 * @file org_apache_subversion_javahl_util_SubstLib.cpp
 
24
 * @brief Implementation of the native methods in the Java class SubstLib
 
25
 */
 
26
 
 
27
#include <memory>
 
28
 
 
29
#include "../include/org_apache_subversion_javahl_util_SubstLib.h"
 
30
 
 
31
#include "jniwrapper/jni_stack.hpp"
 
32
#include "jniwrapper/jni_array.hpp"
 
33
#include "jniwrapper/jni_string.hpp"
 
34
#include "jniwrapper/jni_string_map.hpp"
 
35
#include "jniwrapper/jni_io_stream.hpp"
 
36
 
 
37
#include "JNIUtil.h"
 
38
#include "NativeStream.hpp"
 
39
#include "Utility.hpp"
 
40
 
 
41
#include <apr_hash.h>
 
42
 
 
43
#include "svn_subst.h"
 
44
 
 
45
#include "svn_private_config.h"
 
46
 
 
47
 
 
48
namespace {
 
49
apr_hash_t*
 
50
build_keywords_common(Java::Env env, const SVN::Pool& pool,
 
51
                      jbyteArray jkeywords_value, jlong jrevision,
 
52
                      jstring jurl, jstring jrepos_root_url,
 
53
                      jobject jdate, jstring jauthor)
 
54
{
 
55
  const Java::ByteArray keywords_value(env, jkeywords_value);
 
56
  const Java::String url(env, jurl);
 
57
  const Java::String repos_root_url(env, jrepos_root_url);
 
58
  const Java::String author(env, jauthor);
 
59
 
 
60
  const Java::ByteArray::Contents keywords_contents(keywords_value);
 
61
  svn_string_t* keywords_string = keywords_contents.get_string(pool);
 
62
  const char* revision = (jrevision < 0 ? NULL
 
63
                          : apr_psprintf(pool.getPool(),
 
64
                                         "%" APR_UINT64_T_FMT,
 
65
                                         apr_uint64_t(jrevision)));
 
66
  const Java::String::Contents url_contents(url);
 
67
  const Java::String::Contents root_url_contents(repos_root_url);
 
68
  const Java::String::Contents author_contents(author);
 
69
 
 
70
  apr_hash_t* kw = NULL;
 
71
  SVN_JAVAHL_CHECK(env,
 
72
                   svn_subst_build_keywords3(
 
73
                       &kw,
 
74
                       keywords_string->data,
 
75
                       revision,
 
76
                       url_contents.c_str(),
 
77
                       root_url_contents.c_str(),
 
78
                       (jdate ? JNIUtil::getDate(jdate) : 0),
 
79
                       author_contents.c_str(),
 
80
                       pool.getPool()));
 
81
  return kw;
 
82
}
 
83
 
 
84
svn_stream_t*
 
85
translate_stream_common(Java::Env env, const SVN::Pool& pool,
 
86
                        svn_stream_t* stream,
 
87
                        jbyteArray jeol_marker, jboolean jrepair_eol,
 
88
                        jobject jkeywords, jboolean juse_keywords,
 
89
                        jboolean jexpand_keywords,
 
90
                        jbyteArray jkeywords_value, jlong jrevision,
 
91
                        jstring jurl, jstring jrepos_root_url,
 
92
                        jobject jdate, jstring jauthor)
 
93
{
 
94
  apr_hash_t* const keywords =
 
95
    (juse_keywords
 
96
     ? JavaHL::Util::make_keyword_hash(env, jkeywords, pool)
 
97
     : build_keywords_common(
 
98
         env, pool, jkeywords_value, jrevision,
 
99
         jurl, jrepos_root_url, jdate, jauthor));
 
100
 
 
101
  const Java::ByteArray eol_marker(env, jeol_marker);
 
102
  svn_string_t* const eol_str =
 
103
    Java::ByteArray::Contents(eol_marker).get_string(pool);
 
104
  return svn_subst_stream_translated(stream,
 
105
                                     eol_str->data,
 
106
                                     svn_boolean_t(jrepair_eol),
 
107
                                     keywords,
 
108
                                     svn_boolean_t(jexpand_keywords),
 
109
                                     pool.getPool());
 
110
}
 
111
} // anoymous namespace
 
112
 
 
113
 
 
114
JNIEXPORT jobject JNICALL
 
115
Java_org_apache_subversion_javahl_util_SubstLib_buildKeywords(
 
116
    JNIEnv* jenv, jobject jthis,
 
117
    jbyteArray jkeywords_value, jlong jrevision,
 
118
    jstring jurl, jstring jrepos_root_url,
 
119
    jobject jdate, jstring jauthor)
 
120
{
 
121
  typedef Java::Map<Java::ByteArray, jbyteArray> ByteArrayMap;
 
122
 
 
123
  SVN_JAVAHL_JNI_TRY(SubstLib, buildKeywords)
 
124
    {
 
125
      const Java::Env env(jenv);
 
126
 
 
127
      // Using a "global" request pool since we don't keep a context with
 
128
      // its own pool around for these functions.
 
129
      SVN::Pool pool;
 
130
 
 
131
      apr_hash_t* const kw = build_keywords_common(
 
132
          env, pool, jkeywords_value, jrevision,
 
133
          jurl, jrepos_root_url, jdate, jauthor);
 
134
 
 
135
      ByteArrayMap keywords(env, jint(apr_hash_count(kw)));
 
136
      for (apr_hash_index_t* hi = apr_hash_first(pool.getPool(), kw);
 
137
           hi; hi = apr_hash_next(hi))
 
138
        {
 
139
          const void* rkey;
 
140
          void* rval;
 
141
          apr_hash_this(hi, &rkey, NULL, &rval);
 
142
 
 
143
          svn_string_t* const val = static_cast<svn_string_t*>(rval);
 
144
          keywords.put(static_cast<const char*>(rkey),
 
145
                       Java::ByteArray(env, val->data, jsize(val->len)));
 
146
        }
 
147
      return keywords.get();
 
148
    }
 
149
  SVN_JAVAHL_JNI_CATCH;
 
150
  return NULL;
 
151
}
 
152
 
 
153
 
 
154
JNIEXPORT jobject JNICALL
 
155
Java_org_apache_subversion_javahl_util_SubstLib_translateInputStream(
 
156
    JNIEnv* jenv, jobject jthis,
 
157
    jobject jsource, jbyteArray jeol_marker, jboolean jrepair_eol,
 
158
    jobject jkeywords, jboolean juse_keywords, jboolean jexpand_keywords,
 
159
    jbyteArray jkeywords_value, jlong jrevision,
 
160
    jstring jurl, jstring jrepos_root_url,
 
161
    jobject jdate, jstring jauthor)
 
162
{
 
163
  SVN_JAVAHL_JNI_TRY(SubstLib, translateInputStream)
 
164
    {
 
165
      const Java::Env env(jenv);
 
166
 
 
167
      // We'll allocate the stream in the bound object's pool.
 
168
      std::auto_ptr<JavaHL::NativeInputStream>
 
169
        translated(new JavaHL::NativeInputStream());
 
170
      svn_stream_t* source = Java::InputStream::get_global_stream(
 
171
          env, jsource, translated->get_pool());
 
172
 
 
173
      translated->set_stream(translate_stream_common(
 
174
                                 env, translated->get_pool(), source,
 
175
                                 jeol_marker, jrepair_eol,
 
176
                                 jkeywords, juse_keywords, jexpand_keywords,
 
177
                                 jkeywords_value, jrevision,
 
178
                                 jurl, jrepos_root_url, jdate, jauthor));
 
179
      const jobject jtranslated = translated->create_java_wrapper();
 
180
      translated.release();
 
181
      return jtranslated;
 
182
    }
 
183
  SVN_JAVAHL_JNI_CATCH;
 
184
  return NULL;
 
185
}
 
186
 
 
187
 
 
188
JNIEXPORT jobject JNICALL
 
189
Java_org_apache_subversion_javahl_util_SubstLib_translateOutputStream(
 
190
    JNIEnv* jenv, jobject jthis,
 
191
    jobject jdestination, jbyteArray jeol_marker, jboolean jrepair_eol,
 
192
    jobject jkeywords, jboolean juse_keywords, jboolean jexpand_keywords,
 
193
    jbyteArray jkeywords_value, jlong jrevision,
 
194
    jstring jurl, jstring jrepos_root_url,
 
195
    jobject jdate, jstring jauthor)
 
196
{
 
197
  SVN_JAVAHL_JNI_TRY(SubstLib, translateInputStream)
 
198
    {
 
199
      const Java::Env env(jenv);
 
200
 
 
201
      // We'll allocate the stream in the bound object's pool.
 
202
      std::auto_ptr<JavaHL::NativeOutputStream>
 
203
        translated(new JavaHL::NativeOutputStream());
 
204
      svn_stream_t* destination = Java::OutputStream::get_global_stream(
 
205
          env, jdestination, translated->get_pool());
 
206
 
 
207
      translated->set_stream(translate_stream_common(
 
208
                                 env, translated->get_pool(), destination,
 
209
                                 jeol_marker, jrepair_eol,
 
210
                                 jkeywords, juse_keywords, jexpand_keywords,
 
211
                                 jkeywords_value, jrevision,
 
212
                                 jurl, jrepos_root_url, jdate, jauthor));
 
213
      const jobject jtranslated = translated->create_java_wrapper();
 
214
      translated.release();
 
215
      return jtranslated;
 
216
    }
 
217
  SVN_JAVAHL_JNI_CATCH;
 
218
  return NULL;
 
219
}