private static User CreateUser(OAuthProvider provider, object tokenData, string userId) { var userData = provider.GetUserData(tokenData); var parent = LoadOrCreateUserParent(provider.ProviderName); var userContentType = Settings.GetValue(SettingsName, UserTypeSettingName, null, "User"); var userContent = Content.CreateNew(userContentType, parent, userData.Username); if (!userContent.Fields.ContainsKey(provider.IdentifierFieldName)) { var message = $"The {userContent.ContentType.Name} content type does not contain a field named {provider.IdentifierFieldName}. " + $"Please register this field before using the {provider.ProviderName} OAuth provider."; throw new InvalidOperationException(message); } userContent["LoginName"] = userData.Username; userContent[provider.IdentifierFieldName] = userId; userContent["Enabled"] = true; userContent["FullName"] = userData.FullName ?? userData.Username; if (!string.IsNullOrEmpty(userData.Email)) { userContent["Email"] = userData.Email; } // If a user with the same name already exists, this will throw an exception // so that the caller knows that the registration could not be completed. userContent.Save(); return(userContent.ContentHandler as User); }
private static User CreateUser(OAuthProvider provider, object tokenData, string userId) { var userData = provider.GetUserData(tokenData); var parent = LoadOrCreateUserParent(provider.ProviderName); var userContentType = Settings.GetValue(SettingsName, UserTypeSettingName, null, "User"); var userContent = Content.CreateNew(userContentType, parent, userData.Username); if (!userContent.Fields.ContainsKey(provider.IdentifierFieldName)) { var message = $"The {userContent.ContentType.Name} content type does not contain a field named {provider.IdentifierFieldName}. " + $"Please register this field before using the {provider.ProviderName} OAuth provider."; throw new InvalidOperationException(message); } userContent["LoginName"] = userData.Username; userContent[provider.IdentifierFieldName] = userId; userContent["Enabled"] = true; userContent["FullName"] = userData.FullName ?? userData.Username; if (!string.IsNullOrEmpty(userData.Email)) { userContent["Email"] = userData.Email; } MemoryStream imageStream = null; // set user avatar if provided by the oauth provider if (!string.IsNullOrEmpty(userData.AvatarUrl)) { var imageData = DownloadImage(userData.AvatarUrl); if (imageData != null && imageData.Length > 0) { imageStream = new MemoryStream(imageData); var imageName = GetImageName(imageStream); // make sure the stream is set back to its start imageStream.Seek(0, SeekOrigin.Begin); var binaryData = new BinaryData { FileName = imageName }; binaryData.SetStream(imageStream); // clear the reference field to make sure this new image will be used as the avatar userContent["ImageRef"] = null; userContent["ImageData"] = binaryData; } else { SnTrace.Repository.WriteError($"OAuth manager: could not set avatar of user {userData.Username}: empty image."); } } // If a user with the same name already exists, this will throw an exception // so that the caller knows that the registration could not be completed. try { userContent.Save(); } finally { imageStream?.Dispose(); } return(userContent.ContentHandler as User); }