示例#1
0
        private void SavePageViewPermissions(ACConverterPageInfo pageInfo)
        {
            RemotePermission[] pagePermissions = _confluenceService.GetPagePermissions(pageInfo.ConfluencePage.id);

            //If there no view restrictions on the page, copy parent page restrictions.
            if (Array.Find(pagePermissions,
                           delegate(RemotePermission p) { return(p.lockType == ConfluenceViewPermissionName); }) == null)
            {
                if (pageInfo.ParentPage != null)
                {
                    foreach (RemotePermission permission in pageInfo.ParentPage.ConfluenceUsersWithViewPermissions.Values)
                    {
                        pageInfo.ConfluenceUsersWithViewPermissions[permission.lockedBy.ToLower()] = permission;
                    }
                }
                return;
            }

            foreach (RemotePermission permission in pagePermissions)
            {
                if (permission.lockType == ConfluenceViewPermissionName)
                {
                    if ((pageInfo.ParentPage != null) && (pageInfo.ParentPage.ConfluenceUsersWithViewPermissions.Count != 0))
                    {
                        if (!pageInfo.ParentPage.ConfluenceUsersWithViewPermissions.ContainsKey(permission.lockedBy.ToLower()))
                        {
                            //If this user haven't permission to view parent page, then he haven't permission to view this page in Confluence
                            continue;
                        }
                    }
                    pageInfo.ConfluenceUsersWithViewPermissions[permission.lockedBy.ToLower()] = permission;
                }
            }
        }
示例#2
0
        private void MovePageContent(Dictionary <string, string> pathMap)
        {
            foreach (string space in Utils.GetPersistedSpaces())
            {
                if ((_spacesToConvert.Count > 0) && (!_spacesToConvert.Contains(space.ToLower())))
                {
                    continue;
                }

                RemoteSpace spaceInfo = _confluenceService.GetSpace(space);


                foreach (string p in Utils.GetPersistedPagesInSpace(space))
                {
                    ACConverterPageInfo pageInfo = Utils.RestorePageInfo(space, p);
                    if (pageInfo != null)
                    {
                        MovePageContent(pathMap, pageInfo);

                        if (pageInfo.ConfluencePage.id == spaceInfo.homePage)
                        {
                            //Set content of the MT space root page after the homepage is processed.
                            string content = "{{" + string.Format("wiki.page(wiki.getpage({0}).path);", pageInfo.DekiPageId) + "}}";
                            CreateDekiPage(_dekiPlug, pageInfo.SpaceRootPath, spaceInfo.name, null, content);
                        }
                    }
                }
            }
        }
 //--- Constructors ---
 public ACConverterPageInfo(RemotePage confluenceRemotePage, string spaceRootPath, string dekiPageUrl, string dekiPagePath, int dekiPageId,
     string pageTitle, string tinyUrl, ACConverterPageInfo parentPage) {
     this._confluenceRemotePage = confluenceRemotePage;
     this._dekiPageUrl = dekiPageUrl;
     this._dekiPagePath = dekiPagePath;
     this._dekiPageId = dekiPageId;
     this._pageTitle = pageTitle;
     this._parentPage = parentPage;
     this._tinyUrl = tinyUrl;
     this._spaceRootPath = spaceRootPath;
 }
 //--- Constructors ---
 public ACConverterPageInfo(RemotePage confluenceRemotePage, string spaceRootPath, string dekiPageUrl, string dekiPagePath, int dekiPageId,
                            string pageTitle, string tinyUrl, ACConverterPageInfo parentPage)
 {
     this._confluenceRemotePage = confluenceRemotePage;
     this._dekiPageUrl          = dekiPageUrl;
     this._dekiPagePath         = dekiPagePath;
     this._dekiPageId           = dekiPageId;
     this._pageTitle            = pageTitle;
     this._parentPage           = parentPage;
     this._tinyUrl       = tinyUrl;
     this._spaceRootPath = spaceRootPath;
 }
示例#5
0
        //TODO : this needs to be tested
        public string ReplaceMacrosWithStubs(ACConverterPageInfo pageinfo)
        {
            string rawContents = pageinfo.ConfluencePage.content;

            foreach (string macro in Converters.GetSupportedMacros())
            {
                Regex converter = new Regex(@"\{(" + macro + "[^}]*)}");
                rawContents = converter.Replace(rawContents, MacroStubStart + "$1" + MacroStubEnd);
            }

            return(rawContents);
        }
示例#6
0
        //TODO : this needs to be tested
        public string ReplaceMacrosWithStubs(ACConverterPageInfo pageinfo)
        {
            string rawContents = pageinfo.ConfluencePage.content;

            foreach (string macro in Converters.GetSupportedMacros())
            {
                Regex converter = new Regex(@"\{(" + macro + "[^}]*)}");
                rawContents = converter.Replace(rawContents, MacroStubStart + "$1" + MacroStubEnd);
            }

            return rawContents;
        }
        public override string ConvertMacro(Dictionary<string, string> pathMap, Macro macro, ACConverterPageInfo pageInfo)
        {
            string dekiMacro = "";//"{{ wiki.page(" + objMacro + ") }}";
            if (macro.Arguments != null)
            {
                string spaceKey = (macro.Arguments.Keys.Contains("spaceKey")) ? macro.Arguments["spaceKey"] : pageInfo.ConfluencePage.space;
                string pageTitle = (macro.Arguments.Keys.Contains("pageTitle")) ? macro.Arguments["pageTitle"] : macro.Arguments[Utils.DefaultParamName];

                ACConverter aconverter = new ACConverter();
                dekiMacro = aconverter.GetMtPathFromConfluencePath(pathMap, spaceKey, pageTitle);

                dekiMacro = "{{ wiki.page(\"" + dekiMacro + "\") }}";
            }

            return dekiMacro;
        }
示例#8
0
        public void LogPageConversion(XDoc spaceManifest, ACConverterPageInfo pageInfo) {
            string xpath = string.Format("page[@c.pageid='{0}']", pageInfo.ConfluencePage.id);
            XDoc pageXml = spaceManifest[xpath];

            if(pageXml.IsEmpty) {
                spaceManifest.Start("page");
                spaceManifest.Attr("c.space", pageInfo.ConfluencePage.space);
                spaceManifest.Attr("c.pageid", pageInfo.ConfluencePage.id);
                spaceManifest.Attr("c.parentpageid", pageInfo.ConfluencePage.parentId);
                spaceManifest.Attr("c.path", Utils.GetUrlLocalUri(_confBaseUrl, pageInfo.ConfluencePage.url, true, false));
                spaceManifest.Attr("c.tinyurl", pageInfo.TinyUrl);
                spaceManifest.Attr("mt.pageid", pageInfo.DekiPageId);
                spaceManifest.Attr("mt.path", pageInfo.DekiPageUrl);
                spaceManifest.Attr("title", pageInfo.PageTitle);
                spaceManifest.End();
            }
        }
示例#9
0
        private void MovePageHistory(Dictionary<string, string> pathMap, ACConverterPageInfo pageInfo)
        {
            List<RemotePage> pageHistories = GetHistoryPages(pageInfo.ConfluencePage.id);
            pageHistories.Reverse();
            foreach (RemotePage remoteHistoryPage in pageHistories)
            {
                Log.DebugFormat("Processing PageHistory for pageid: {0} pageHistoryid: {1}", pageInfo.DekiPageId, pageInfo.ConfluencePage.id);

                string confluencePageContent = _confluenceService.RenderContent(pageInfo.ConfluencePage.space,
                        remoteHistoryPage.id, remoteHistoryPage.content);

                confluencePageContent = ExtractPageContentAndReplaceLinks(pathMap, confluencePageContent);

                Plug postPageDekiPlug = _dekiPlug;

                CreateDekiPage(postPageDekiPlug, pageInfo.DekiPagePath, pageInfo.PageTitle, pageInfo.ConfluencePage.modified, confluencePageContent);
            }
        }       
示例#10
0
        public void LogPageConversion(XDoc spaceManifest, ACConverterPageInfo pageInfo)
        {
            string xpath   = string.Format("page[@c.pageid='{0}']", pageInfo.ConfluencePage.id);
            XDoc   pageXml = spaceManifest[xpath];

            if (pageXml.IsEmpty)
            {
                spaceManifest.Start("page");
                spaceManifest.Attr("c.space", pageInfo.ConfluencePage.space);
                spaceManifest.Attr("c.pageid", pageInfo.ConfluencePage.id);
                spaceManifest.Attr("c.parentpageid", pageInfo.ConfluencePage.parentId);
                spaceManifest.Attr("c.path", Utils.GetUrlLocalUri(_confBaseUrl, pageInfo.ConfluencePage.url, true, false));
                spaceManifest.Attr("c.tinyurl", pageInfo.TinyUrl);
                spaceManifest.Attr("mt.pageid", pageInfo.DekiPageId);
                spaceManifest.Attr("mt.path", pageInfo.DekiPageUrl);
                spaceManifest.Attr("title", pageInfo.PageTitle);
                spaceManifest.End();
            }
        }
示例#11
0
        private void MovePageHistory(Dictionary <string, string> pathMap, ACConverterPageInfo pageInfo)
        {
            List <RemotePage> pageHistories = GetHistoryPages(pageInfo.ConfluencePage.id);

            pageHistories.Reverse();
            foreach (RemotePage remoteHistoryPage in pageHistories)
            {
                Log.DebugFormat("Processing PageHistory for pageid: {0} pageHistoryid: {1}", pageInfo.DekiPageId, pageInfo.ConfluencePage.id);

                string confluencePageContent = _confluenceService.RenderContent(pageInfo.ConfluencePage.space,
                                                                                remoteHistoryPage.id, remoteHistoryPage.content);

                confluencePageContent = ExtractPageContentAndReplaceLinks(pathMap, confluencePageContent);

                Plug postPageDekiPlug = _dekiPlug;

                CreateDekiPage(postPageDekiPlug, pageInfo.DekiPagePath, pageInfo.PageTitle, pageInfo.ConfluencePage.modified, confluencePageContent);
            }
        }
示例#12
0
        public static ACConverterPageInfo RestorePageInfo(string space, string pageid)
        {
            ACConverterPageInfo o      = null;
            Stream          fileStream = null;
            string          filename   = string.Format(@"data\{0}\{1}{2}", space, pageid, ".bin");
            BinaryFormatter serializer = new BinaryFormatter();

            //XmlSerializer serializer = new XmlSerializer(typeof(ACConverterPageInfo));

            try {
                fileStream = File.OpenRead(filename);
                o          = serializer.Deserialize(fileStream) as ACConverterPageInfo;
            } catch (Exception x) {
                ACConverter.Log.WarnExceptionFormat(x, "Unable to restore page info from '{0}'", filename);
            } finally {
                if (fileStream != null)
                {
                    fileStream.Close();
                }
            }
            return(o);
        }
示例#13
0
        public static void PersistPageInfo(ACConverterPageInfo pageInfo)
        {
            Stream          fileStream = null;
            string          filename   = string.Format(@"data\{0}\{1}{2}", pageInfo.ConfluencePage.space, pageInfo.ConfluencePage.id, ".bin");
            BinaryFormatter serializer = new BinaryFormatter();

            //XmlSerializer serializer = new XmlSerializer(typeof(ACConverterPageInfo));
            try {
                FileInfo fi = new FileInfo(filename);
                fi.Directory.Create();
                fileStream = File.OpenWrite(filename);
                serializer.Serialize(fileStream, pageInfo);
                fileStream.Close();
            } catch (Exception x) {
                ACConverter.Log.WarnExceptionFormat(x, "Unable to persist page info to '{0}'", filename);
            } finally {
                if (fileStream != null)
                {
                    fileStream.Close();
                }
            }
        }
        private void MovePageContent(Dictionary<string, string> pathMap, ACConverterPageInfo pageInfo) {

            try {

                //Move the history of the page first
                MovePageHistory(pathMap, pageInfo);

                string stubContent = ReplaceMacrosWithStubs(pageInfo);

                // Move the latest revision
                string confluencePageContent = _confluenceService.RenderContent(pageInfo.ConfluencePage.space, pageInfo.ConfluencePage.id, stubContent);
                confluencePageContent = ConvertStubstoDeki(pathMap,confluencePageContent, pageInfo);

                confluencePageContent = ExtractPageContentAndReplaceLinks(pathMap, confluencePageContent);

                Plug postPageDekiPlug = _dekiPlug;
                if(pageInfo.ConfluenceUsersWithViewPermissions.Count > 0) {
                    if((pageInfo.ConfluencePage.modifier != null) && (pageInfo.ConfluenceUsersWithViewPermissions.ContainsKey(pageInfo.ConfluencePage.modifier.ToLower()))) {
                        postPageDekiPlug = GetPlugForConvertedUser(pageInfo.ConfluencePage.modifier);
                    } else {
                        if((pageInfo.ConfluencePage.creator != null) && (pageInfo.ConfluenceUsersWithViewPermissions.ContainsKey(pageInfo.ConfluencePage.creator.ToLower()))) {
                            postPageDekiPlug = GetPlugForConvertedUser(pageInfo.ConfluencePage.creator);
                        }
                    }
                } else {
                    if(pageInfo.ConfluencePage.modifier != null) {
                        postPageDekiPlug = GetPlugForConvertedUser(pageInfo.ConfluencePage.modifier);
                    } else {
                        if(pageInfo.ConfluencePage.creator != null) {
                            postPageDekiPlug = GetPlugForConvertedUser(pageInfo.ConfluencePage.creator);
                        }
                    }
                }

                CreateDekiPage(postPageDekiPlug, pageInfo.DekiPagePath, pageInfo.PageTitle,
                    pageInfo.ConfluencePage.modified, confluencePageContent);

                // Catch all exceptions when moving labels, comments and permissions.
                try {
                    MoveLabels(pageInfo.DekiPageId, pageInfo.ConfluencePage.id);
                } catch(Exception e) {
                    Log.WarnExceptionMethodCall(e, "MovePageContent", "Error occurred in MoveLabels");
                }

                try {
                    MoveComments(pageInfo.DekiPageId, pageInfo.ConfluencePage.id);
                } catch(Exception e) {
                    Log.WarnExceptionMethodCall(e, "MovePageContent", "Error occurred in MoveComments");
                }

                try {
                    MovePermissions(pageInfo);
                } catch(Exception e) {
                    Log.WarnExceptionMethodCall(e, "MovePageContent", "Error occurred in MovePermissions");
                }


            } catch(Exception e) {
                Log.WarnExceptionMethodCall(e, "MovePageContent", "Error occurred in MovePageContent");       
            }
        }
        private string MovePageStubs(XDoc spaceManifest, string spaceRoot, string parentPagePath, RemotePageSummary confluenceRemotePageSummary,
           string pageName, string pageTitle, ACConverterPageInfo parentPage)
        {
            RemotePage confluenceRemotePage = _confluenceService.GetPage(confluenceRemotePageSummary.id);
            string tinyUrl = null;

            if(_rpcclient != null) {
                CFRpcExtensions rpcExt = new CFRpcExtensions(_rpcclient);
                tinyUrl = rpcExt.GetTinyUrlForPageId(confluenceRemotePageSummary.id.ToString());
            }

            string pagePath = null;

            //If PageName not null use it, else use Confluence page title.
            if (pageName == null)
            {
                pageName = confluenceRemotePage.title;
            }

            pagePath = pageName;
            if (parentPagePath != null)
            {
                pagePath = parentPagePath + Utils.DoubleUrlEncode("/" + pagePath);
            }

            //If the page title is too long it gets saved as {spaceroot}/misc/{pageid} with the page title set
            if(pagePath.Length > MaxLengthOfPageTitle) {
                pagePath = Utils.DoubleUrlEncode(string.Format(@"{0}/misc/{1}", spaceRoot, confluenceRemotePage.id));
                if(string.IsNullOrEmpty(pageTitle)) {
                    pageTitle = pageName;
                }
                Log.WarnFormat("Page title longer than {0}. Will be placed into {1}. Title: {2}", MaxLengthOfPageTitle, pagePath, pageTitle);
            }

            Plug postPageDekiPlug = (confluenceRemotePage.creator == null) ? _dekiPlug :
                GetPlugForConvertedUser(confluenceRemotePage.creator);

            Log.TraceFormat("Creating page stub in space '{0}'", confluenceRemotePage.space);

            string mtPageUrl;

            // modified date string, according to:
            /* http://developer.mindtouch.com/en/ref/MindTouch_API/POST%3apages%2f%2f%7Bpageid%7D%2f%2fcontents
             * should be formatted as:
             * the edit timestamp - yyyyMMddHHmmss or yyyy-MM-ddTHH:mm:ssZ
             */

            int dekiPageId = CreateDekiPage(postPageDekiPlug, pagePath, pageTitle, confluenceRemotePage.modified, "",
                out mtPageUrl);

            if (dekiPageId == -1)
            {

                //TODO (maxm): page failure needs to be recorded and steps that depend 
                // on it such as attachments and children should be skipped
                return string.Empty;
            }
            ACConverterPageInfo pageInfo = new ACConverterPageInfo(confluenceRemotePage, spaceRoot, mtPageUrl, pagePath, dekiPageId, pageTitle, tinyUrl, parentPage);

            Utils.PersistPageInfo(pageInfo);

            //Confluence view page permission is inherited. Save they to use later in MovePermissions.
            SavePageViewPermissions(pageInfo);

            RemotePageSummary[] childPages = _confluenceService.GetChildren(confluenceRemotePage.id);
            foreach (RemotePageSummary childPageSummary in childPages)
            {
                MovePageStubs(spaceManifest, spaceRoot, pagePath, childPageSummary, null, null, pageInfo);
            }

            SaveCommentsLinks(spaceManifest, pageInfo.ConfluencePage.space, pageInfo.ConfluencePage.id, mtPageUrl);

            MoveAttachments(spaceManifest, pageInfo.DekiPageId,pageInfo.ConfluencePage.id);

            LogPageConversion(spaceManifest, pageInfo);

            return pagePath;
        }
        private void MovePermissions(ACConverterPageInfo pageInfo)
        {
            RemotePermission[] pagePermissions = _confluenceService.GetPagePermissions(pageInfo.ConfluencePage.id);

            //Change permissions list according to parent page permissoins
            List<RemotePermission> newPermissions = new List<RemotePermission>();
            foreach (RemotePermission permission in pageInfo.ConfluenceUsersWithViewPermissions.Values)
            {
                newPermissions.Add(permission);
            }
            foreach (RemotePermission permission in pagePermissions)
            {
                if (permission.lockType == ConfluenceEditPermissionName)
                {
                    if ((pageInfo.ConfluenceUsersWithViewPermissions.Count == 0) || (pageInfo.ConfluenceUsersWithViewPermissions.ContainsKey(permission.lockedBy.ToLower())))
                    {
                        newPermissions.Add(permission);
                    }
                }
            }

            pagePermissions = newPermissions.ToArray();

            if (pagePermissions.Length == 0)
            {
                return;
            }

            string dekiRestriction;

            //Possible two entry of one user or group in pagePermissions.
            //As View permission and as Edit permission for this group/user.
            //To prevent repeated addition to Deki in this dictionary stored true
            //if permission to this user/group added to Deki.
            Dictionary<string, bool> permissionAddedToDeki = new Dictionary<string, bool>();

            Dictionary<string, bool> userHaveWritePermission = new Dictionary<string, bool>();

            if (_compatibleConvertUserPermissions)
            {
                bool onlyWriteRestrictions = true;
                foreach (RemotePermission permission in pagePermissions)
                {
                    if (permission.lockType == ConfluenceViewPermissionName)
                    {
                        onlyWriteRestrictions = false;
                        break;
                    }
                }
                if (onlyWriteRestrictions)
                {
                    //If there no view restrictions on this Confluence page set Semi-Public restrictions to Deki users
                    dekiRestriction = "Semi-Public";
                }
                else
                {
                    //If there is view restrictions on this Confluence page to allow users/groups with View and Edit
                    //restrictions view this page set Private restriction in Deki.
                    //Users without Edit permission but with View permission in Confluence can edit this page in Deki.
                    dekiRestriction = "Private";
                }
            }
            else
            {
                dekiRestriction = "Private";

                foreach (RemotePermission permission in pagePermissions)
                {
                    if (permission.lockType == ConfluenceEditPermissionName)
                    {
                        userHaveWritePermission[permission.lockedBy.ToLower()] = true;
                    }
                    else
                    {
                        if (!userHaveWritePermission.ContainsKey(permission.lockedBy.ToLower()))
                        {
                            userHaveWritePermission[permission.lockedBy.ToLower()] = false;
                        }
                    }
                }
            }

            XDoc securityDoc = new XDoc("security")
                .Start("permissions.page")
                    .Elem("restriction", dekiRestriction)
                .End()
                .Start("grants");

            foreach (RemotePermission permission in pagePermissions)
            {
                if (permissionAddedToDeki.ContainsKey(permission.lockedBy.ToLower()))
                {
                    continue;
                }

                securityDoc
                .Start("grant")
                    .Start("permissions");
                if (_compatibleConvertUserPermissions)
                {
                    securityDoc.Elem("role", "Contributor");
                }
                else
                {
                    bool haveWritePermission = false;
                    userHaveWritePermission.TryGetValue(permission.lockedBy.ToLower(), out haveWritePermission);
                    if (haveWritePermission)
                    {
                        securityDoc.Elem("role", "Contributor");
                    }
                    else
                    {
                        securityDoc.Elem("role", "Viewer");
                    }
                }
                securityDoc.End();

                //Detect if this is group or user permission
                ACConverterUserInfo dekiUser;
                if (_convertedUsers.TryGetValue(permission.lockedBy.ToLower(), out dekiUser))
                {
                    securityDoc.Start("user").Attr("id", dekiUser.DekiUserId).End();
                }
                else
                {
                    ACConverterGroupInfo dekiGroup = null;
                    if (_convertedGroups.TryGetValue(permission.lockedBy.ToLower(), out dekiGroup))
                    {
                        securityDoc.Start("group").Attr("id", dekiGroup.DekiGroupId).End();
                    }
                    else
                    {
                        WriteLineToConsole("Page " + pageInfo.ConfluencePage.title + " locked by " + permission.lockedBy +
                            " that is not a user and not a group. Restriction ignored.");
                    }
                }
                securityDoc.End();

                permissionAddedToDeki[permission.lockedBy.ToLower()] = true;
            }

            securityDoc.End();

            DreamMessage res = _dekiPlug.At("pages", pageInfo.DekiPageId.ToString(), "security").PutAsync(securityDoc).Wait();
            if (res.Status != DreamStatus.Ok)
            {
                WriteLineToLog("Error converting permissions");
                WriteErrorResponse(res);
                WriteErrorRequest(securityDoc);
            }
        }
        private void MovePermissions(ACConverterPageInfo pageInfo)
        {
            RemotePermission[] pagePermissions = _confluenceService.GetPagePermissions(pageInfo.ConfluencePage.id);

            //Change permissions list according to parent page permissoins
            List <RemotePermission> newPermissions = new List <RemotePermission>();

            foreach (RemotePermission permission in pageInfo.ConfluenceUsersWithViewPermissions.Values)
            {
                newPermissions.Add(permission);
            }
            foreach (RemotePermission permission in pagePermissions)
            {
                if (permission.lockType == ConfluenceEditPermissionName)
                {
                    if ((pageInfo.ConfluenceUsersWithViewPermissions.Count == 0) || (pageInfo.ConfluenceUsersWithViewPermissions.ContainsKey(permission.lockedBy.ToLower())))
                    {
                        newPermissions.Add(permission);
                    }
                }
            }

            pagePermissions = newPermissions.ToArray();

            if (pagePermissions.Length == 0)
            {
                return;
            }

            string dekiRestriction;

            //Possible two entry of one user or group in pagePermissions.
            //As View permission and as Edit permission for this group/user.
            //To prevent repeated addition to Deki in this dictionary stored true
            //if permission to this user/group added to Deki.
            Dictionary <string, bool> permissionAddedToDeki = new Dictionary <string, bool>();

            Dictionary <string, bool> userHaveWritePermission = new Dictionary <string, bool>();

            if (_compatibleConvertUserPermissions)
            {
                bool onlyWriteRestrictions = true;
                foreach (RemotePermission permission in pagePermissions)
                {
                    if (permission.lockType == ConfluenceViewPermissionName)
                    {
                        onlyWriteRestrictions = false;
                        break;
                    }
                }
                if (onlyWriteRestrictions)
                {
                    //If there no view restrictions on this Confluence page set Semi-Public restrictions to Deki users
                    dekiRestriction = "Semi-Public";
                }
                else
                {
                    //If there is view restrictions on this Confluence page to allow users/groups with View and Edit
                    //restrictions view this page set Private restriction in Deki.
                    //Users without Edit permission but with View permission in Confluence can edit this page in Deki.
                    dekiRestriction = "Private";
                }
            }
            else
            {
                dekiRestriction = "Private";

                foreach (RemotePermission permission in pagePermissions)
                {
                    if (permission.lockType == ConfluenceEditPermissionName)
                    {
                        userHaveWritePermission[permission.lockedBy.ToLower()] = true;
                    }
                    else
                    {
                        if (!userHaveWritePermission.ContainsKey(permission.lockedBy.ToLower()))
                        {
                            userHaveWritePermission[permission.lockedBy.ToLower()] = false;
                        }
                    }
                }
            }

            XDoc securityDoc = new XDoc("security")
                               .Start("permissions.page")
                               .Elem("restriction", dekiRestriction)
                               .End()
                               .Start("grants");

            foreach (RemotePermission permission in pagePermissions)
            {
                if (permissionAddedToDeki.ContainsKey(permission.lockedBy.ToLower()))
                {
                    continue;
                }

                securityDoc
                .Start("grant")
                .Start("permissions");
                if (_compatibleConvertUserPermissions)
                {
                    securityDoc.Elem("role", "Contributor");
                }
                else
                {
                    bool haveWritePermission = false;
                    userHaveWritePermission.TryGetValue(permission.lockedBy.ToLower(), out haveWritePermission);
                    if (haveWritePermission)
                    {
                        securityDoc.Elem("role", "Contributor");
                    }
                    else
                    {
                        securityDoc.Elem("role", "Viewer");
                    }
                }
                securityDoc.End();

                //Detect if this is group or user permission
                ACConverterUserInfo dekiUser;
                if (_convertedUsers.TryGetValue(permission.lockedBy.ToLower(), out dekiUser))
                {
                    securityDoc.Start("user").Attr("id", dekiUser.DekiUserId).End();
                }
                else
                {
                    ACConverterGroupInfo dekiGroup = null;
                    if (_convertedGroups.TryGetValue(permission.lockedBy.ToLower(), out dekiGroup))
                    {
                        securityDoc.Start("group").Attr("id", dekiGroup.DekiGroupId).End();
                    }
                    else
                    {
                        WriteLineToConsole("Page " + pageInfo.ConfluencePage.title + " locked by " + permission.lockedBy +
                                           " that is not a user and not a group. Restriction ignored.");
                    }
                }
                securityDoc.End();

                permissionAddedToDeki[permission.lockedBy.ToLower()] = true;
            }

            securityDoc.End();

            DreamMessage res = _dekiPlug.At("pages", pageInfo.DekiPageId.ToString(), "security").PutAsync(securityDoc).Wait();

            if (res.Status != DreamStatus.Ok)
            {
                WriteLineToLog("Error converting permissions");
                WriteErrorResponse(res);
                WriteErrorRequest(securityDoc);
            }
        }
示例#18
0
 //TODO : Implementation pending
 public string ConvertStubstoDeki(Dictionary<string, string> pathMap,string stubbedPageContent, ACConverterPageInfo pageInfo)
 {
     return Converters.Convert(pathMap, stubbedPageContent, pageInfo);
 }
示例#19
0
文件: Utils.cs 项目: heran/DekiWiki
 public static void PersistPageInfo(ACConverterPageInfo pageInfo) {
     Stream fileStream = null;
     string filename = string.Format(@"data\{0}\{1}{2}", pageInfo.ConfluencePage.space, pageInfo.ConfluencePage.id, ".bin");
     BinaryFormatter serializer = new BinaryFormatter();
     //XmlSerializer serializer = new XmlSerializer(typeof(ACConverterPageInfo));
     try {
         FileInfo fi = new FileInfo(filename);
         fi.Directory.Create();
         fileStream = File.OpenWrite(filename);
         serializer.Serialize(fileStream, pageInfo);
         fileStream.Close();
     } catch(Exception x) {
         ACConverter.Log.WarnExceptionFormat(x, "Unable to persist page info to '{0}'", filename);
     } finally {
         if(fileStream != null) {
             fileStream.Close();
         }
     }
 }
示例#20
0
        private string MovePageStubs(XDoc spaceManifest, string spaceRoot, string parentPagePath, RemotePageSummary confluenceRemotePageSummary,
                                     string pageName, string pageTitle, ACConverterPageInfo parentPage)
        {
            RemotePage confluenceRemotePage = _confluenceService.GetPage(confluenceRemotePageSummary.id);
            string     tinyUrl = null;

            if (_rpcclient != null)
            {
                CFRpcExtensions rpcExt = new CFRpcExtensions(_rpcclient);
                tinyUrl = rpcExt.GetTinyUrlForPageId(confluenceRemotePageSummary.id.ToString());
            }

            string pagePath = null;

            //If PageName not null use it, else use Confluence page title.
            if (pageName == null)
            {
                pageName = confluenceRemotePage.title;
            }

            pagePath = pageName;
            if (parentPagePath != null)
            {
                pagePath = parentPagePath + Utils.DoubleUrlEncode("/" + pagePath);
            }

            //If the page title is too long it gets saved as {spaceroot}/misc/{pageid} with the page title set
            if (pagePath.Length > MaxLengthOfPageTitle)
            {
                pagePath = Utils.DoubleUrlEncode(string.Format(@"{0}/misc/{1}", spaceRoot, confluenceRemotePage.id));
                if (string.IsNullOrEmpty(pageTitle))
                {
                    pageTitle = pageName;
                }
                Log.WarnFormat("Page title longer than {0}. Will be placed into {1}. Title: {2}", MaxLengthOfPageTitle, pagePath, pageTitle);
            }

            Plug postPageDekiPlug = (confluenceRemotePage.creator == null) ? _dekiPlug :
                                    GetPlugForConvertedUser(confluenceRemotePage.creator);

            Log.TraceFormat("Creating page stub in space '{0}'", confluenceRemotePage.space);

            string mtPageUrl;

            // modified date string, according to:

            /* http://developer.mindtouch.com/en/ref/MindTouch_API/POST%3apages%2f%2f%7Bpageid%7D%2f%2fcontents
             * should be formatted as:
             * the edit timestamp - yyyyMMddHHmmss or yyyy-MM-ddTHH:mm:ssZ
             */

            int dekiPageId = CreateDekiPage(postPageDekiPlug, pagePath, pageTitle, confluenceRemotePage.modified, "",
                                            out mtPageUrl);

            if (dekiPageId == -1)
            {
                //TODO (maxm): page failure needs to be recorded and steps that depend
                // on it such as attachments and children should be skipped
                return(string.Empty);
            }
            ACConverterPageInfo pageInfo = new ACConverterPageInfo(confluenceRemotePage, spaceRoot, mtPageUrl, pagePath, dekiPageId, pageTitle, tinyUrl, parentPage);

            Utils.PersistPageInfo(pageInfo);

            //Confluence view page permission is inherited. Save they to use later in MovePermissions.
            SavePageViewPermissions(pageInfo);

            RemotePageSummary[] childPages = _confluenceService.GetChildren(confluenceRemotePage.id);
            foreach (RemotePageSummary childPageSummary in childPages)
            {
                MovePageStubs(spaceManifest, spaceRoot, pagePath, childPageSummary, null, null, pageInfo);
            }

            SaveCommentsLinks(spaceManifest, pageInfo.ConfluencePage.space, pageInfo.ConfluencePage.id, mtPageUrl);

            MoveAttachments(spaceManifest, pageInfo.DekiPageId, pageInfo.ConfluencePage.id);

            LogPageConversion(spaceManifest, pageInfo);

            return(pagePath);
        }
示例#21
0
        private void SavePageViewPermissions(ACConverterPageInfo pageInfo)
        {
            RemotePermission[] pagePermissions = _confluenceService.GetPagePermissions(pageInfo.ConfluencePage.id);

            //If there no view restrictions on the page, copy parent page restrictions.
            if (Array.Find(pagePermissions,
                delegate(RemotePermission p) { return (p.lockType == ConfluenceViewPermissionName); }) == null)
            {
                if (pageInfo.ParentPage != null)
                {
                    foreach (RemotePermission permission in pageInfo.ParentPage.ConfluenceUsersWithViewPermissions.Values)
                    {
                        pageInfo.ConfluenceUsersWithViewPermissions[permission.lockedBy.ToLower()] = permission;
                    }
                }
                return;
            }

            foreach (RemotePermission permission in pagePermissions)
            {
                if (permission.lockType == ConfluenceViewPermissionName)
                {
                    if ((pageInfo.ParentPage != null) && (pageInfo.ParentPage.ConfluenceUsersWithViewPermissions.Count != 0))
                    {
                        if (!pageInfo.ParentPage.ConfluenceUsersWithViewPermissions.ContainsKey(permission.lockedBy.ToLower()))
                        {
                            //If this user haven't permission to view parent page, then he haven't permission to view this page in Confluence
                            continue;
                        }
                    }
                    pageInfo.ConfluenceUsersWithViewPermissions[permission.lockedBy.ToLower()] = permission;
                }
            }
        }
示例#22
0
        private void MovePageContent(Dictionary <string, string> pathMap, ACConverterPageInfo pageInfo)
        {
            try {
                //Move the history of the page first
                MovePageHistory(pathMap, pageInfo);

                string stubContent = ReplaceMacrosWithStubs(pageInfo);

                // Move the latest revision
                string confluencePageContent = _confluenceService.RenderContent(pageInfo.ConfluencePage.space, pageInfo.ConfluencePage.id, stubContent);
                confluencePageContent = ConvertStubstoDeki(pathMap, confluencePageContent, pageInfo);

                confluencePageContent = ExtractPageContentAndReplaceLinks(pathMap, confluencePageContent);

                Plug postPageDekiPlug = _dekiPlug;
                if (pageInfo.ConfluenceUsersWithViewPermissions.Count > 0)
                {
                    if ((pageInfo.ConfluencePage.modifier != null) && (pageInfo.ConfluenceUsersWithViewPermissions.ContainsKey(pageInfo.ConfluencePage.modifier.ToLower())))
                    {
                        postPageDekiPlug = GetPlugForConvertedUser(pageInfo.ConfluencePage.modifier);
                    }
                    else
                    {
                        if ((pageInfo.ConfluencePage.creator != null) && (pageInfo.ConfluenceUsersWithViewPermissions.ContainsKey(pageInfo.ConfluencePage.creator.ToLower())))
                        {
                            postPageDekiPlug = GetPlugForConvertedUser(pageInfo.ConfluencePage.creator);
                        }
                    }
                }
                else
                {
                    if (pageInfo.ConfluencePage.modifier != null)
                    {
                        postPageDekiPlug = GetPlugForConvertedUser(pageInfo.ConfluencePage.modifier);
                    }
                    else
                    {
                        if (pageInfo.ConfluencePage.creator != null)
                        {
                            postPageDekiPlug = GetPlugForConvertedUser(pageInfo.ConfluencePage.creator);
                        }
                    }
                }

                CreateDekiPage(postPageDekiPlug, pageInfo.DekiPagePath, pageInfo.PageTitle,
                               pageInfo.ConfluencePage.modified, confluencePageContent);

                // Catch all exceptions when moving labels, comments and permissions.
                try {
                    MoveLabels(pageInfo.DekiPageId, pageInfo.ConfluencePage.id);
                } catch (Exception e) {
                    Log.WarnExceptionMethodCall(e, "MovePageContent", "Error occurred in MoveLabels");
                }

                try {
                    MoveComments(pageInfo.DekiPageId, pageInfo.ConfluencePage.id);
                } catch (Exception e) {
                    Log.WarnExceptionMethodCall(e, "MovePageContent", "Error occurred in MoveComments");
                }

                try {
                    MovePermissions(pageInfo);
                } catch (Exception e) {
                    Log.WarnExceptionMethodCall(e, "MovePageContent", "Error occurred in MovePermissions");
                }
            } catch (Exception e) {
                Log.WarnExceptionMethodCall(e, "MovePageContent", "Error occurred in MovePageContent");
            }
        }
示例#23
0
 //TODO : Implementation pending
 public string ConvertStubstoDeki(Dictionary <string, string> pathMap, string stubbedPageContent, ACConverterPageInfo pageInfo)
 {
     return(Converters.Convert(pathMap, stubbedPageContent, pageInfo));
 }