diff --git a/.gitignore b/.gitignore index 218cf31..e5f60b6 100644 --- a/.gitignore +++ b/.gitignore @@ -3,43 +3,35 @@ # will have compiled files and executables debug/ target/ - -# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries -# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html Cargo.lock - -# These are backup files generated by rustfmt **/*.rs.bk - -# MSVC Windows builds of rustc generate these, which store debugging information *.pdb # ---> Dart # See https://www.dartlang.org/guides/libraries/private-files # Files and directories created by pub -.dart_tool/ -.packages -build/ +lightcloud_app/dart_tool/ +lightcloud_app/packages +lightcloud_app/build/ # If you're building an application, you may want to check-in your pubspec.lock -pubspec.lock +lightcloud_app/pubspec.lock # Directory created by dartdoc # If you don't generate documentation locally you can remove this line. -doc/api/ +lightcloud_app/doc/api/ # dotenv environment variables file -.env* +lightcloud_app/.env* # Avoid committing generated Javascript files: -*.dart.js -*.info.json # Produced by the --dump-info flag. -*.js # When generated by dart2js. Don't specify *.js if your +lightcloud_app/*.dart.js +lightcloud_app/*.info.json # Produced by the --dump-info flag. +lightcloud_app/*.js # When generated by dart2js. Don't specify *.js if your # project includes source files written in JavaScript. -*.js_ -*.js.deps -*.js.map - -.flutter-plugins -.flutter-plugins-dependencies +lightcloud_app/.js_ +lightcloud_app/*.js.deps +lightcloud_app/*.js.map +lightcloud_app/.flutter-plugins +lightcloud_app/.flutter-plugins-dependencies \ No newline at end of file diff --git a/api/.env.example b/api/.env.example new file mode 100644 index 0000000..34f0aac --- /dev/null +++ b/api/.env.example @@ -0,0 +1,16 @@ +# Database Configuration +DATABASE_URL=postgres://postgres:postgres@localhost:5432/litecloud + +# JWT Authentication & Encryption +JWT_SECRET=your_jwt_secret_key_here_make_it_long_and_random +JWT_EXPIRATION=86400 # in seconds + +# Generate a secure random key with: openssl rand -base64 32 +MASTER_KEY=YourBase64EncodedMasterKeyHere + +STORAGE_PATH=./storage +DEFAULT_USER_QUOTA=5368709120 # 5GB in bytes + +RUST_LOG=info,tower_http=debug +PORT=8080 +HOST=0.0.0.0 \ No newline at end of file diff --git a/instructions.md b/instructions.md deleted file mode 100644 index f94ac85..0000000 --- a/instructions.md +++ /dev/null @@ -1,90 +0,0 @@ -## Project Prompt: Secure File Hosting Platform (Nextcloud-like) - -### Overview - -Build a full-stack web application that mimics the core features of Nextcloud with secure file upload, download, and sharing functionality. The stack should be: - -- **Frontend**: Flutter Web -- **Backend**: Rust (Axum framework) -- **Database**: PostgreSQL -- **Storage**: Encrypted file storage on local disk -- **Deployment**: Docker (two-container setup: web + db) - -### Required Features - -#### Core Features - -- Users can upload and download files -- Files are encrypted at rest using AES-256 (server-side encryption) -- Users can generate public shareable links to download files -- File upload limits per user (configurable) -- Support for shared folders among users (with permissions) -- Serve Flutter web UI and backend API from the same container - -#### Authentication and User Management - -- User registration and login using email + password -- Passwords must be securely hashed using Argon2 or bcrypt -- JWT-based session handling for API authentication -- Role-based permission system: - - Owner, editor, viewer roles for shared folders - - Users can only access files and folders they own or are shared with them - -#### File Handling - -- Store files in `/data` directory, encrypted using a per-file key -- Save metadata and encryption keys in PostgreSQL (keys encrypted with a master key) -- Expose REST endpoints: - - POST `/api/upload` - - GET `/api/download/:id` - - POST `/api/share` - - GET `/api/shared/:token` -- Limit file uploads per user (configurable max size) -- Maintain a file tree (directories, nested folders) - -### Infrastructure - -- Use Docker Compose to define: - - `web`: Rust backend and Flutter frontend in a single container - - `db`: PostgreSQL container -- Only expose one public port (80), used by the web container -- Use Docker volume for persistent file storage (`./data`) - -### Project Structure - -``` -project-root/ -├── docker-compose.yml -├── Dockerfile (multi-stage for Flutter + Rust) -├── backend/ # Rust API -├── frontend/ # Flutter Web app -├── data/ # Mounted volume for encrypted files -``` - -### Libraries and Tools - -- **Rust Backend**: - - - `axum` for HTTP server - - `tokio` for async runtime - - `sqlx` for PostgreSQL - - `jsonwebtoken` for JWT - - `argon2` or `bcrypt` for password hashing - - `aes-gcm` or `ring` for file encryption - - `uuid` for file and share link identifiers - - `dotenvy` to manage environment variables -- **Flutter Frontend**: - - - File upload UI - - Folder navigation - - Login/Register screens - - Share file dialog with permission settings - -### Goals - -Generate: - -- Docker Compose config and Dockerfile -- Flutter web UI skeleton with login/upload functionality -- Rust backend with user authentication, file handling, and share APIs -- PostgreSQL schema with users, files, shares, and permissions diff --git a/lightcloud_app/.gitignore b/lightcloud_app/.gitignore new file mode 100644 index 0000000..29a3a50 --- /dev/null +++ b/lightcloud_app/.gitignore @@ -0,0 +1,43 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/lightcloud_app/.metadata b/lightcloud_app/.metadata new file mode 100644 index 0000000..66109a7 --- /dev/null +++ b/lightcloud_app/.metadata @@ -0,0 +1,36 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "761747bfc538b5af34aa0d3fac380f1bc331ec49" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + - platform: android + create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + - platform: ios + create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + - platform: web + create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/lightcloud_app/README.md b/lightcloud_app/README.md new file mode 100644 index 0000000..c047f43 --- /dev/null +++ b/lightcloud_app/README.md @@ -0,0 +1,16 @@ +# lightcloud + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/lightcloud_app/analysis_options.yaml b/lightcloud_app/analysis_options.yaml new file mode 100644 index 0000000..0d29021 --- /dev/null +++ b/lightcloud_app/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/lightcloud_app/android/.gitignore b/lightcloud_app/android/.gitignore new file mode 100644 index 0000000..6f56801 --- /dev/null +++ b/lightcloud_app/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/lightcloud_app/android/app/build.gradle b/lightcloud_app/android/app/build.gradle new file mode 100644 index 0000000..772c6d8 --- /dev/null +++ b/lightcloud_app/android/app/build.gradle @@ -0,0 +1,58 @@ +plugins { + id "com.android.application" + id "kotlin-android" + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id "dev.flutter.flutter-gradle-plugin" +} + +def localProperties = new Properties() +def localPropertiesFile = rootProject.file("local.properties") +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader("UTF-8") { reader -> + localProperties.load(reader) + } +} + +def flutterVersionCode = localProperties.getProperty("flutter.versionCode") +if (flutterVersionCode == null) { + flutterVersionCode = "1" +} + +def flutterVersionName = localProperties.getProperty("flutter.versionName") +if (flutterVersionName == null) { + flutterVersionName = "1.0" +} + +android { + namespace = "com.lightcloud.lightcloud" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.lightcloud.lightcloud" + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutterVersionCode.toInteger() + versionName = flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.debug + } + } +} + +flutter { + source = "../.." +} diff --git a/lightcloud_app/android/app/src/main/AndroidManifest.xml b/lightcloud_app/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..1ed39b1 --- /dev/null +++ b/lightcloud_app/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/lightcloud_app/android/app/src/main/kotlin/com/lightcloud/lightcloud/MainActivity.kt b/lightcloud_app/android/app/src/main/kotlin/com/lightcloud/lightcloud/MainActivity.kt new file mode 100644 index 0000000..29d09c8 --- /dev/null +++ b/lightcloud_app/android/app/src/main/kotlin/com/lightcloud/lightcloud/MainActivity.kt @@ -0,0 +1,5 @@ +package com.lightcloud.lightcloud + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() diff --git a/lightcloud_app/android/app/src/main/res/drawable-v21/launch_background.xml b/lightcloud_app/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/lightcloud_app/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/lightcloud_app/android/app/src/main/res/drawable/launch_background.xml b/lightcloud_app/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/lightcloud_app/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/lightcloud_app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/lightcloud_app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..db77bb4 Binary files /dev/null and b/lightcloud_app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/lightcloud_app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/lightcloud_app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..17987b7 Binary files /dev/null and b/lightcloud_app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/lightcloud_app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/lightcloud_app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..09d4391 Binary files /dev/null and b/lightcloud_app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/lightcloud_app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/lightcloud_app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..d5f1c8d Binary files /dev/null and b/lightcloud_app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/lightcloud_app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/lightcloud_app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..4d6372e Binary files /dev/null and b/lightcloud_app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/lightcloud_app/android/app/src/main/res/values-night/styles.xml b/lightcloud_app/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..06952be --- /dev/null +++ b/lightcloud_app/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/lightcloud_app/android/app/src/main/res/values/styles.xml b/lightcloud_app/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..cb1ef88 --- /dev/null +++ b/lightcloud_app/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/lightcloud_app/android/app/src/profile/AndroidManifest.xml b/lightcloud_app/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/lightcloud_app/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/lightcloud_app/android/build.gradle b/lightcloud_app/android/build.gradle new file mode 100644 index 0000000..d2ffbff --- /dev/null +++ b/lightcloud_app/android/build.gradle @@ -0,0 +1,18 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = "../build" +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/lightcloud_app/android/gradle.properties b/lightcloud_app/android/gradle.properties new file mode 100644 index 0000000..3b5b324 --- /dev/null +++ b/lightcloud_app/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true +android.enableJetifier=true diff --git a/lightcloud_app/android/gradle/wrapper/gradle-wrapper.properties b/lightcloud_app/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..e1ca574 --- /dev/null +++ b/lightcloud_app/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip diff --git a/lightcloud_app/android/settings.gradle b/lightcloud_app/android/settings.gradle new file mode 100644 index 0000000..536165d --- /dev/null +++ b/lightcloud_app/android/settings.gradle @@ -0,0 +1,25 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.3.0" apply false + id "org.jetbrains.kotlin.android" version "1.7.10" apply false +} + +include ":app" diff --git a/lightcloud_app/lib/main.dart b/lightcloud_app/lib/main.dart new file mode 100644 index 0000000..c6938f8 --- /dev/null +++ b/lightcloud_app/lib/main.dart @@ -0,0 +1,171 @@ +import 'package:flutter/material.dart'; + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Litecloud alpha', + theme: ThemeData( + colorScheme: + ColorScheme.fromSeed(seedColor: Color.fromARGB(255, 72, 4, 117)), + useMaterial3: true, + ), + home: const AuthScreen(), + ); + } +} + +class AuthScreen extends StatefulWidget { + const AuthScreen({super.key}); + + @override + State createState() => _AuthScreenState(); +} + +class _AuthScreenState extends State { + bool _isLogin = true; + + void _toggleAuthMode() { + setState(() { + _isLogin = !_isLogin; + }); + } + + @override + Widget build(BuildContext context) { + final deviceSize = MediaQuery.of(context).size; + + return Scaffold( + body: Container( + width: deviceSize.width, + height: deviceSize.height, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [Colors.purple, Color.fromARGB(255, 72, 4, 117)], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + ), + child: SafeArea( + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const SizedBox(height: 60), + // Logo and tagline + Container( + margin: const EdgeInsets.only(bottom: 40.0), + child: Column( + children: [ + Text( + 'Litecloud', + style: TextStyle( + fontSize: 42, + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.onPrimary, + ), + ), + const SizedBox(height: 8), + Text( + 'Rust based cloud storage', + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.onPrimary, + ), + ), + const SizedBox(height: 8), + Text( + 'Version 0.0.1 pre-alpha', + style: TextStyle( + fontSize: 8, + color: Theme.of(context).colorScheme.onPrimary, + ), + ), + ], + ), + ), + // Auth card + Card( + margin: const EdgeInsets.symmetric(horizontal: 600.0), + elevation: 8.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16.0), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + Text( + _isLogin ? 'Login' : 'Register', + style: Theme.of(context).textTheme.headlineMedium, + ), + const SizedBox(height: 40), + TextFormField( + decoration: const InputDecoration( + labelText: 'Email', + prefixIcon: Icon(Icons.email), + border: OutlineInputBorder(), + ), + keyboardType: TextInputType.emailAddress, + ), + const SizedBox(height: 16), + TextFormField( + decoration: const InputDecoration( + labelText: 'Password', + prefixIcon: Icon(Icons.lock), + border: OutlineInputBorder(), + ), + obscureText: true, + ), + if (!_isLogin) const SizedBox(height: 16), + if (!_isLogin) + TextFormField( + decoration: const InputDecoration( + labelText: 'Confirm Password', + prefixIcon: Icon(Icons.lock), + border: OutlineInputBorder(), + ), + obscureText: true, + ), + const SizedBox(height: 24), + FilledButton( + onPressed: () {}, + style: FilledButton.styleFrom( + minimumSize: const Size(double.infinity, 50), + ), + child: Text( + _isLogin ? 'LOGIN' : 'REGISTER', + style: const TextStyle(fontSize: 16), + ), + ), + const SizedBox(height: 12), + TextButton( + onPressed: _toggleAuthMode, + child: Text( + _isLogin + ? 'Create new account' + : 'I already have an account', + ), + ), + ], + ), + ), + ), + ], + ), + ), + ), + ), + ), + ); + } +} diff --git a/lightcloud_app/pubspec.yaml b/lightcloud_app/pubspec.yaml new file mode 100644 index 0000000..32c5890 --- /dev/null +++ b/lightcloud_app/pubspec.yaml @@ -0,0 +1,90 @@ +name: lightcloud +description: "A new Flutter project." +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# In Windows, build-name is used as the major, minor, and patch parts +# of the product and file versions while build-number is used as the build suffix. +version: 1.0.0+1 + +environment: + sdk: '>=3.4.3 <4.0.0' + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + flutter: + sdk: flutter + + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.6 + +dev_dependencies: + flutter_test: + sdk: flutter + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^3.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages diff --git a/lightcloud_app/test/widget_test.dart b/lightcloud_app/test/widget_test.dart new file mode 100644 index 0000000..c9dc49d --- /dev/null +++ b/lightcloud_app/test/widget_test.dart @@ -0,0 +1,30 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility in the flutter_test package. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:lightcloud/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(const MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/lightcloud_app/web/favicon.png b/lightcloud_app/web/favicon.png new file mode 100644 index 0000000..8aaa46a Binary files /dev/null and b/lightcloud_app/web/favicon.png differ diff --git a/lightcloud_app/web/icons/Icon-192.png b/lightcloud_app/web/icons/Icon-192.png new file mode 100644 index 0000000..b749bfe Binary files /dev/null and b/lightcloud_app/web/icons/Icon-192.png differ diff --git a/lightcloud_app/web/icons/Icon-512.png b/lightcloud_app/web/icons/Icon-512.png new file mode 100644 index 0000000..88cfd48 Binary files /dev/null and b/lightcloud_app/web/icons/Icon-512.png differ diff --git a/lightcloud_app/web/icons/Icon-maskable-192.png b/lightcloud_app/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000..eb9b4d7 Binary files /dev/null and b/lightcloud_app/web/icons/Icon-maskable-192.png differ diff --git a/lightcloud_app/web/icons/Icon-maskable-512.png b/lightcloud_app/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000..d69c566 Binary files /dev/null and b/lightcloud_app/web/icons/Icon-maskable-512.png differ diff --git a/lightcloud_app/web/index.html b/lightcloud_app/web/index.html new file mode 100644 index 0000000..19a9951 --- /dev/null +++ b/lightcloud_app/web/index.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + lightcloud + + + + + + diff --git a/lightcloud_app/web/manifest.json b/lightcloud_app/web/manifest.json new file mode 100644 index 0000000..ca66d16 --- /dev/null +++ b/lightcloud_app/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "lightcloud", + "short_name": "lightcloud", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +}