Beispiel #1
0
        public static IMd Create(int level)
        {
            var locator = new MdLocator(new byte[32], DataProtocol.DEFAULT_PROTOCOL);

            _rand.NextBytes(locator.XORName);
            return(Locate(locator, level));
        }
        async Task <IMdNode> GetNewMdNodeAsync()
        {
            // Create Permissions
            using (var permissionsHandle = await _dataOps.Session.MDataPermissions.NewAsync())
            {
                using (var appSignPkH = await _dataOps.Session.Crypto.AppPubSignKeyAsync())
                    await _dataOps.Session.MDataPermissions.InsertAsync(permissionsHandle, appSignPkH, _dataOps.GetFullPermissions());

                // Set Permissions
                foreach (var pair in _permissions.MdHeadPermissions)
                {
                    var userSignKeyH = await _dataOps.Session.Crypto.SignPubKeyNewAsync(pair.Key);

                    await _dataOps.Session.MDataPermissions.InsertAsync(permissionsHandle, userSignKeyH, pair.Value);
                }

                // New mdHead
                var mdInfo = await _dataOps.CreateEmptyRandomPrivateMd(permissionsHandle, DataProtocol.DEFAULT_AD_PROTOCOL); // TODO: DataProtocol.MD_HEAD);

                var locator = new MdLocator(mdInfo.Name, mdInfo.TypeTag, mdInfo.EncKey, mdInfo.EncNonce);

                var mdResult = await _nodeFactory.LocateAsync(locator);

                if (!mdResult.HasValue)
                {
                    throw new ArgumentException(mdResult.ErrorMsg);
                }
                return(mdResult.Value);
            }
        }
Beispiel #3
0
 public RecordInfo(string path, MdLocator locator,
                   Func <string, Result <StoredValue> > infoReader, Func <string, StoredValue, Result <Pointer> > infoWriter)
 {
     Path        = path;
     Locator     = locator;
     _infoReader = infoReader;
     _infoWriter = infoWriter;
 }
        public async Task <MdHead> GetOrAddHeadAsync(string mdName)
        {
            if (mdName.Contains(".") || mdName.Contains("@"))
            {
                throw new NotSupportedException("Unsupported characters '.' and '@'.");
            }

            var mdId = $"{_protocol}/{mdName}";

            if (_mdContainer.MdLocators.ContainsKey(mdId))
            {
                var location = _mdContainer.MdLocators[mdId];
                var mdResult = await LocateMdNode(location);

                return(new MdHead(mdResult.Value, mdId));
            }

            // Create Permissions
            using (var permissionsHandle = await _dataOps.Session.MDataPermissions.NewAsync())
            {
                using (var appSignPkH = await _dataOps.Session.Crypto.AppPubSignKeyAsync())
                {
                    await _dataOps.Session.MDataPermissions.InsertAsync(permissionsHandle, appSignPkH, _dataOps.GetFullPermissions());
                }

                // New mdHead
                var mdInfo = await _dataOps.CreateEmptyRandomPrivateMd(permissionsHandle, DataProtocol.DEFAULT_PROTOCOL); // TODO: DataProtocol.MD_HEAD);

                var location = new MdLocator(mdInfo.Name, mdInfo.TypeTag, mdInfo.EncKey, mdInfo.EncNonce);

                // add mdHead to mdContainer
                _mdContainer.MdLocators[mdId] = location;

                // Finally update App Container with newly serialized mdContainer
                var serializedMdContainer = _mdContainer.Json();
                var appContainer          = await _dataOps.Session.AccessContainer.GetMDataInfoAsync(APP_CONTAINER_PATH);

                var mdKeyCipherBytes = await _dataOps.Session.MDataInfoActions.EncryptEntryKeyAsync(appContainer, MD_CONTAINER_KEY_BYTES);

                var mdCipherBytes = await _dataOps.Session.MDataInfoActions.EncryptEntryValueAsync(appContainer, serializedMdContainer.ToUtfBytes());

                using (var appContEntryActionsH = await _dataOps.Session.MDataEntryActions.NewAsync())
                {
                    await _dataOps.Session.MDataEntryActions.UpdateAsync(appContEntryActionsH, mdKeyCipherBytes, mdCipherBytes, _mdContainerVersion + 1);

                    await _dataOps.Session.MData.MutateEntriesAsync(appContainer, appContEntryActionsH); // <----------------------------------------------    Commit ------------------------
                }

                ++_mdContainerVersion;

                var mdResult = await LocateMdNode(location);

                return(new MdHead(mdResult.Value, mdId));
            }
        }
        public static async Task <Result <IIndexer> > GetOrAddAsync(string directoryPath)
        {
            var indexLocation = new MdLocator(Encoding.UTF8.GetBytes($"{directoryPath}_indexer"), DataProtocol.DEFAULT_PROTOCOL);
            var indexMd       = await MdAccess.LocateAsync(indexLocation).ConfigureAwait(false);

            if (!indexMd.HasValue)
            {
                indexMd = Result.OK(await MdAccess.CreateAsync(0));
            }
            var indexHead = new MdHead(indexMd.Value, directoryPath);
            var indexer   = await Indexer.GetOrAddAsync(indexHead);

            return(Result.OK((IIndexer)indexer));
        }
Beispiel #6
0
        public static async Task <Result <IMd> > LocateAsync(MdLocator location, NetworkDataOps networkDataOp)
        {
            var mdResult = await networkDataOp.LocatePublicMd(location.XORName, location.TypeTag);

            if (!mdResult.HasValue)
            {
                return(new KeyNotFound <IMd>($"Could not locate md: {location.TypeTag}, {location.XORName}"));
            }

            var mdInfo = mdResult.Value;
            var md     = new MdOps(mdInfo, networkDataOp.Session);
            await md.GetOrAddMetadata();

            return(Result.OK((IMd)md));
        }
Beispiel #7
0
        public static async Task <Result <IMdNode> > LocateAsync(MdLocator location, Session session)
        {
            var networkDataOps = new NetworkDataOps(session);

            // var mdResult = await networkDataOps.LocatePublicMd(location.XORName, location.TypeTag);
            var mdResult = await networkDataOps.LocatePrivateMd(location.XORName, location.TypeTag, location.SecEncKey, location.Nonce);

            if (!mdResult.HasValue)
            {
                return(new KeyNotFound <IMdNode>($"Could not locate md: {location.TypeTag}, {location.XORName}"));
            }

            var mdInfo = mdResult.Value;
            var md     = new MdNode(mdInfo, networkDataOps.Session);
            await md.GetOrAddMetadata();

            return(Result.OK((IMdNode)md));
        }
        public async Task <Result <IMdNode> > LocateAsync(MdLocator location)
        {
            // var mdResult = await networkDataOps.LocatePublicMd(location.XORName, location.TypeTag);
            var mdResult = await _networkOps.LocatePrivateMd(location.XORName, location.TypeTag, location.SecEncKey, location.Nonce)
                           .ConfigureAwait(false);

            if (!mdResult.HasValue)
            {
                return(new KeyNotFound <IMdNode>($"Could not locate md: {location.TypeTag}, {location.XORName}"));
            }

            var mdInfo  = mdResult.Value;
            var dataOps = new MdDataOps(this, _networkOps, mdInfo);
            var md      = new MdNode(dataOps, _snapshotter);
            await md.Initialize(metadata : null).ConfigureAwait(false);

            return(Result.OK((IMdNode)md));
        }
        public static async Task <Result <Directory> > GetOrAddAsync(string directoryPath)
        {
            var indexer = await IndexerFactory.GetOrAddAsync(directoryPath);

            if (!indexer.HasValue)
            {
                return(Result.Fail <Directory>(indexer.ErrorCode.Value, indexer.ErrorMsg));
            }

            var dirLocation = new MdLocator(Encoding.UTF8.GetBytes(directoryPath), DataProtocol.DEFAULT_PROTOCOL);
            var dirMd       = await MdAccess.LocateAsync(dirLocation).ConfigureAwait(false);

            if (!dirMd.HasValue)
            {
                dirMd = Result.OK(await MdAccess.CreateAsync(0));
            }
            var dirHead   = new MdHead(dirMd.Value, directoryPath);
            var dirResult = await Directory.GetOrAddAsync(dirHead, indexer.Value);

            return(dirResult);
        }
Beispiel #10
0
        public async Task <IDatabase> GetOrAddDataBaseAsync(string dbName)
        {
            var indexLocation = new MdLocator(System.Text.Encoding.UTF8.GetBytes($"{dbName}_indexer"), DataProtocol.DEFAULT_PROTOCOL, null, null);
            var indexMd       = await MdAccess.LocateAsync(indexLocation).ConfigureAwait(false);

            if (!indexMd.HasValue)
            {
                throw new System.Exception(indexMd.ErrorMsg);
            }
            var indexHead = new MdHead(indexMd.Value, dbName);
            var indexer   = await Indexer.GetOrAddAsync(indexHead);

            var dbLocation = new MdLocator(System.Text.Encoding.UTF8.GetBytes(dbName), DataProtocol.DEFAULT_PROTOCOL, null, null);
            var dbMd       = await MdAccess.LocateAsync(dbLocation).ConfigureAwait(false);

            if (!dbMd.HasValue)
            {
                throw new System.Exception(dbMd.ErrorMsg);
            }
            var dbHead   = new MdHead(dbMd.Value, dbName);
            var dbResult = await Database.GetOrAddAsync(dbHead, indexer);

            return(dbResult.Value);
        }
Beispiel #11
0
        public static IMd Locate(MdLocator locator, int level = 0)
        {
            var xorString = GetString(locator);

            using (var db = GetRocksDb())
            {
                var metaKey = $"{xorString}_0"; // entry 0
                var column  = db.GetColumnFamily(COLUMN_FAMILY);
                var value   = db.Get(metaKey, cf: column);
                if (value == null) // if not found, create with level 0
                {
                    var data = new LocalMdData
                    {
                        Locator       = locator,
                        LocatorString = xorString,
                        Level         = level
                    };
                    value = data.Json();
                    db.Put(metaKey, new StoredValue(level).Json(), cf: column); // store level 0
                    return(new LocalMd(data));
                }
                else
                {
                    var existing = new LocalMdData
                    {
                        Locator       = locator,
                        LocatorString = xorString,
                        Level         = value.Parse <StoredValue>().Payload.Parse <int>()
                    };

                    int.TryParse(db.Get($"{xorString}_Count", cf: column), out existing.Count);

                    return(new LocalMd(existing));
                }
            }
        }
Beispiel #12
0
        static string GetString(MdLocator locator)
        {
            var xorString = $"{locator.XORName.Json()}_{locator.TypeTag}";

            return(xorString);
        }
Beispiel #13
0
 public MdFileInfo(string path, MdLocator locator,
                   Func <string, Result <StoredValue> > infoReader, Func <string, StoredValue, Result <Pointer> > infoWriter)
     : base(path, locator, infoReader, infoWriter)
 {
 }
        public static async Task <Result <Directory> > GetOrAddAsync(string directoryPath, MdLocator dirLocator)
        {
            var indexer = await IndexerFactory.GetOrAddAsync(directoryPath);

            if (!indexer.HasValue)
            {
                return(Result.Fail <Directory>(indexer.ErrorCode.Value, indexer.ErrorMsg));
            }

            var dirMd = await MdAccess.LocateAsync(dirLocator).ConfigureAwait(false);

            if (!dirMd.HasValue)
            {
                return(Result.Fail <Directory>(dirMd.ErrorCode.Value, dirMd.ErrorMsg));
            }
            var dirHead   = new MdHead(dirMd.Value, directoryPath);
            var dirResult = await Directory.GetOrAddAsync(dirHead, indexer.Value);

            return(dirResult);
        }
Beispiel #15
0
        async Task UpdateTypeStores(string type, MdLocator location)
        {
            await _typeInfo.UpdateAsync(type, location).ConfigureAwait(false);

            _dataTreeAddresses[type] = location;
        }
Beispiel #16
0
 public Task <Result <IMd> > LocateMdOps(MdLocator location)
 {
     return(MdOps.LocateAsync(location, new NetworkDataOps(Session)));
 }
 public Task <Result <IMdNode> > LocateMdNode(MdLocator location)
 {
     return(MdNode.LocateAsync(location, _dataOps.Session));
 }