diff options
Diffstat (limited to 'src/main/java/com/gitblit/wicket/pages/EditFilePage.java')
-rw-r--r-- | src/main/java/com/gitblit/wicket/pages/EditFilePage.java | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/src/main/java/com/gitblit/wicket/pages/EditFilePage.java b/src/main/java/com/gitblit/wicket/pages/EditFilePage.java new file mode 100644 index 00000000..378f2a35 --- /dev/null +++ b/src/main/java/com/gitblit/wicket/pages/EditFilePage.java @@ -0,0 +1,220 @@ +/* + * Copyright 2016 gitblit.com. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.gitblit.wicket.pages; + + +import java.io.IOException; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.apache.wicket.PageParameters; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.TextArea; +import org.apache.wicket.markup.html.link.BookmarkablePageLink; +import org.apache.wicket.markup.html.link.ExternalLink; +import org.apache.wicket.markup.html.panel.Fragment; +import org.apache.wicket.model.Model; +import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException; +import org.eclipse.jgit.dircache.DirCache; +import org.eclipse.jgit.dircache.DirCacheBuilder; +import org.eclipse.jgit.dircache.DirCacheEntry; +import org.eclipse.jgit.lib.FileMode; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; + +import com.gitblit.Constants; +import com.gitblit.models.UserModel; +import com.gitblit.servlet.RawServlet; +import com.gitblit.utils.BugtraqProcessor; +import com.gitblit.utils.JGitUtils; +import com.gitblit.utils.StringUtils; +import com.gitblit.wicket.CacheControl; +import com.gitblit.wicket.GitBlitWebSession; +import com.gitblit.wicket.CacheControl.LastModified; +import com.gitblit.wicket.MarkupProcessor; +import com.gitblit.wicket.MarkupProcessor.MarkupDocument; +import com.gitblit.wicket.WicketUtils; + +@CacheControl(LastModified.BOOT) +public class EditFilePage extends RepositoryPage { + + public EditFilePage(final PageParameters params) { + super(params); + + final UserModel currentUser = (GitBlitWebSession.get().getUser() != null) ? GitBlitWebSession.get().getUser() : UserModel.ANONYMOUS; + + final String path = WicketUtils.getPath(params).replace("%2f", "/").replace("%2F", "/"); + MarkupProcessor processor = new MarkupProcessor(app().settings(), app().xssFilter()); + + Repository r = getRepository(); + RevCommit commit = JGitUtils.getCommit(r, objectId); + String [] encodings = getEncodings(); + + // Read raw markup content and transform it to html + String documentPath = path; + String markupText = JGitUtils.getStringContent(r, commit.getTree(), path, encodings); + + // Hunt for document + if (StringUtils.isEmpty(markupText)) { + String name = StringUtils.stripFileExtension(path); + + List<String> docExtensions = processor.getAllExtensions(); + for (String ext : docExtensions) { + String checkName = name + "." + ext; + markupText = JGitUtils.getStringContent(r, commit.getTree(), checkName, encodings); + if (!StringUtils.isEmpty(markupText)) { + // found it + documentPath = path; + break; + } + } + } + + if (markupText == null) { + markupText = ""; + } + + BugtraqProcessor bugtraq = new BugtraqProcessor(app().settings()); + markupText = bugtraq.processText(getRepository(), repositoryName, markupText); + + Fragment fragment; + String displayedCommitId = commit.getId().getName(); + MarkupDocument markupDoc = processor.parse(repositoryName, displayedCommitId, documentPath, markupText); + logger.info("Loading Edit File page: " + displayedCommitId); + + if (currentUser.canEdit(getRepositoryModel())) { + + final Model<String> documentContent = new Model<String>(markupDoc.markup); + final Model<String> commitMessage = new Model<String>("Document update"); + final Model<String> commitIdAtLoad = new Model<String>(displayedCommitId); + + fragment = new Fragment("doc", "markupContent", this); + + Form<Void> form = new Form<Void>("documentEditor") { + + private static final long serialVersionUID = 1L; + + @Override + protected void onSubmit() { + + final Repository repository = getRepository(); + final String document = documentContent.getObject(); + final String message = commitMessage.getObject(); + + final String branchName = JGitUtils.getBranch(getRepository(), objectId).getName(); + final String authorEmail = StringUtils.isEmpty(currentUser.emailAddress) ? (currentUser.username + "@gitblit") : currentUser.emailAddress; + + boolean success = false; + + try { + ObjectId docAtLoad = getRepository().resolve(commitIdAtLoad.getObject()); + + logger.info("Commiting Edit File page: " + commitIdAtLoad.getObject()); + + DirCache index = DirCache.newInCore(); + DirCacheBuilder builder = index.builder(); + byte[] bytes = document.getBytes( Constants.ENCODING ); + + final DirCacheEntry fileUpdate = new DirCacheEntry(path); + fileUpdate.setLength(bytes.length); + fileUpdate.setLastModified(System.currentTimeMillis()); + fileUpdate.setFileMode(FileMode.REGULAR_FILE); + fileUpdate.setObjectId(repository.newObjectInserter().insert( org.eclipse.jgit.lib.Constants.OBJ_BLOB, bytes )); + builder.add(fileUpdate); + + Set<String> ignorePaths = new HashSet<String>(); + ignorePaths.add(path); + + for (DirCacheEntry entry : JGitUtils.getTreeEntries(repository, branchName, ignorePaths)) { + builder.add(entry); + } + + builder.finish(); + + final boolean forceCommit = false; + + success = JGitUtils.commitIndex(repository, branchName, index, docAtLoad, forceCommit, currentUser.getDisplayName(), authorEmail, message); + + } catch (IOException | ConcurrentRefUpdateException e) { + e.printStackTrace(); + } + + if (success == false) { + EditFilePage.this.error("Unable to commit document " + path, false); + return; + } + + setResponsePage(EditFilePage.class, params); + return; + } + }; + + final TextArea<String> docIO = new TextArea<String>("content", documentContent); + docIO.setOutputMarkupId(false); + + form.add(new Label("commitAuthor", String.format("%s <%s>", currentUser.getDisplayName(), currentUser.emailAddress))); + form.add(new TextArea<String>("commitMessage", commitMessage)); + + + form.setOutputMarkupId(false); + form.add(docIO); + + addBottomScriptInline("attachDocumentEditor(document.querySelector('textarea#editor'), $('#commitDialog'));"); + + fragment.add(form); + + } else { + + final Model<String> documentContent = new Model<String>(markupDoc.html); + + fragment = new Fragment("doc", "plainContent", this); + + fragment.add(new Label("content", documentContent).setEscapeModelStrings(false)); + } + + // document page links + fragment.add(new BookmarkablePageLink<Void>("blameLink", BlamePage.class, + WicketUtils.newPathParameter(repositoryName, objectId, documentPath))); + fragment.add(new BookmarkablePageLink<Void>("historyLink", HistoryPage.class, + WicketUtils.newPathParameter(repositoryName, objectId, documentPath))); + String rawUrl = RawServlet.asLink(getContextUrl(), repositoryName, objectId, documentPath); + fragment.add(new ExternalLink("rawLink", rawUrl)); + + add(fragment); + + } + + @Override + protected String getPageName() { + return getString("gb.docs"); + } + + @Override + protected boolean isCommitPage() { + return true; + } + + @Override + protected Class<? extends BasePage> getRepoNavPageClass() { + return DocsPage.class; + } + + + +} |