Assign image keyname and pubkey at vnf level
[ccsdk/apps.git] / sdnr / wireless-transport / code-Carbon-SR1 / apps / helpServer / impl / src / main / java / com / highstreet / technologies / helpserver / HelpServlet.java
1 package com.highstreet.technologies.helpserver;
2
3 import java.io.BufferedReader;
4 import java.io.File;
5 import java.io.FileInputStream;
6 import java.io.FileReader;
7 import java.io.IOException;
8 import java.io.InputStream;
9 import java.io.OutputStream;
10 import java.io.StringReader;
11 import java.net.URL;
12 import java.net.URLDecoder;
13 import java.nio.file.Path;
14 import java.util.regex.Matcher;
15 import java.util.regex.Pattern;
16
17 import javax.servlet.ServletException;
18 import javax.servlet.http.HttpServlet;
19 import javax.servlet.http.HttpServletRequest;
20 import javax.servlet.http.HttpServletResponse;
21
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24
25 import com.highstreet.technologies.helpserver.data.HelpInfrastructureObject;
26
27 public class HelpServlet extends HttpServlet implements AutoCloseable {
28
29         private static Logger LOG = LoggerFactory.getLogger(HelpServlet.class);
30         private static final long serialVersionUID = -4285072760648493461L;
31
32         private static final boolean USE_FILESYSTEM = true;
33         private static final boolean USE_RESSOURCES = !USE_FILESYSTEM;
34         private static final String BASEURI = "/help";
35
36         private static final boolean REDIRECT_LINKS = true;
37
38         private Path basePath;
39
40         public HelpServlet() {
41                 LOG.info("Starting HelpServlet instance {}", this.hashCode());
42                 HelpInfrastructureObject.createFilesFromResources();
43                 this.basePath = HelpInfrastructureObject.getHelpDirectoryBase();
44         }
45
46         @Override
47         protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
48                 resp.addHeader("Access-Control-Allow-Origin", "*");
49                 resp.addHeader("Access-Control-Allow-Methods", "OPTIONS, HEAD, GET, POST, PUT, DELETE");
50                 resp.addHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Content-Length");
51         }
52
53         /*
54          * (non-Javadoc)
55          *
56          * @see
57          * javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest,
58          * javax.servlet.http.HttpServletResponse) Handle Get Request: if
59          * query=?meta=send json infrastructure for README.md else if file exist send
60          * file
61          */
62         @Override
63         protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
64                 String query = req.getQueryString();
65                 resp.addHeader("Access-Control-Allow-Origin", "*");
66                 resp.addHeader("Access-Control-Allow-Methods", "OPTIONS, HEAD, GET, POST, PUT, DELETE");
67                 resp.addHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Content-Length");
68                 if (query != null && query.contains("meta")) {
69                         /*
70                          * LOG.debug("received post with uri="+req.getRequestURI()); String
71                          * uri=req.getRequestURI().substring(BASEURI.length()); if(uri.startsWith("/"))
72                          * uri=uri.substring(1);
73                          */
74                         File f=new File(HelpInfrastructureObject.KARAFHELPDIRECTORY,"meta.json");
75                         try {
76                                 if(f.exists())
77                                 {
78                                         LOG.debug("found local meta file");
79                                         BufferedReader rd=new BufferedReader(new FileReader(f));
80                                         String line=rd.readLine();
81                                         while(line!=null)
82                                         {
83                                                 resp.getOutputStream().println(line);
84                                                 line=rd.readLine();
85                                         }
86                                         rd.close();
87                                 }
88                                 else
89                                 {
90                                         LOG.debug("start walking from path=" + basePath.toAbsolutePath().toString());
91                                         HelpInfrastructureObject o = null;
92                                         if (USE_FILESYSTEM)
93                                                 o = new HelpInfrastructureObject(this.basePath);
94                                         else if (USE_RESSOURCES) {
95                                                 // o=new HelpInfrastructureObject()
96                                         }
97                                         resp.getOutputStream().println(o != null ? o.toString() : "");
98                                 }
99                                 resp.setHeader("Content-Type", "application/json");
100                         } catch (Exception err) {
101                                 err.printStackTrace();
102                         }
103                 } else {
104                         LOG.debug("received get with uri=" + req.getRequestURI());
105                         String uri = URLDecoder.decode(req.getRequestURI().substring(BASEURI.length()), "UTF-8");
106                         if (uri.startsWith("/"))
107                                 uri = uri.substring(1);
108                         Path p = basePath.resolve(uri);
109                         if (USE_FILESYSTEM) {
110                                 File f = p.toFile();
111                                 if (f.isFile() && f.exists()) {
112                                         LOG.debug("found file for request");
113                                         if (this.isTextFile(f)) {
114                                                 resp.setHeader("Content-Type", "application/text");
115                                                 resp.setHeader("charset", "utf-8");
116                                         } else if (this.isImageFile(f)) {
117                                                 resp.setHeader("Content-Type", "image/*");
118                                         } else if (this.ispdf(f)) {
119                                                 resp.setHeader("Content-Type", "application/pdf");
120                                         } else {
121                                                 LOG.debug("file is not allowed to deliver");
122                                                 resp.setStatus(404);
123                                                 return;
124                                         }
125                                         LOG.debug("delivering file");
126                                         OutputStream out = resp.getOutputStream();
127                                         String version=null;
128                                         if(REDIRECT_LINKS)
129                                                 version=getVersionFromRequestedUri(uri);
130                                         if (this.isTextFile(f) && REDIRECT_LINKS && version!=null) {
131                                                 final String regex = "(!?\\[[^\\]]*?\\])\\(((?:(?!http|www\\.|\\#|\\.com|\\.net|\\.info|\\.org|\\.svg|\\.png|\\.jpg|\\.gif|\\.jpeg|\\.pdf).)*?)\\)";
132                                                 final Pattern pattern = Pattern.compile(regex);
133                                                 Matcher matcher;
134                                                 String line;
135                                                 try (BufferedReader br = new BufferedReader(new FileReader(f))) {
136                                                         line = br.readLine();
137                                                         while (line != null) {
138                                                                 //check line for internal link
139                                                                 matcher = pattern.matcher(line);
140                                                                 if(matcher.find())
141                                                                 {
142                                                                         //extend link with specific version
143                                                                         line=line.replace(matcher.group(2),"../"+matcher.group(2)+version+"/README.md");
144                                                                 }
145                                                                 out.write((line+"\n").getBytes());
146                                                                 line = br.readLine();
147
148                                                         }
149                                                         out.flush();
150                                                         out.close();
151                                                         br.close();
152                                                 }
153
154                                         } else {
155                                                 try (FileInputStream in = new FileInputStream(f)) {
156
157                                                         byte[] buffer = new byte[1024];
158                                                         int len;
159                                                         while ((len = in.read(buffer)) != -1) {
160                                                                 out.write(buffer, 0, len);
161                                                         }
162                                                         in.close();
163                                                         out.flush();
164                                                         out.close();
165                                                 }
166                                         }
167                                 } else {
168                                         LOG.debug("found not file for request");
169                                         resp.setStatus(404);
170                                 }
171                         } else if (USE_RESSOURCES) {
172                                 URL resurl = this.getClass().getResource(p.toString());
173                                 if (resurl != null)// resource file found
174                                 {
175                                         if (this.isTextFile(resurl)) {
176                                                 resp.setHeader("Content-Type", "application/text");
177                                                 resp.setHeader("charset", "utf-8");
178                                         } else if (this.isImageFile(resurl)) {
179                                                 resp.setHeader("Content-Type", "image/*");
180                                         } else if (this.ispdf(resurl)) {
181                                                 resp.setHeader("Content-Type", "application/pdf");
182                                         } else {
183                                                 resp.setStatus(404);
184                                                 return;
185                                         }
186                                         try (InputStream in = this.getClass().getResourceAsStream(p.toString())) {
187                                                 OutputStream out = resp.getOutputStream();
188                                                 byte[] buffer = new byte[1024];
189                                                 int len;
190                                                 while ((len = in.read(buffer)) != -1) {
191                                                         out.write(buffer, 0, len);
192                                                 }
193                                                 in.close();
194                                                 out.flush();
195                                                 out.close();
196                                         }
197
198                                 } else // resource file not found
199                                 {
200                                         resp.setStatus(404);
201                                 }
202                         }
203                 }
204         }
205
206         /*
207          *
208          * uri = "help/folder1/folder2/version/README.md"
209          */
210         private static String getVersionFromRequestedUri(String uri) {
211                 if(uri==null)
212                         return null;
213                 int lastidx=uri.lastIndexOf("/");
214                 if(lastidx<0)
215                         return null;
216                 int slastidx=uri.lastIndexOf("/", lastidx-1);
217                 if(slastidx<0)
218                         return null;
219                 return uri.substring(slastidx+1, lastidx);
220
221         }
222         private boolean isTextFile(URL url) {
223                 return url != null ? this.isTextFile(url.toString()) : false;
224         }
225
226         private boolean ispdf(URL url) {
227                 return url != null ? this.ispdf(url.toString()) : false;
228         }
229
230         private boolean isImageFile(URL url) {
231                 return url != null ? this.isImageFile(url.toString()) : false;
232         }
233
234         private boolean ispdf(File f) {
235                 return f != null ? this.ispdf(f.getName()) : false;
236         }
237
238         private boolean ispdf(String name) {
239                 return name != null ? name.toLowerCase().endsWith("pdf") : false;
240         }
241
242         private boolean isImageFile(File f) {
243                 return f != null ? this.isImageFile(f.getName()) : false;
244         }
245
246         private boolean isImageFile(String name) {
247
248                 return name != null
249                                 ? (name.toLowerCase().endsWith("png") || name.toLowerCase().endsWith("jpg")
250                                                 || name.toLowerCase().endsWith("jpeg") || name.toLowerCase().endsWith("svg")
251                                                 || name.toLowerCase().endsWith("eps"))
252                                 : false;
253         }
254
255         private boolean isTextFile(File f) {
256                 return f != null ? this.isTextFile(f.getName()) : false;
257
258         }
259
260         private boolean isTextFile(String name) {
261                 return name != null
262                                 ? (name.toLowerCase().endsWith("md") || name.toLowerCase().endsWith("txt")
263                                                 || name.toLowerCase().endsWith("html") || name.toLowerCase().endsWith("htm")
264                                                 || name.toLowerCase().endsWith("js") || name.toLowerCase().endsWith("css"))
265                                 : false;
266         }
267
268         @Override
269         protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
270         }
271
272         @Override
273         public void close() throws Exception {
274         }
275 }